ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2NhcmJvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI3YWEwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9jYXJib24KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgc291cmNlcGF0aD0iSlJFX1NSQyIga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY2FyYm9uIj4KLQkgICAgPGF0dHJpYnV0ZXM+Ci0JCQk8YXR0cmlidXRlIHZhbHVlPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmNhcmJvbiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfZ3RrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEwMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8uY2xhc3NwYXRoX2d0aworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJndGsiPgotCSAgICA8YXR0cmlidXRlcz4KLQkJCTxhdHRyaWJ1dGUgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZ3RrL29zL2xpbnV4L3g4NiIgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfQVRUUl9MSUJSQVJZX1BBVEhfRU5UUlkiLz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfbW90aWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNWZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF9tb3RpZgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHNvdXJjZXBhdGg9IkpSRV9TUkMiIGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im1vdGlmIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnN3dCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jbGFzc3BhdGhfd2luMzIgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4MTU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmNsYXNzcGF0aF93aW4zMgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBzb3VyY2VwYXRoPSJKUkVfU1JDIiBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3aW4zMiI+Ci0JICAgIDxhdHRyaWJ1dGVzPgotCQkJPGF0dHJpYnV0ZSB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC53aW4zMi9vcy93aW4zMi94ODYiIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX0FUVFJfTElCUkFSWV9QQVRIX0VOVFJZIi8+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5zd3QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxMTEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi0uY2xhc3NwYXRoCi13cwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uuc3d0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS5jdnNuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhMzM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOyBzaW5nbGV0b249dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiAkd3MkL29wZW5nbC5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUHJvdmlkZS1QYWNrYWdlOiAKLSAgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYxMmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImFnbF9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiYWdsX3N0YXRzLmgiCi0KLSNkZWZpbmUgQUdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vcGVuZ2xfY2FyYm9uX0FHTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19hZ2xDaG9vc2VQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWFnbENob29zZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsQ2hvb3NlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsQ3JlYXRlQ29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbENyZWF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xDcmVhdGVDb250ZXh0KGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbENyZWF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fYWdsRGVzY3JpYmVQaXhlbEZvcm1hdAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQyk7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXNjcmliZVBpeGVsRm9ybWF0KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsRGVzY3JpYmVQaXhlbEZvcm1hdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xEZXN0cm95Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xEZXN0cm95Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xEZXN0cm95UGl4ZWxGb3JtYXQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgQUdMX05BVElWRShhZ2xEZXN0cm95UGl4ZWxGb3JtYXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXRfRlVOQyk7Ci0JYWdsRGVzdHJveVBpeGVsRm9ybWF0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbEVuYWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xFbmFibGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xFbmFibGVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pYWdsRW5hYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbEVuYWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JamludCByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJjID0gKGppbnQpYWdsR2V0Q3VycmVudENvbnRleHQoKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xHZXREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbEdldERyYXdhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsR2V0RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClhZ2xHZXREcmF3YWJsZShhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xHZXREcmF3YWJsZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRDdXJyZW50Q29udGV4dAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRDdXJyZW50Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRDdXJyZW50Q29udGV4dChhcmcwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXREcmF3YWJsZQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWFnbFNldERyYXdhYmxlKGFyZzAsIGFyZzEpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldERyYXdhYmxlX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2FnbFNldEludGVnZXJfX0lJSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqYm9vbGVhbiByYyA9IDA7Ci0JQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xTZXRJbnRlZ2VyKGFyZzAsIGFyZzEsIGFyZzIpOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFNldEludGVnZXJfX0lJSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTZXRJbnRlZ2VyX19JSV8zSQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgQUdMX05BVElWRShhZ2xTZXRJbnRlZ2VyX19JSV8zSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUFHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGpib29sZWFuKWFnbFNldEludGVnZXIoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzIgJiYgbHBhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBhZ2xTZXRJbnRlZ2VyX19JSV8zSV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xTd2FwQnVmZmVycwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci0JYWdsU3dhcEJ1ZmZlcnMoYXJnMCk7Ci0JQUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgYWdsU3dhcEJ1ZmZlcnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19hZ2xVcGRhdGVDb250ZXh0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBBR0xfTkFUSVZFKGFnbFVwZGF0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjID0gMDsKLQlBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgYWdsVXBkYXRlQ29udGV4dF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilhZ2xVcGRhdGVDb250ZXh0KGFyZzApOwotCUFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGFnbFVwZGF0ZUNvbnRleHRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4N2Q0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjAxNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJhZ2xfc3RhdHMuaCIKLQotI2lmZGVmIE5BVElWRV9TVEFUUwotCi1pbnQgQUdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAxNDsKLWludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMTRdOwotY2hhciAqIEFHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImFnbENob29zZVBpeGVsRm9ybWF0IiwKLQkiYWdsQ3JlYXRlQ29udGV4dCIsCi0JImFnbERlc2NyaWJlUGl4ZWxGb3JtYXQiLAotCSJhZ2xEZXN0cm95Q29udGV4dCIsCi0JImFnbERlc3Ryb3lQaXhlbEZvcm1hdCIsCi0JImFnbEVuYWJsZSIsCi0JImFnbEdldEN1cnJlbnRDb250ZXh0IiwKLQkiYWdsR2V0RHJhd2FibGUiLAotCSJhZ2xTZXRDdXJyZW50Q29udGV4dCIsCi0JImFnbFNldERyYXdhYmxlIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlJIiwKLQkiYWdsU2V0SW50ZWdlcl9fSUlfM0kiLAotCSJhZ2xTd2FwQnVmZmVycyIsCi0JImFnbFVwZGF0ZUNvbnRleHQiLAotfTsKLQotI2RlZmluZSBTVEFUU19OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3RfdG9vbHNfaW50ZXJuYWxfTmF0aXZlU3RhdHNfIyNmdW5jCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEFHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBBR0xfbmF0aXZlRnVuY3Rpb25Db3VudDsKLX0KLQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBTVEFUU19OQVRJVkUoQUdMXzFHZXRGdW5jdGlvbk5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShBR0xfMUdldEZ1bmN0aW9uQ2FsbENvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuIEFHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtpbmRleF07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdGF0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM1OWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vbGlicmFyeS9hZ2xfc3RhdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEFHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBBR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBBR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBBR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgQUdMX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEFHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgQUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBBR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWFnbENob29zZVBpeGVsRm9ybWF0X0ZVTkMsCi0JYWdsQ3JlYXRlQ29udGV4dF9GVU5DLAotCWFnbERlc2NyaWJlUGl4ZWxGb3JtYXRfRlVOQywKLQlhZ2xEZXN0cm95Q29udGV4dF9GVU5DLAotCWFnbERlc3Ryb3lQaXhlbEZvcm1hdF9GVU5DLAotCWFnbEVuYWJsZV9GVU5DLAotCWFnbEdldEN1cnJlbnRDb250ZXh0X0ZVTkMsCi0JYWdsR2V0RHJhd2FibGVfRlVOQywKLQlhZ2xTZXRDdXJyZW50Q29udGV4dF9GVU5DLAotCWFnbFNldERyYXdhYmxlX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlJX0ZVTkMsCi0JYWdsU2V0SW50ZWdlcl9fSUlfM0lfRlVOQywKLQlhZ2xTd2FwQnVmZmVyc19GVU5DLAotCWFnbFVwZGF0ZUNvbnRleHRfRlVOQywKLX0gQUdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9saWJyYXJ5L2FnbF9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MzFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL2xpYnJhcnkvYWdsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYWdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvY2FyYm9uL0FHTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEzMzllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9jYXJib24vQUdMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5jYXJib247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBBR0wgewotCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLS8qIEF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9OT05FID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfU0laRSA9IDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfTEVWRUwgPSAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX1JHQkEgPSA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0RPVUJMRUJVRkZFUiA9IDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFUkVPID0gNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BVVhfQlVGRkVSUyA9IDc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfUkVEX1NJWkUgPSA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0dSRUVOX1NJWkUgPSA5OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0JMVUVfU0laRSA9IDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdMX0FMUEhBX1NJWkUgPSAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9ERVBUSF9TSVpFID0gMTI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1RFTkNJTF9TSVpFID0gMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fUkVEX1NJWkUgPSAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9BQ0NVTV9HUkVFTl9TSVpFID0gMTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQkxVRV9TSVpFID0gMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQUNDVU1fQUxQSEFfU0laRSA9IDE3OwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFX0JVRkZFUlNfQVJCID0gNTU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU0FNUExFU19BUkIgPSA1NjsKLQotLyogSW50ZWdlciBwYXJhbWV0ZXJzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfQlVGRkVSX1JFQ1QgPSAyMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0xfU1dBUF9JTlRFUlZBTCA9IDIyMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9CVUZGRVJfTkFNRSA9IDIzMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHTF9DTElQX1JFR0lPTiA9IDI1NDsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENob29zZVBpeGVsRm9ybWF0KGludCBnZGV2cywgaW50IG5kZXYsIGludFtdIGF0dHJpYnMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbENyZWF0ZUNvbnRleHQoaW50IHBpeCwgaW50IHNoYXJlKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gYWdsRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgcGl4LCBpbnQgYXR0cmliLCBpbnRbXSB2YWx1ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbERlc3Ryb3lDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBhZ2xEZXN0cm95UGl4ZWxGb3JtYXQoaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbEVuYWJsZShpbnQgY3R4LCBpbnQgcG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGFnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgYWdsR2V0RHJhd2FibGUoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEN1cnJlbnRDb250ZXh0KGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXREcmF3YWJsZShpbnQgY3R4LCBpbnQgZHJhdyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFNldEludGVnZXIoaW50IGN0eCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBhZ2xTZXRJbnRlZ2VyKGludCBjdHgsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgYWdsU3dhcEJ1ZmZlcnMoaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGFnbFVwZGF0ZUNvbnRleHQoaW50IGN0eCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWJmYzc3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuY2FyYm9uLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7CQotCWludCBjb250ZXh0OwotCWludCBwaXhlbEZvcm1hdDsKLQlzdGF0aWMgZmluYWwgaW50IE1BWF9BVFRSSUJVVEVTID0gMzI7Ci0KLS8qKgotICogQ3JlYXRlIGEgR0xDYW52YXMgd2lkZ2V0IHVzaW5nIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJlZCBpbiB0aGUgR0xEYXRhCi0gKiBvYmplY3QgcHJvdmlkZWQuCi0gKgotICogQHBhcmFtIHBhcmVudCBhIGNvbXBvc2l0ZSB3aWRnZXQKLSAqIEBwYXJhbSBzdHlsZSB0aGUgYml0d2lzZSBPUidpbmcgb2Ygd2lkZ2V0IHN0eWxlcwotICogQHBhcmFtIGRhdGEgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIG9mIHRoZSBHTENhbnZhcwotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX05VTExfQVJHVU1FTlQgd2hlbiB0aGUgZGF0YSBpcyBudWxsCi0gKiAgICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIHdoZW4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBwcm92aWRlZDwvdWw+IAotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24KLSAqIDx1bD48bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIHdoZW4gY2FsbGVkIGZyb20gdGhlIHdyb25nIHRocmVhZAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfQ1JFQVRFX09CSkVDVCB3aGVuIGZhaWxlZCB0byBjcmVhdGUgT0xFIE9iamVjdAotICogICAgIDxsaT5FUlJPUl9DQU5OT1RfT1BFTl9GSUxFIHdoZW4gZmFpbGVkIHRvIG9wZW4gZmlsZQotICogICAgIDxsaT5FUlJPUl9JTlRFUkZBQ0VfTk9UX0ZPVU5EIHdoZW4gdW5hYmxlIHRvIGNyZWF0ZSBjYWxsYmFja3MgZm9yIE9MRSBJbnRlcmZhY2VzCi0gKiAgICAgPGxpPkVSUk9SX0lOVkFMSURfQ0xBU1NJRAotICogPC91bD4KLSAqLwotcHVibGljIEdMQ2FudmFzIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIEdMRGF0YSBkYXRhKSB7Ci0Jc3VwZXIgKHBhcmVudCwgc3R5bGUpOwotCWlmIChkYXRhID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWludCBhZ2xBdHRyaWIgW10gPSBuZXcgaW50IFtNQVhfQVRUUklCVVRFU107Ci0JaW50IHBvcyA9IDA7Ci0JYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1JHQkE7Ci0JaWYgKGRhdGEuZG91YmxlQnVmZmVyKSBhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfRE9VQkxFQlVGRkVSOwotCWlmIChkYXRhLnN0ZXJlbykgYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURVJFTzsKLQlpZiAoZGF0YS5yZWRTaXplID4gMCkgewotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IEFHTC5BR0xfUkVEX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5yZWRTaXplOwotCX0KLQlpZiAoZGF0YS5ncmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZ3JlZW5TaXplOwotCX0KLQlpZiAoZGF0YS5ibHVlU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0JMVUVfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hbHBoYVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BTFBIQV9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5kZXB0aFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9ERVBUSF9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuZGVwdGhTaXplOwotCX0KLQlpZiAoZGF0YS5zdGVuY2lsU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NURU5DSUxfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnN0ZW5jaWxTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bVJlZFNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9SRURfU0laRTsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtUmVkU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1HcmVlblNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9HUkVFTl9TSVpFOwotCQlhZ2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1HcmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQmx1ZVNpemUgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUJsdWVTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUFscGhhU2l6ZSA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkU7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUFscGhhU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuc2FtcGxlQnVmZmVycyA+IDApIHsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBBR0wuQUdMX1NBTVBMRV9CVUZGRVJTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0JfQotCWlmIChkYXRhLnNhbXBsZXMgPiAwKSB7Ci0JCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9TQU1QTEVTX0FSQjsKLQkJYWdsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWFnbEF0dHJpYiBbcG9zKytdID0gQUdMLkFHTF9OT05FOwotCXBpeGVsRm9ybWF0ID0gQUdMLmFnbENob29zZVBpeGVsRm9ybWF0ICgwLCAwLCBhZ2xBdHRyaWIpOwotLy8JY29udGV4dCA9IEFHTC5hZ2xDcmVhdGVDb250ZXh0IChwaXhlbEZvcm1hdCwgc2hhcmUgPT0gbnVsbCA/IDAgOiBzaGFyZS5jb250ZXh0KTsKLQljb250ZXh0ID0gQUdMLmFnbENyZWF0ZUNvbnRleHQgKHBpeGVsRm9ybWF0LCAwKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlBR0wuYWdsU2V0RHJhd2FibGUgKGNvbnRleHQsIHBvcnQpOwotCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQlBR0wuYWdsRGVzdHJveUNvbnRleHQgKGNvbnRleHQpOwotCQkJCUFHTC5hZ2xEZXN0cm95UGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULlJlc2l6ZToKLQkJCWNhc2UgU1dULkhpZGU6Ci0JCQljYXNlIFNXVC5TaG93OgotCQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXhCb3VuZHMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlhZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlNob3csIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuSGlkZSwgbGlzdGVuZXIpOwotCUNvbnRyb2wgYyA9IHRoaXM7Ci0JZG8gewotCQljLmFkZExpc3RlbmVyKFNXVC5TaG93LCBsaXN0ZW5lcik7Ci0JCWMuYWRkTGlzdGVuZXIoU1dULkhpZGUsIGxpc3RlbmVyKTsKLQkJYyA9IGMuZ2V0UGFyZW50KCk7Ci0JfSB3aGlsZSAoYyAhPSBzaGVsbCk7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLXZvaWQgZml4Qm91bmRzICgpIHsKLQlHQ0RhdGEgZGF0YSA9IG5ldyBHQ0RhdGEgKCk7Ci0JaW50IGdjID0gaW50ZXJuYWxfbmV3X0dDIChkYXRhKTsKLQlSZWN0IGJvdW5kcyA9IG5ldyBSZWN0ICgpOwotCU9TLkdldFJlZ2lvbkJvdW5kcyAoZGF0YS52aXNpYmxlUmduLCBib3VuZHMpOwotCWludCB3aWR0aCA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0OwotCWludCBoZWlnaHQgPSBib3VuZHMuYm90dG9tIC0gYm91bmRzLnRvcDsKLQlSZWN0IHJlY3QgPSBuZXcgUmVjdCAoKTsKLQlpbnQgd2luZG93ID0gT1MuR2V0Q29udHJvbE93bmVyIChoYW5kbGUpOwotCWludCBwb3J0ID0gT1MuR2V0V2luZG93UG9ydCAod2luZG93KTsKLQlPUy5HZXRQb3J0Qm91bmRzIChwb3J0LCByZWN0KTsKLQlpbnQgW10gZ2xib3VuZHMgPSBuZXcgaW50IFs0XTsKLQlnbGJvdW5kc1swXSA9IGJvdW5kcy5sZWZ0OwotCWdsYm91bmRzWzFdID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCAtIGJvdW5kcy50b3AgLSBoZWlnaHQ7Ci0JZ2xib3VuZHNbMl0gPSB3aWR0aDsKLQlnbGJvdW5kc1szXSA9IGhlaWdodDsKLQlBR0wuYWdsU2V0SW50ZWdlciAoY29udGV4dCwgQUdMLkFHTF9CVUZGRVJfUkVDVCwgZ2xib3VuZHMpOwotCUFHTC5hZ2xFbmFibGUgKGNvbnRleHQsIEFHTC5BR0xfQlVGRkVSX1JFQ1QpOwotCUFHTC5hZ2xTZXRJbnRlZ2VyIChjb250ZXh0LCBBR0wuQUdMX0NMSVBfUkVHSU9OLCBkYXRhLnZpc2libGVSZ24pOwotCUFHTC5hZ2xVcGRhdGVDb250ZXh0IChjb250ZXh0KTsKLQlpbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlBR0wuYWdsRGVzY3JpYmVQaXhlbEZvcm1hdCAocGl4ZWxGb3JtYXQsIEFHTC5BR0xfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUFHTC5hZ2xEZXNjcmliZVBpeGVsRm9ybWF0IChwaXhlbEZvcm1hdCwgQUdMLkFHTF9TQU1QTEVfQlVGRkVSU19BUkIsIHZhbHVlKTsKLQlkYXRhLnNhbXBsZUJ1ZmZlcnMgPSB2YWx1ZSBbMF07Ci0JQUdMLmFnbERlc2NyaWJlUGl4ZWxGb3JtYXQgKHBpeGVsRm9ybWF0LCBBR0wuQUdMX1NBTVBMRVNfQVJCLCB2YWx1ZSk7Ci0JZGF0YS5zYW1wbGVzID0gdmFsdWUgWzBdOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVjZWl2ZXIncyBPcGVuR0wgY29udGV4dAotICogaXMgdGhlIGN1cnJlbnQgY29udGV4dC4KLSAqICAKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjZWl2ZXIgaG9sZHMgdGhlIGN1cnJlbnQgT3BlbkdMIGNvbnRleHQsCi0gKiBmYWxzZSBvdGhlcndpc2UKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNDdXJyZW50ICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlyZXR1cm4gQUdMLmFnbEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQ7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKEFHTC5hZ2xHZXRDdXJyZW50Q29udGV4dCAoKSAhPSBjb250ZXh0KSB7Ci0JCUFHTC5hZ2xTZXRDdXJyZW50Q29udGV4dCAoY29udGV4dCk7Ci0JfQotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlBR0wuYWdsU3dhcEJ1ZmZlcnMgKGNvbnRleHQpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNWU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MjcgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbF9zdGF0cy5oIgotCi0jZGVmaW5lIEdMX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTF8jI2Z1bmMKLQotI2lmbmRlZiBOT19nbEFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFjY3VtKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLQlnbEFjY3VtKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQWxwaGFGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEFscGhhRnVuYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQWxwaGFGdW5jX0ZVTkMpOwotCWdsQWxwaGFGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xBbHBoYUZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEFyZVRleHR1cmVzUmVzaWRlbnQKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbEFyZVRleHR1cmVzUmVzaWRlbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamJvb2xlYW5BcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWpib29sZWFuICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JcmMgPSAoamJvb2xlYW4pZ2xBcmVUZXh0dXJlc1Jlc2lkZW50KGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEFyZVRleHR1cmVzUmVzaWRlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xBcnJheUVsZW1lbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQXJyYXlFbGVtZW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEFycmF5RWxlbWVudF9GVU5DKTsKLQlnbEFycmF5RWxlbWVudChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQXJyYXlFbGVtZW50X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCZWdpbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xCZWdpbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLQlnbEJlZ2luKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCZWdpbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQmluZFRleHR1cmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmluZFRleHR1cmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLQlnbEJpbmRUZXh0dXJlKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCaW5kVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQml0bWFwCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEJpdG1hcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGpieXRlQXJyYXkgYXJnNikKLXsKLQlqYnl0ZSAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xCaXRtYXBfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbEJpdG1hcChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCAoY29uc3QgR0x1Ynl0ZSAqKWxwYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQml0bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xCbGVuZEZ1bmMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQmxlbmRGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQmxlbmRGdW5jX0ZVTkMpOwotCWdsQmxlbmRGdW5jKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xCbGVuZEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENhbGxMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotCWdsQ2FsbExpc3QoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNCCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpieXRlQXJyYXkgYXJnMikKLXsKLQlqYnl0ZSAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNDCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpjaGFyQXJyYXkgYXJnMikKLXsKLQlqY2hhciAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0Q2hhckFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDYWxsTGlzdHNfX0lJXzNJCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENhbGxMaXN0c19fSUlfM0kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2FsbExpc3RzX19JSV8zSV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xDYWxsTGlzdHMoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENhbGxMaXN0c19fSUlfM0lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotCWdsQ2xlYXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDbGVhckFjY3VtCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENsZWFyQWNjdW0pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckFjY3VtX0ZVTkMpOwotCWdsQ2xlYXJBY2N1bShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJBY2N1bV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJDb2xvcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckNvbG9yKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJDb2xvcl9GVU5DKTsKLQlnbENsZWFyQ29sb3IoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFyQ29sb3JfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyRGVwdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ2xlYXJEZXB0aCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDbGVhckRlcHRoX0ZVTkMpOwotCWdsQ2xlYXJEZXB0aChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ2xlYXJEZXB0aF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ2xlYXJJbmRleAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhckluZGV4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJJbmRleF9GVU5DKTsKLQlnbENsZWFySW5kZXgoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsZWFySW5kZXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsZWFyU3RlbmNpbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGVhclN0ZW5jaWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ2xlYXJTdGVuY2lsX0ZVTkMpOwotCWdsQ2xlYXJTdGVuY2lsKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDbGVhclN0ZW5jaWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENsaXBQbGFuZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDbGlwUGxhbmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xDbGlwUGxhbmUoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENsaXBQbGFuZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNiKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNiX0ZVTkMpOwotCWdsQ29sb3IzYihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzYnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM2J2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2RfRlVOQyk7Ci0JZ2xDb2xvcjNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjNkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM2R2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNmX0ZVTkMpOwotCWdsQ29sb3IzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpX0ZVTkMpOwotCWdsQ29sb3IzaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3IzaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3Izc19GVU5DKTsKLQlnbENvbG9yM3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3N2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3Izc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3Izc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yM3ViCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3ViKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlIGFyZzAsIGpieXRlIGFyZzEsIGpieXRlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLQlnbENvbG9yM3ViKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1Yl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yM3VidikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZUFycmF5IGFyZzApCi17Ci0JamJ5dGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWJ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjN1YnYoKGNvbnN0IEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdWkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotCWdsQ29sb3IzdWkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3IzdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3Vpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3IzdXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotCWdsQ29sb3IzdXMoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yM3VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjN1c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3IzdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yM3Vzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yM3VzdigoY29uc3QgR0x1c2hvcnQgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjN1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Yl9GVU5DKTsKLQlnbENvbG9yNGIoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0YnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGRfRlVOQyk7Ci0JZ2xDb2xvcjRkKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0Zl9GVU5DKTsKLQlnbENvbG9yNGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsQ29sb3I0ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpX0ZVTkMpOwotCWdsQ29sb3I0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjRpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHNfRlVOQyk7Ci0JZ2xDb2xvcjRzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1YgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYnl0ZSBhcmcwLCBqYnl0ZSBhcmcxLCBqYnl0ZSBhcmcyLCBqYnl0ZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci0JZ2xDb2xvcjR1YihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVidgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvcjR1YnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVidl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCWdsQ29sb3I0dWJ2KChjb25zdCBHTHVieXRlICopbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1YnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yNHVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotCWdsQ29sb3I0dWkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvcjR1aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3I0dWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbENvbG9yNHVpdigoY29uc3QgR0x1aW50ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yNHVpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3I0dXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMiwganNob3J0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLQlnbENvbG9yNHVzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvcjR1c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3I0dXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbENvbG9yNHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvcjR1c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xDb2xvcjR1c3YoKGNvbnN0IEdMdXNob3J0ICopbHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsQ29sb3I0dXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb2xvck1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29sb3JNYXNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpib29sZWFuIGFyZzAsIGpib29sZWFuIGFyZzEsIGpib29sZWFuIGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvck1hc2tfRlVOQyk7Ci0JZ2xDb2xvck1hc2soYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29sb3JNYXRlcmlhbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvck1hdGVyaWFsKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsQ29sb3JNYXRlcmlhbF9GVU5DKTsKLQlnbENvbG9yTWF0ZXJpYWwoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvbG9yTWF0ZXJpYWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvbG9yUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb2xvclBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsQ29sb3JQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb2xvclBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbENvcHlQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVBpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlQaXhlbHNfRlVOQyk7Ci0JZ2xDb3B5UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4SW1hZ2UxRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleEltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLQlnbENvcHlUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDb3B5VGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsQ29weVRleFN1YkltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsQ29weVRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDb3B5VGV4U3ViSW1hZ2UyRAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotCWdsQ29weVRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbENvcHlUZXhTdWJJbWFnZTJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xDdWxsRmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xDdWxsRmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLQlnbEN1bGxGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xDdWxsRmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlTGlzdHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLQlnbERlbGV0ZUxpc3RzKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZWxldGVMaXN0c19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGVsZXRlVGV4dHVyZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGVsZXRlVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlbGV0ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbERlbGV0ZVRleHR1cmVzKGFyZzAsIChjb25zdCBHTHVpbnQgKilscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVsZXRlVGV4dHVyZXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoRnVuYwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aEZ1bmMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRGVwdGhGdW5jX0ZVTkMpOwotCWdsRGVwdGhGdW5jKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEZXB0aEZ1bmNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERlcHRoTWFzawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEZXB0aE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW4gYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERlcHRoTWFza19GVU5DKTsKLQlnbERlcHRoTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhNYXNrX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEZXB0aFJhbmdlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERlcHRoUmFuZ2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEZXB0aFJhbmdlX0ZVTkMpOwotCWdsRGVwdGhSYW5nZShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGVwdGhSYW5nZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRGlzYWJsZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEaXNhYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVfRlVOQyk7Ci0JZ2xEaXNhYmxlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEaXNhYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEaXNhYmxlQ2xpZW50U3RhdGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRGlzYWJsZUNsaWVudFN0YXRlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbERpc2FibGVDbGllbnRTdGF0ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRGlzYWJsZUNsaWVudFN0YXRlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QXJyYXlzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdBcnJheXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbERyYXdBcnJheXNfRlVOQyk7Ci0JZ2xEcmF3QXJyYXlzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3QXJyYXlzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xEcmF3QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbERyYXdCdWZmZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd0J1ZmZlcl9GVU5DKTsKLQlnbERyYXdCdWZmZXIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbERyYXdCdWZmZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdFbGVtZW50cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xEcmF3RWxlbWVudHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsRHJhd0VsZW1lbnRzKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3RWxlbWVudHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbERyYXdQaXhlbHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRHJhd1BpeGVscykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRHJhd1BpeGVsc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2xEcmF3UGl4ZWxzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xEcmF3UGl4ZWxzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFZGdlRmxhZwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqYm9vbGVhbiBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci0JZ2xFZGdlRmxhZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWdfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFnUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ1BvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqYm9vbGVhbkFycmF5IGFyZzEpCi17Ci0JamJvb2xlYW4gKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRWRnZUZsYWdQb2ludGVyX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0Qm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xFZGdlRmxhZ1BvaW50ZXIoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFZGdlRmxhZ1BvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEVkZ2VGbGFndgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFZGdlRmxhZ3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJvb2xlYW5BcnJheSBhcmcwKQotewotCWpib29sZWFuICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVkZ2VGbGFndl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsRWRnZUZsYWd2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQm9vbGVhbkFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRWRnZUZsYWd2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRW5hYmxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEVuYWJsZV9GVU5DKTsKLQlnbEVuYWJsZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRW5hYmxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFbmFibGVDbGllbnRTdGF0ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmFibGVDbGllbnRTdGF0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLQlnbEVuYWJsZUNsaWVudFN0YXRlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmFibGVDbGllbnRTdGF0ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEVuZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRW5kX0ZVTkMpOwotCWdsRW5kKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEVuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRW5kTGlzdAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFbmRMaXN0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotCWdsRW5kTGlzdCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFbmRMaXN0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQxZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLQlnbEV2YWxDb29yZDFkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDFkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLQlnbEV2YWxDb29yZDFmKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMWZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDFmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQxZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMWZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotCWdsRXZhbENvb3JkMmQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbENvb3JkMmR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEV2YWxDb29yZDJkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsQ29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xFdmFsQ29vcmQyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLQlnbEV2YWxDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbENvb3JkMmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsQ29vcmQyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xFdmFsQ29vcmQyZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsTWVzaDEKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbE1lc2gxKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xFdmFsTWVzaDFfRlVOQyk7Ci0JZ2xFdmFsTWVzaDEoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxNZXNoMV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRXZhbE1lc2gyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxNZXNoMikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxNZXNoMl9GVU5DKTsKLQlnbEV2YWxNZXNoMihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRXZhbE1lc2gyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xFdmFsUG9pbnQxCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEV2YWxQb2ludDEpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRXZhbFBvaW50MV9GVU5DKTsKLQlnbEV2YWxQb2ludDEoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEV2YWxQb2ludDFfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEV2YWxQb2ludDIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRXZhbFBvaW50MikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEV2YWxQb2ludDJfRlVOQyk7Ci0JZ2xFdmFsUG9pbnQyKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xFdmFsUG9pbnQyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xGZWVkYmFja0J1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGZWVkYmFja0J1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmVlZGJhY2tCdWZmZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xGZWVkYmFja0J1ZmZlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGZWVkYmFja0J1ZmZlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmluaXNoCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZpbmlzaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRmluaXNoX0ZVTkMpOwotCWdsRmluaXNoKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZpbmlzaF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRmx1c2gKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRmx1c2gpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEZsdXNoX0ZVTkMpOwotCWdsRmx1c2goKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRmx1c2hfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRm9nZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZl9GVU5DKTsKLQlnbEZvZ2YoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9nZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGb2dmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsRm9naQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGb2dpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRm9naV9GVU5DKTsKLQlnbEZvZ2koYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZvZ2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZvZ2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEZvZ2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xGb2dpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xGb2dpdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsRm9naXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZyb250RmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xGcm9udEZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJvbnRGYWNlX0ZVTkMpOwotCWdsRnJvbnRGYWNlKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xGcm9udEZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEZydXN0dW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsRnJ1c3R1bSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGpkb3VibGUgYXJnNCwgamRvdWJsZSBhcmc1KQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsRnJ1c3R1bV9GVU5DKTsKLQlnbEZydXN0dW0oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEZydXN0dW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlbkxpc3RzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMX05BVElWRShnbEdlbkxpc3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2VuTGlzdHNfRlVOQyk7Ci0JcmMgPSAoamludClnbEdlbkxpc3RzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZW5MaXN0c19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdlblRleHR1cmVzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdlblRleHR1cmVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZW5UZXh0dXJlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZW5UZXh0dXJlcyhhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdlblRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRCb29sZWFudgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRCb29sZWFudikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpib29sZWFuQXJyYXkgYXJnMSkKLXsKLQlqYm9vbGVhbiAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEJvb2xlYW5BcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0Qm9vbGVhbnYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRCb29sZWFudl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0Q2xpcFBsYW5lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldENsaXBQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxKQotewotCWpkb3VibGUgKmxwYXJnMT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldENsaXBQbGFuZShhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0Q2xpcFBsYW5lX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXREb3VibGV2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldERvdWJsZXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldERvdWJsZXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0RG91YmxldihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0RG91Ymxldl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RXJyb3IKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0RXJyb3IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0RXJyb3JfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldEVycm9yKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldEVycm9yX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0RmxvYXR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEZsb2F0dikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldEZsb2F0dl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbEdldEZsb2F0dihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRGbG9hdHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldEludGVnZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldEludGVnZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRJbnRlZ2Vydl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRJbnRlZ2VydihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0SW50ZWdlcnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldExpZ2h0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TGlnaHRmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldExpZ2h0ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0TGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXBmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXBmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRNYXBmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0TWFwaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWFwaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0TWFwaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0TWFwaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hcGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldE1hdGVyaWFsaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0TWF0ZXJpYWxpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRNYXRlcmlhbGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldE1hdGVyaWFsaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldE1hdGVyaWFsaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UGl4ZWxNYXBmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcGZ2KGFyZzAsIGxwYXJnMSk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQaXhlbE1hcHVpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQaXhlbE1hcHVpdihhcmcwLCAoR0x1aW50ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdWl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRQaXhlbE1hcHVzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRQaXhlbE1hcHVzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpzaG9ydEFycmF5IGFyZzEpCi17Ci0JanNob3J0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBpeGVsTWFwdXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsR2V0UGl4ZWxNYXB1c3YoYXJnMCwgKEdMdXNob3J0ICopbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UGl4ZWxNYXB1c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFBvaW50ZXJ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFBvaW50ZXJ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JZ2xHZXRQb2ludGVydihhcmcwLCAoR0x2b2lkICoqKWxwYXJnMSk7Ci0JaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRQb2ludGVydl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0UG9seWdvblN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0UG9seWdvblN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGVBcnJheSBhcmcwKQotewotCWpieXRlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xHZXRQb2x5Z29uU3RpcHBsZSgoR0x1Ynl0ZSAqKWxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0UG9seWdvblN0aXBwbGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xHZXRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbEdldFN0cmluZyhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEdldFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEdldFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbEdldFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhHZW5mdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhHZW5mdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhHZW5mdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhHZW5mdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4R2VuaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4R2VuaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4R2VuaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4R2VuaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEdlbml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhJbWFnZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhJbWFnZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4SW1hZ2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4SW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgbHBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleEltYWdlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEdldFRleExldmVsUGFyYW1ldGVyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamZsb2F0QXJyYXkgYXJnMykKLXsKLQlqZmxvYXQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCX0KLQlnbEdldFRleExldmVsUGFyYW1ldGVyZnYoYXJnMCwgYXJnMSwgYXJnMiwgbHBhcmczKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnRBcnJheSBhcmczKQotewotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xHZXRUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xHZXRUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xHZXRUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsR2V0VGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsR2V0VGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsR2V0VGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsR2V0VGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xIaW50Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEhpbnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xIaW50X0ZVTkMpOwotCWdsSGludChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSGludF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhNYXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4TWFzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleE1hc2tfRlVOQyk7Ci0JZ2xJbmRleE1hc2soYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4TWFza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhQb2ludGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsSW5kZXhQb2ludGVyKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhkX0ZVTkMpOwotCWdsSW5kZXhkKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbEluZGV4Zl9GVU5DKTsKLQlnbEluZGV4ZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbEluZGV4ZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5kZXhmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbEluZGV4aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleGlfRlVOQyk7Ci0JZ2xJbmRleGkoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbEluZGV4aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSW5kZXhpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbmRleGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xJbmRleGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbmRleHMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSW5kZXhzX0ZVTkMpOwotCWdsSW5kZXhzKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbEluZGV4c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5kZXhzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsSW5kZXhzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJbmRleHN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbml0TmFtZXMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsSW5pdE5hbWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbml0TmFtZXNfRlVOQyk7Ci0JZ2xJbml0TmFtZXMoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW5pdE5hbWVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJbnRlcmxlYXZlZEFycmF5cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJbnRlcmxlYXZlZEFycmF5cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJbnRlcmxlYXZlZEFycmF5c19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xJbnRlcmxlYXZlZEFycmF5cyhhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSW50ZXJsZWF2ZWRBcnJheXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbElzRW5hYmxlZAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xfTkFUSVZFKGdsSXNFbmFibGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqYm9vbGVhbiByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbElzRW5hYmxlZF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbElzRW5hYmxlZChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsSXNFbmFibGVkX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsSXNMaXN0Ci1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBHTF9OQVRJVkUoZ2xJc0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWpib29sZWFuIHJjOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsSXNMaXN0X0ZVTkMpOwotCXJjID0gKGpib29sZWFuKWdsSXNMaXN0KGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xJc0xpc3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xJc1RleHR1cmUKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMX05BVElWRShnbElzVGV4dHVyZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamJvb2xlYW4gcmM7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xJc1RleHR1cmVfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xJc1RleHR1cmUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbElzVGV4dHVyZV9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLQlnbExpZ2h0TW9kZWxmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRNb2RlbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdEFycmF5IGFyZzEpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCX0KLQlnbExpZ2h0TW9kZWxmdihhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodE1vZGVsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0TW9kZWxpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci0JZ2xMaWdodE1vZGVsaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRNb2RlbGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpZ2h0TW9kZWxpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodE1vZGVsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xMaWdodE1vZGVsaXYoYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0TW9kZWxpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpZ2h0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZfRlVOQyk7Ci0JZ2xMaWdodGYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaWdodGZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaWdodGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGlnaHRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMaWdodGlfRlVOQyk7Ci0JZ2xMaWdodGkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpZ2h0aV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGlnaHRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMaWdodGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpZ2h0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTGlnaHRpdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTGlnaHRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTGluZVN0aXBwbGUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVN0aXBwbGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotCWdsTGluZVN0aXBwbGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpbmVTdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMaW5lV2lkdGgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTGluZVdpZHRoKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTGluZVdpZHRoX0ZVTkMpOwotCWdsTGluZVdpZHRoKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMaW5lV2lkdGhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExpc3RCYXNlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbExpc3RCYXNlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotCWdsTGlzdEJhc2UoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbExpc3RCYXNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkSWRlbnRpdHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZElkZW50aXR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2FkSWRlbnRpdHlfRlVOQyk7Ci0JZ2xMb2FkSWRlbnRpdHkoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZElkZW50aXR5X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xMb2FkTWF0cml4ZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xMb2FkTWF0cml4ZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbExvYWRNYXRyaXhkX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbExvYWRNYXRyaXhkKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4ZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE1hdHJpeGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE1hdHJpeGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE1hdHJpeGZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xMb2FkTWF0cml4ZihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xMb2FkTWF0cml4Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTG9hZE5hbWUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9hZE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci0JZ2xMb2FkTmFtZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9hZE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbExvZ2ljT3AKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTG9naWNPcCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xMb2dpY09wX0ZVTkMpOwotCWdsTG9naWNPcChhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTG9naWNPcF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTWFwMWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpkb3VibGVBcnJheSBhcmc1KQotewotCWpkb3VibGUgKmxwYXJnNT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMWRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNSkgbHBhcmc1ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAxZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAxZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdEFycmF5IGFyZzUpCi17Ci0JamZsb2F0ICpscGFyZzU9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDFmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgTlVMTCk7Ci0JfQotCWdsTWFwMWYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgbHBhcmc1KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBscGFyZzUsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hcDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpkb3VibGVBcnJheSBhcmc5KQotewotCWpkb3VibGUgKmxwYXJnOT1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwMmRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOSkgbHBhcmc5ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgbHBhcmc5LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hcDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXAyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXAyZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGpmbG9hdCBhcmc1LCBqZmxvYXQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgsIGpmbG9hdEFycmF5IGFyZzkpCi17Ci0JamZsb2F0ICpscGFyZzk9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcDJmX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc5KSBscGFyZzkgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc5LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzkpIGxwYXJnOSA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnOSwgTlVMTCk7Ci0JfQotCWdsTWFwMmYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgbHBhcmc5KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzksIGxwYXJnOSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc5KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc5LCBscGFyZzksIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQxZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQxZF9GVU5DKTsKLQlnbE1hcEdyaWQxZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDFkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDFmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWFwR3JpZDFmX0ZVTkMpOwotCWdsTWFwR3JpZDFmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXBHcmlkMWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hcEdyaWQyZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXBHcmlkMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamludCBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZF9GVU5DKTsKLQlnbE1hcEdyaWQyZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXBHcmlkMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWFwR3JpZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hcEdyaWQyZl9GVU5DKTsKLQlnbE1hcEdyaWQyZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWFwR3JpZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTWF0ZXJpYWxmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZl9GVU5DKTsKLQlnbE1hdGVyaWFsZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdGVyaWFsZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE1hdGVyaWFsaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNYXRlcmlhbGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE1hdGVyaWFsaV9GVU5DKTsKLQlnbE1hdGVyaWFsaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRlcmlhbGl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdGVyaWFsaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0ZXJpYWxpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xNYXRlcmlhbGl2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xNYXRlcmlhbGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNYXRyaXhNb2RlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE1hdHJpeE1vZGUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTWF0cml4TW9kZV9GVU5DKTsKLQlnbE1hdHJpeE1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE1hdHJpeE1vZGVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE11bHRNYXRyaXhkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE11bHRNYXRyaXhkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTXVsdE1hdHJpeGRfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTXVsdE1hdHJpeGQobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xNdWx0TWF0cml4ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xNdWx0TWF0cml4ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xNdWx0TWF0cml4Zl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE11bHRNYXRyaXhmKGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE11bHRNYXRyaXhmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOZXdMaXN0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbE5ld0xpc3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOZXdMaXN0X0ZVTkMpOwotCWdsTmV3TGlzdChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTmV3TGlzdF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2IpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamJ5dGUgYXJnMCwgamJ5dGUgYXJnMSwgamJ5dGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotCWdsTm9ybWFsM2IoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNiX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzYnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2J2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xOb3JtYWwzYnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNidihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNidl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotCWdsTm9ybWFsM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci0JZ2xOb3JtYWwzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotCWdsTm9ybWFsM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsTm9ybWFsM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbE5vcm1hbDNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xOb3JtYWwzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci0JZ2xOb3JtYWwzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbE5vcm1hbDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWwzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsTm9ybWFsM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE5vcm1hbDNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsTm9ybWFsUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xOb3JtYWxQb2ludGVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE5vcm1hbFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsTm9ybWFsUG9pbnRlcihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsTm9ybWFsUG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsT3J0aG8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsT3J0aG8pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqZG91YmxlIGFyZzQsIGpkb3VibGUgYXJnNSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotCWdsT3J0aG8oYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbE9ydGhvX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQYXNzVGhyb3VnaAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQYXNzVGhyb3VnaCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotCWdsUGFzc1Rocm91Z2goYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBhc3NUaHJvdWdoX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbE1hcGZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xQaXhlbE1hcGZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdWl2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdWl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBpeGVsTWFwdWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdWl2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVpbnQgKilscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxNYXB1aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsTWFwdXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsTWFwdXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqc2hvcnRBcnJheSBhcmcyKQotewotCWpzaG9ydCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbE1hcHVzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFBpeGVsTWFwdXN2KGFyZzAsIGFyZzEsIChjb25zdCBHTHVzaG9ydCAqKWxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsTWFwdXN2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQaXhlbFN0b3JlZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQaXhlbFN0b3JlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsU3RvcmVpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsU3RvcmVpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci0JZ2xQaXhlbFN0b3JlaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUGl4ZWxTdG9yZWlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBpeGVsVHJhbnNmZXJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsVHJhbnNmZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxUcmFuc2ZlcmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUGl4ZWxUcmFuc2ZlcmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLQlnbFBpeGVsVHJhbnNmZXJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQaXhlbFRyYW5zZmVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUGl4ZWxab29tCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBpeGVsWm9vbSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQaXhlbFpvb21fRlVOQyk7Ci0JZ2xQaXhlbFpvb20oYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBpeGVsWm9vbV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUG9pbnRTaXplCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvaW50U2l6ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvaW50U2l6ZV9GVU5DKTsKLQlnbFBvaW50U2l6ZShhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9pbnRTaXplX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uTW9kZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQb2x5Z29uTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotCWdsUG9seWdvbk1vZGUoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25Nb2RlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb2x5Z29uT2Zmc2V0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25PZmZzZXQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUG9seWdvbk9mZnNldF9GVU5DKTsKLQlnbFBvbHlnb25PZmZzZXQoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25PZmZzZXRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFBvbHlnb25TdGlwcGxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvbHlnb25TdGlwcGxlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb2x5Z29uU3RpcHBsZV9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUG9seWdvblN0aXBwbGUoKEdMdWJ5dGUgKilscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvbHlnb25TdGlwcGxlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wQ2xpZW50QXR0cmliKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BDbGllbnRBdHRyaWJfRlVOQyk7Ci0JZ2xQb3BDbGllbnRBdHRyaWIoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wQ2xpZW50QXR0cmliX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BNYXRyaXgKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUG9wTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQb3BNYXRyaXhfRlVOQyk7Ci0JZ2xQb3BNYXRyaXgoKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUG9wTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQb3BOYW1lCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFBvcE5hbWUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci0JZ2xQb3BOYW1lKCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFBvcE5hbWVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFByaW9yaXRpemVUZXh0dXJlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQcmlvcml0aXplVGV4dHVyZXMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFByaW9yaXRpemVUZXh0dXJlcyhhcmcwLCAoY29uc3QgR0x1aW50ICopbHBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHJpb3JpdGl6ZVRleHR1cmVzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoQXR0cmliCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFB1c2hBdHRyaWIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUHVzaEF0dHJpYl9GVU5DKTsKLQlnbFB1c2hBdHRyaWIoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFB1c2hBdHRyaWJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFB1c2hDbGllbnRBdHRyaWIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUHVzaENsaWVudEF0dHJpYikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoQ2xpZW50QXR0cmliX0ZVTkMpOwotCWdsUHVzaENsaWVudEF0dHJpYihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUHVzaENsaWVudEF0dHJpYl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUHVzaE1hdHJpeAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTWF0cml4KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotCWdsUHVzaE1hdHJpeCgpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTWF0cml4X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xQdXNoTmFtZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xQdXNoTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLQlnbFB1c2hOYW1lKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xQdXNoTmFtZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLQlnbFJhc3RlclBvczJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MyZihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MyZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLQlnbFJhc3RlclBvczJpKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3MyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczJpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xSYXN0ZXJQb3MyaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zMnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczJzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Myc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zMnN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zMnN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2QKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2QoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2R2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2R2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM2Z2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2kpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotCWdsUmFzdGVyUG9zM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFJhc3RlclBvczNpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSYXN0ZXJQb3MzcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3MzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3MzcyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3Mzc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zM3N2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczNzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmFzdGVyUG9zNGkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmFzdGVyUG9zNGkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNGlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0aXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSYXN0ZXJQb3M0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJhc3RlclBvczRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci0JZ2xSYXN0ZXJQb3M0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJhc3RlclBvczRzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSYXN0ZXJQb3M0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmFzdGVyUG9zNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsUmFzdGVyUG9zNHN2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJhc3RlclBvczRzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsUmVhZEJ1ZmZlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWFkQnVmZmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlYWRCdWZmZXJfRlVOQyk7Ci0JZ2xSZWFkQnVmZmVyKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWFkQnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWFkUGl4ZWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlYWRQaXhlbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWFkUGl4ZWxzX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFJlYWRQaXhlbHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlYWRQaXhlbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotCWdsUmVjdGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwLCBqZG91YmxlQXJyYXkgYXJnMSkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlqZG91YmxlICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGR2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSwgamZsb2F0IGFyZzIsIGpmbG9hdCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci0JZ2xSZWN0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdGZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCWpmbG9hdCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0ZnYobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotCWdsUmVjdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlY3RpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSZWN0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVjdGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwLCBqaW50QXJyYXkgYXJnMSkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlY3Rpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JCWlmIChhcmcxKSBscGFyZzEgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcxLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsUmVjdGl2KGxwYXJnMCwgbHBhcmcxKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBscGFyZzEsIDApOwotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0aXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJlY3RzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci0JZ2xSZWN0cyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsUmVjdHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlY3RzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xSZWN0c3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCwganNob3J0QXJyYXkgYXJnMSkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCWpzaG9ydCAqbHBhcmcxPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQl9Ci0JZ2xSZWN0c3YobHBhcmcwLCBscGFyZzEpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSZWN0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJlbmRlck1vZGUKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xfTkFUSVZFKGdsUmVuZGVyTW9kZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JamludCByYzsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFJlbmRlck1vZGUoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJlbmRlck1vZGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xSb3RhdGVkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFJvdGF0ZWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsUm90YXRlZF9GVU5DKTsKLQlnbFJvdGF0ZWQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFJvdGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFJvdGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsUm90YXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFJvdGF0ZWZfRlVOQyk7Ci0JZ2xSb3RhdGVmKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xSb3RhdGVmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTY2FsZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2NhbGVkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2FsZWRfRlVOQyk7Ci0JZ2xTY2FsZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNjYWxlZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2NhbGVmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNjYWxlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2NhbGVmX0ZVTkMpOwotCWdsU2NhbGVmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTY2FsZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFNjaXNzb3IKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU2Npc3NvcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTY2lzc29yX0ZVTkMpOwotCWdsU2Npc3NvcihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2Npc3Nvcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU2VsZWN0QnVmZmVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNlbGVjdEJ1ZmZlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFNlbGVjdEJ1ZmZlcl9GVU5DKTsKLQlnbFNlbGVjdEJ1ZmZlcihhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU2VsZWN0QnVmZmVyX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xTaGFkZU1vZGVsCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFNoYWRlTW9kZWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU2hhZGVNb2RlbF9GVU5DKTsKLQlnbFNoYWRlTW9kZWwoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFNoYWRlTW9kZWxfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxGdW5jCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFN0ZW5jaWxGdW5jKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLQlnbFN0ZW5jaWxGdW5jKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xTdGVuY2lsRnVuY19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsU3RlbmNpbE1hc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsU3RlbmNpbE1hc2spCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci0JZ2xTdGVuY2lsTWFzayhhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE1hc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFN0ZW5jaWxPcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xTdGVuY2lsT3ApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFN0ZW5jaWxPcF9GVU5DKTsKLQlnbFN0ZW5jaWxPcChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsU3RlbmNpbE9wX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZF9GVU5DKTsKLQlnbFRleENvb3JkMWQoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMWR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMWR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMWYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzApCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmX0ZVTkMpOwotCWdsVGV4Q29vcmQxZihhcmcwKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQxZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDFmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWlfRlVOQyk7Ci0JZ2xUZXhDb29yZDFpKGFyZzApOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDFpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMWl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMWl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDFpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQxcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDFzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc19GVU5DKTsKLQlnbFRleENvb3JkMXMoYXJnMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMXNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMXN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMXN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMXN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQxc3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQxc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMmQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmRfRlVOQyk7Ci0JZ2xUZXhDb29yZDJkKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkMmZfRlVOQyk7Ci0JZ2xUZXhDb29yZDJmKGFyZzAsIGFyZzEpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXRBcnJheSBhcmcwKQotewotCWpmbG9hdCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkMmZ2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkMmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkMmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpX0ZVTkMpOwotCWdsVGV4Q29vcmQyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkMnMKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQycykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzX0ZVTkMpOwotCWdsVGV4Q29vcmQycyhhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQyc3YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0QXJyYXkgYXJnMCkKLXsKLQlqc2hvcnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQyc3ZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDJzdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkX0ZVTkMpOwotCWdsVGV4Q29vcmQzZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQzZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNkdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDNkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZl9GVU5DKTsKLQlnbFRleENvb3JkM2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2Z2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM2Z2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzZnYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2kKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQzaSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaV9GVU5DKTsKLQlnbFRleENvb3JkM2koYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2lfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkM2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM2l2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQzaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM2l2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkM3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkM3NfRlVOQyk7Ci0JZ2xUZXhDb29yZDNzKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDNzdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDNzdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnRBcnJheSBhcmcwKQotewotCWpzaG9ydCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkM3N2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkM3N2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZSBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZF9GVU5DKTsKLQlnbFRleENvb3JkNGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNGR2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0ZHYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNGYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMiwgamZsb2F0IGFyZzMpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmX0ZVTkMpOwotCWdsVGV4Q29vcmQ0ZihhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4Q29vcmQ0ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0QXJyYXkgYXJnMCkKLXsKLQlqZmxvYXQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0ZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xUZXhDb29yZDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0aQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGlfRlVOQyk7Ci0JZ2xUZXhDb29yZDRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhDb29yZDRpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFRleENvb3JkNGl2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZDRpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4Q29vcmQ0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZDRzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSwganNob3J0IGFyZzIsIGpzaG9ydCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c19GVU5DKTsKLQlnbFRleENvb3JkNHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleENvb3JkNHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkNHN2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleENvb3JkNHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleENvb3JkNHN2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmQ0c3YobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VTaG9ydEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4Q29vcmQ0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleENvb3JkUG9pbnRlcgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhDb29yZFBvaW50ZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamludCAqbHBhcmczPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVGV4Q29vcmRQb2ludGVyKGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhDb29yZFBvaW50ZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhFbnZmX0ZVTkMpOwotCWdsVGV4RW52ZihhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52Zl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4RW52ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52ZnYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudmZ2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4RW52ZnYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4RW52ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudmkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4RW52aSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4RW52aV9GVU5DKTsKLQlnbFRleEVudmkoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEVudmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEVudml2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEVudml2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEVudml2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEVudml2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhFbnZpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5kKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5kX0ZVTkMpOwotCWdsVGV4R2VuZChhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4R2VuZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4R2VuZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpkb3VibGVBcnJheSBhcmcyKQotewotCWpkb3VibGUgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4R2VuZHYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5mCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4R2VuZl9GVU5DKTsKLQlnbFRleEdlbmYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEdlbmZ2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5mdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbFRleEdlbmZ2KGFyZzAsIGFyZzEsIGxwYXJnMik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleEdlbmZ2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEdlbmkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleEdlbmlfRlVOQyk7Ci0JZ2xUZXhHZW5pKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhHZW5pX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhHZW5pdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhHZW5pdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhHZW5pdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhHZW5pdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4R2VuaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleEltYWdlMUQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4SW1hZ2UxRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnRBcnJheSBhcmc3KQotewotCWppbnQgKmxwYXJnNz1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4SW1hZ2UxRF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTFEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGxwYXJnNyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTFEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhJbWFnZTJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleEltYWdlMkQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcsIGpieXRlQXJyYXkgYXJnOCkKLXsKLQlqYnl0ZSAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JZ2xUZXhJbWFnZTJEKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGxwYXJnOCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzgpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBscGFyZzgsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4SW1hZ2UyRF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcmZfRlVOQyk7Ci0JZ2xUZXhQYXJhbWV0ZXJmKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhQYXJhbWV0ZXJmdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJmdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyZnZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2xUZXhQYXJhbWV0ZXJmdihhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xUZXhQYXJhbWV0ZXJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhQYXJhbWV0ZXJpX0ZVTkMpOwotCWdsVGV4UGFyYW1ldGVyaShhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVGV4UGFyYW1ldGVyaXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4UGFyYW1ldGVyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMj1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVGV4UGFyYW1ldGVyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JfQotCWdsVGV4UGFyYW1ldGVyaXYoYXJnMCwgYXJnMSwgbHBhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFBhcmFtZXRlcml2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xUZXhTdWJJbWFnZTFECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFRleFN1YkltYWdlMUQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludEFycmF5IGFyZzYpCi17Ci0JamludCAqbHBhcmc2PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTFEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMUQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgbHBhcmc2LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMURfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRleFN1YkltYWdlMkQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVGV4U3ViSW1hZ2UyRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNywgamludEFycmF5IGFyZzgpCi17Ci0JamludCAqbHBhcmc4PU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xUZXhTdWJJbWFnZTJEX0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlnbFRleFN1YkltYWdlMkQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRleFN1YkltYWdlMkRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZF9GVU5DKTsKLQlnbFRyYW5zbGF0ZWQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFRyYW5zbGF0ZWYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVHJhbnNsYXRlZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVHJhbnNsYXRlZl9GVU5DKTsKLQlnbFRyYW5zbGF0ZWYoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFRyYW5zbGF0ZWZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci0JZ2xWZXJ0ZXgyZChhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmRfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJkdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyZHYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamRvdWJsZUFycmF5IGFyZzApCi17Ci0JamRvdWJsZSAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4MmR2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZHZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJmCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJmKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdCBhcmcwLCBqZmxvYXQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotCWdsVmVydGV4MmYoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MmZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci0JZ2xWZXJ0ZXgyaShhcmcwLCBhcmcxKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4MmlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJpdgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXgyaXYpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludEFycmF5IGFyZzApCi17Ci0JamludCAqbHBhcmcwPU5VTEw7Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JfQotCWdsVmVydGV4Mml2KGxwYXJnMCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyaXZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydCBhcmcwLCBqc2hvcnQgYXJnMSkKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotCWdsVmVydGV4MnMoYXJnMCwgYXJnMSk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgyc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4MnN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDJzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDJzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgyc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLQlnbFZlcnRleDNkKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2R2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNkdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlQXJyYXkgYXJnMCkKLXsKLQlqZG91YmxlICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgTlVMTCk7Ci0JZ2xWZXJ0ZXgzZHYobHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNkdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2YpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamZsb2F0IGFyZzAsIGpmbG9hdCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotCWdsVmVydGV4M2YoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M2Z2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDNpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLQlnbFZlcnRleDNpKGFyZzAsIGFyZzEsIGFyZzIpOwotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzaV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M2l2Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDNpdikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50QXJyYXkgYXJnMCkKLXsKLQlqaW50ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQl9Ci0JZ2xWZXJ0ZXgzaXYobHBhcmcwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNpdl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmVydGV4M3MKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwganNob3J0IGFyZzAsIGpzaG9ydCBhcmcxLCBqc2hvcnQgYXJnMikKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotCWdsVmVydGV4M3MoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDNzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXgzc3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4M3N2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDNzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDNzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXgzc3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRkCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRkKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotCWdsVmVydGV4NGQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRkX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZHYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGR2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGVBcnJheSBhcmcwKQotewotCWpkb3VibGUgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRkdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGR2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0ZikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZmxvYXQgYXJnMCwgamZsb2F0IGFyZzEsIGpmbG9hdCBhcmcyLCBqZmxvYXQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotCWdsVmVydGV4NGYoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRmX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0ZnYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGZ2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpmbG9hdEFycmF5IGFyZzApCi17Ci0JamZsb2F0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRmdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRmdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0ZnZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleDRpCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMX05BVElWRShnbFZlcnRleDRpKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotCWdsVmVydGV4NGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRpX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0aXYKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NGl2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnRBcnJheSBhcmcwKQotewotCWppbnQgKmxwYXJnMD1OVUxMOwotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcwLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRpdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4NGl2X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0cwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTF9OQVRJVkUoZ2xWZXJ0ZXg0cykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqc2hvcnQgYXJnMCwganNob3J0IGFyZzEsIGpzaG9ydCBhcmcyLCBqc2hvcnQgYXJnMykKLXsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotCWdsVmVydGV4NHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFZlcnRleDRzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xWZXJ0ZXg0c3YKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4NHN2KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpzaG9ydEFycmF5IGFyZzApCi17Ci0JanNob3J0ICpscGFyZzA9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleDRzdl9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMCkgbHBhcmcwID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcwKSBscGFyZzAgPSAoKmVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIE5VTEwpOwotCX0KLQlnbFZlcnRleDRzdihscGFyZzApOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcwKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMCwgbHBhcmcwLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzApICgqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzAsIGxwYXJnMCwgMCk7Ci0JfQotCUdMX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xWZXJ0ZXg0c3ZfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFZlcnRleFBvaW50ZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmVydGV4UG9pbnRlcikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlHTF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFZlcnRleFBvaW50ZXJfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JfQotCWdsVmVydGV4UG9pbnRlcihhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmczKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgbHBhcmczLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmVydGV4UG9pbnRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsVmlld3BvcnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xfTkFUSVZFKGdsVmlld3BvcnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci0JZ2xWaWV3cG9ydChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsVmlld3BvcnRfRlVOQyk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmMGExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpZmRlZiBfX0FQUExFX18KLSNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KLSNlbHNlCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxHTC9nbC5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2VmZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMX25hdGl2ZUZ1bmN0aW9uQ291bnQgPSAzMzU7Ci1pbnQgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbMzM1XTsKLWNoYXIgKiBHTF9uYXRpdmVGdW5jdGlvbk5hbWVzW10gPSB7Ci0JImdsQWNjdW0iLCAKLQkiZ2xBbHBoYUZ1bmMiLCAKLQkiZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IiwgCi0JImdsQXJyYXlFbGVtZW50IiwgCi0JImdsQmVnaW4iLCAKLQkiZ2xCaW5kVGV4dHVyZSIsIAotCSJnbEJpdG1hcCIsIAotCSJnbEJsZW5kRnVuYyIsIAotCSJnbENhbGxMaXN0IiwgCi0JImdsQ2FsbExpc3RzX19JSV8zQiIsIAotCSJnbENhbGxMaXN0c19fSUlfM0MiLCAKLQkiZ2xDYWxsTGlzdHNfX0lJXzNJIiwgCi0JImdsQ2xlYXIiLCAKLQkiZ2xDbGVhckFjY3VtIiwgCi0JImdsQ2xlYXJDb2xvciIsIAotCSJnbENsZWFyRGVwdGgiLCAKLQkiZ2xDbGVhckluZGV4IiwgCi0JImdsQ2xlYXJTdGVuY2lsIiwgCi0JImdsQ2xpcFBsYW5lIiwgCi0JImdsQ29sb3IzYiIsIAotCSJnbENvbG9yM2J2IiwgCi0JImdsQ29sb3IzZCIsIAotCSJnbENvbG9yM2R2IiwgCi0JImdsQ29sb3IzZiIsIAotCSJnbENvbG9yM2Z2IiwgCi0JImdsQ29sb3IzaSIsIAotCSJnbENvbG9yM2l2IiwgCi0JImdsQ29sb3IzcyIsIAotCSJnbENvbG9yM3N2IiwgCi0JImdsQ29sb3IzdWIiLCAKLQkiZ2xDb2xvcjN1YnYiLCAKLQkiZ2xDb2xvcjN1aSIsIAotCSJnbENvbG9yM3VpdiIsIAotCSJnbENvbG9yM3VzIiwgCi0JImdsQ29sb3IzdXN2IiwgCi0JImdsQ29sb3I0YiIsIAotCSJnbENvbG9yNGJ2IiwgCi0JImdsQ29sb3I0ZCIsIAotCSJnbENvbG9yNGR2IiwgCi0JImdsQ29sb3I0ZiIsIAotCSJnbENvbG9yNGZ2IiwgCi0JImdsQ29sb3I0aSIsIAotCSJnbENvbG9yNGl2IiwgCi0JImdsQ29sb3I0cyIsIAotCSJnbENvbG9yNHViIiwgCi0JImdsQ29sb3I0dWJ2IiwgCi0JImdsQ29sb3I0dWkiLCAKLQkiZ2xDb2xvcjR1aXYiLCAKLQkiZ2xDb2xvcjR1cyIsIAotCSJnbENvbG9yNHVzdiIsIAotCSJnbENvbG9yTWFzayIsIAotCSJnbENvbG9yTWF0ZXJpYWwiLCAKLQkiZ2xDb2xvclBvaW50ZXIiLCAKLQkiZ2xDb3B5UGl4ZWxzIiwgCi0JImdsQ29weVRleEltYWdlMUQiLCAKLQkiZ2xDb3B5VGV4SW1hZ2UyRCIsIAotCSJnbENvcHlUZXhTdWJJbWFnZTFEIiwgCi0JImdsQ29weVRleFN1YkltYWdlMkQiLCAKLQkiZ2xDdWxsRmFjZSIsIAotCSJnbERlbGV0ZUxpc3RzIiwgCi0JImdsRGVsZXRlVGV4dHVyZXMiLCAKLQkiZ2xEZXB0aEZ1bmMiLCAKLQkiZ2xEZXB0aE1hc2siLCAKLQkiZ2xEZXB0aFJhbmdlIiwgCi0JImdsRGlzYWJsZSIsIAotCSJnbERpc2FibGVDbGllbnRTdGF0ZSIsIAotCSJnbERyYXdBcnJheXMiLCAKLQkiZ2xEcmF3QnVmZmVyIiwgCi0JImdsRHJhd0VsZW1lbnRzIiwgCi0JImdsRHJhd1BpeGVscyIsIAotCSJnbEVkZ2VGbGFnIiwgCi0JImdsRWRnZUZsYWdQb2ludGVyIiwgCi0JImdsRWRnZUZsYWd2IiwgCi0JImdsRW5hYmxlIiwgCi0JImdsRW5hYmxlQ2xpZW50U3RhdGUiLCAKLQkiZ2xFbmQiLCAKLQkiZ2xFbmRMaXN0IiwgCi0JImdsRXZhbENvb3JkMWQiLCAKLQkiZ2xFdmFsQ29vcmQxZHYiLCAKLQkiZ2xFdmFsQ29vcmQxZiIsIAotCSJnbEV2YWxDb29yZDFmdiIsIAotCSJnbEV2YWxDb29yZDJkIiwgCi0JImdsRXZhbENvb3JkMmR2IiwgCi0JImdsRXZhbENvb3JkMmYiLCAKLQkiZ2xFdmFsQ29vcmQyZnYiLCAKLQkiZ2xFdmFsTWVzaDEiLCAKLQkiZ2xFdmFsTWVzaDIiLCAKLQkiZ2xFdmFsUG9pbnQxIiwgCi0JImdsRXZhbFBvaW50MiIsIAotCSJnbEZlZWRiYWNrQnVmZmVyIiwgCi0JImdsRmluaXNoIiwgCi0JImdsRmx1c2giLCAKLQkiZ2xGb2dmIiwgCi0JImdsRm9nZnYiLCAKLQkiZ2xGb2dpIiwgCi0JImdsRm9naXYiLCAKLQkiZ2xGcm9udEZhY2UiLCAKLQkiZ2xGcnVzdHVtIiwgCi0JImdsR2VuTGlzdHMiLCAKLQkiZ2xHZW5UZXh0dXJlcyIsIAotCSJnbEdldEJvb2xlYW52IiwgCi0JImdsR2V0Q2xpcFBsYW5lIiwgCi0JImdsR2V0RG91YmxldiIsIAotCSJnbEdldEVycm9yIiwgCi0JImdsR2V0RmxvYXR2IiwgCi0JImdsR2V0SW50ZWdlcnYiLCAKLQkiZ2xHZXRMaWdodGZ2IiwgCi0JImdsR2V0TGlnaHRpdiIsIAotCSJnbEdldE1hcGR2IiwgCi0JImdsR2V0TWFwZnYiLCAKLQkiZ2xHZXRNYXBpdiIsIAotCSJnbEdldE1hdGVyaWFsZnYiLCAKLQkiZ2xHZXRNYXRlcmlhbGl2IiwgCi0JImdsR2V0UGl4ZWxNYXBmdiIsIAotCSJnbEdldFBpeGVsTWFwdWl2IiwgCi0JImdsR2V0UGl4ZWxNYXB1c3YiLCAKLQkiZ2xHZXRQb2ludGVydiIsIAotCSJnbEdldFBvbHlnb25TdGlwcGxlIiwgCi0JImdsR2V0U3RyaW5nIiwgCi0JImdsR2V0VGV4RW52ZnYiLCAKLQkiZ2xHZXRUZXhFbnZpdiIsIAotCSJnbEdldFRleEdlbmR2IiwgCi0JImdsR2V0VGV4R2VuZnYiLCAKLQkiZ2xHZXRUZXhHZW5pdiIsIAotCSJnbEdldFRleEltYWdlIiwgCi0JImdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleExldmVsUGFyYW1ldGVyaXYiLCAKLQkiZ2xHZXRUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbEdldFRleFBhcmFtZXRlcml2IiwgCi0JImdsSGludCIsIAotCSJnbEluZGV4TWFzayIsIAotCSJnbEluZGV4UG9pbnRlciIsIAotCSJnbEluZGV4ZCIsIAotCSJnbEluZGV4ZHYiLCAKLQkiZ2xJbmRleGYiLCAKLQkiZ2xJbmRleGZ2IiwgCi0JImdsSW5kZXhpIiwgCi0JImdsSW5kZXhpdiIsIAotCSJnbEluZGV4cyIsIAotCSJnbEluZGV4c3YiLCAKLQkiZ2xJbml0TmFtZXMiLCAKLQkiZ2xJbnRlcmxlYXZlZEFycmF5cyIsIAotCSJnbElzRW5hYmxlZCIsIAotCSJnbElzTGlzdCIsIAotCSJnbElzVGV4dHVyZSIsIAotCSJnbExpZ2h0TW9kZWxmIiwgCi0JImdsTGlnaHRNb2RlbGZ2IiwgCi0JImdsTGlnaHRNb2RlbGkiLCAKLQkiZ2xMaWdodE1vZGVsaXYiLCAKLQkiZ2xMaWdodGYiLCAKLQkiZ2xMaWdodGZ2IiwgCi0JImdsTGlnaHRpIiwgCi0JImdsTGlnaHRpdiIsIAotCSJnbExpbmVTdGlwcGxlIiwgCi0JImdsTGluZVdpZHRoIiwgCi0JImdsTGlzdEJhc2UiLCAKLQkiZ2xMb2FkSWRlbnRpdHkiLCAKLQkiZ2xMb2FkTWF0cml4ZCIsIAotCSJnbExvYWRNYXRyaXhmIiwgCi0JImdsTG9hZE5hbWUiLCAKLQkiZ2xMb2dpY09wIiwgCi0JImdsTWFwMWQiLCAKLQkiZ2xNYXAxZiIsIAotCSJnbE1hcDJkIiwgCi0JImdsTWFwMmYiLCAKLQkiZ2xNYXBHcmlkMWQiLCAKLQkiZ2xNYXBHcmlkMWYiLCAKLQkiZ2xNYXBHcmlkMmQiLCAKLQkiZ2xNYXBHcmlkMmYiLCAKLQkiZ2xNYXRlcmlhbGYiLCAKLQkiZ2xNYXRlcmlhbGZ2IiwgCi0JImdsTWF0ZXJpYWxpIiwgCi0JImdsTWF0ZXJpYWxpdiIsIAotCSJnbE1hdHJpeE1vZGUiLCAKLQkiZ2xNdWx0TWF0cml4ZCIsIAotCSJnbE11bHRNYXRyaXhmIiwgCi0JImdsTmV3TGlzdCIsIAotCSJnbE5vcm1hbDNiIiwgCi0JImdsTm9ybWFsM2J2IiwgCi0JImdsTm9ybWFsM2QiLCAKLQkiZ2xOb3JtYWwzZHYiLCAKLQkiZ2xOb3JtYWwzZiIsIAotCSJnbE5vcm1hbDNmdiIsIAotCSJnbE5vcm1hbDNpIiwgCi0JImdsTm9ybWFsM2l2IiwgCi0JImdsTm9ybWFsM3MiLCAKLQkiZ2xOb3JtYWwzc3YiLCAKLQkiZ2xOb3JtYWxQb2ludGVyIiwgCi0JImdsT3J0aG8iLCAKLQkiZ2xQYXNzVGhyb3VnaCIsIAotCSJnbFBpeGVsTWFwZnYiLCAKLQkiZ2xQaXhlbE1hcHVpdiIsIAotCSJnbFBpeGVsTWFwdXN2IiwgCi0JImdsUGl4ZWxTdG9yZWYiLCAKLQkiZ2xQaXhlbFN0b3JlaSIsIAotCSJnbFBpeGVsVHJhbnNmZXJmIiwgCi0JImdsUGl4ZWxUcmFuc2ZlcmkiLCAKLQkiZ2xQaXhlbFpvb20iLCAKLQkiZ2xQb2ludFNpemUiLCAKLQkiZ2xQb2x5Z29uTW9kZSIsIAotCSJnbFBvbHlnb25PZmZzZXQiLCAKLQkiZ2xQb2x5Z29uU3RpcHBsZSIsIAotCSJnbFBvcEF0dHJpYiIsIAotCSJnbFBvcENsaWVudEF0dHJpYiIsIAotCSJnbFBvcE1hdHJpeCIsIAotCSJnbFBvcE5hbWUiLCAKLQkiZ2xQcmlvcml0aXplVGV4dHVyZXMiLCAKLQkiZ2xQdXNoQXR0cmliIiwgCi0JImdsUHVzaENsaWVudEF0dHJpYiIsIAotCSJnbFB1c2hNYXRyaXgiLCAKLQkiZ2xQdXNoTmFtZSIsIAotCSJnbFJhc3RlclBvczJkIiwgCi0JImdsUmFzdGVyUG9zMmR2IiwgCi0JImdsUmFzdGVyUG9zMmYiLCAKLQkiZ2xSYXN0ZXJQb3MyZnYiLCAKLQkiZ2xSYXN0ZXJQb3MyaSIsIAotCSJnbFJhc3RlclBvczJpdiIsIAotCSJnbFJhc3RlclBvczJzIiwgCi0JImdsUmFzdGVyUG9zMnN2IiwgCi0JImdsUmFzdGVyUG9zM2QiLCAKLQkiZ2xSYXN0ZXJQb3MzZHYiLCAKLQkiZ2xSYXN0ZXJQb3MzZiIsIAotCSJnbFJhc3RlclBvczNmdiIsIAotCSJnbFJhc3RlclBvczNpIiwgCi0JImdsUmFzdGVyUG9zM2l2IiwgCi0JImdsUmFzdGVyUG9zM3MiLCAKLQkiZ2xSYXN0ZXJQb3Mzc3YiLCAKLQkiZ2xSYXN0ZXJQb3M0ZCIsIAotCSJnbFJhc3RlclBvczRkdiIsIAotCSJnbFJhc3RlclBvczRmIiwgCi0JImdsUmFzdGVyUG9zNGZ2IiwgCi0JImdsUmFzdGVyUG9zNGkiLCAKLQkiZ2xSYXN0ZXJQb3M0aXYiLCAKLQkiZ2xSYXN0ZXJQb3M0cyIsIAotCSJnbFJhc3RlclBvczRzdiIsIAotCSJnbFJlYWRCdWZmZXIiLCAKLQkiZ2xSZWFkUGl4ZWxzIiwgCi0JImdsUmVjdGQiLCAKLQkiZ2xSZWN0ZHYiLCAKLQkiZ2xSZWN0ZiIsIAotCSJnbFJlY3RmdiIsIAotCSJnbFJlY3RpIiwgCi0JImdsUmVjdGl2IiwgCi0JImdsUmVjdHMiLCAKLQkiZ2xSZWN0c3YiLCAKLQkiZ2xSZW5kZXJNb2RlIiwgCi0JImdsUm90YXRlZCIsIAotCSJnbFJvdGF0ZWYiLCAKLQkiZ2xTY2FsZWQiLCAKLQkiZ2xTY2FsZWYiLCAKLQkiZ2xTY2lzc29yIiwgCi0JImdsU2VsZWN0QnVmZmVyIiwgCi0JImdsU2hhZGVNb2RlbCIsIAotCSJnbFN0ZW5jaWxGdW5jIiwgCi0JImdsU3RlbmNpbE1hc2siLCAKLQkiZ2xTdGVuY2lsT3AiLCAKLQkiZ2xUZXhDb29yZDFkIiwgCi0JImdsVGV4Q29vcmQxZHYiLCAKLQkiZ2xUZXhDb29yZDFmIiwgCi0JImdsVGV4Q29vcmQxZnYiLCAKLQkiZ2xUZXhDb29yZDFpIiwgCi0JImdsVGV4Q29vcmQxaXYiLCAKLQkiZ2xUZXhDb29yZDFzIiwgCi0JImdsVGV4Q29vcmQxc3YiLCAKLQkiZ2xUZXhDb29yZDJkIiwgCi0JImdsVGV4Q29vcmQyZHYiLCAKLQkiZ2xUZXhDb29yZDJmIiwgCi0JImdsVGV4Q29vcmQyZnYiLCAKLQkiZ2xUZXhDb29yZDJpIiwgCi0JImdsVGV4Q29vcmQyaXYiLCAKLQkiZ2xUZXhDb29yZDJzIiwgCi0JImdsVGV4Q29vcmQyc3YiLCAKLQkiZ2xUZXhDb29yZDNkIiwgCi0JImdsVGV4Q29vcmQzZHYiLCAKLQkiZ2xUZXhDb29yZDNmIiwgCi0JImdsVGV4Q29vcmQzZnYiLCAKLQkiZ2xUZXhDb29yZDNpIiwgCi0JImdsVGV4Q29vcmQzaXYiLCAKLQkiZ2xUZXhDb29yZDNzIiwgCi0JImdsVGV4Q29vcmQzc3YiLCAKLQkiZ2xUZXhDb29yZDRkIiwgCi0JImdsVGV4Q29vcmQ0ZHYiLCAKLQkiZ2xUZXhDb29yZDRmIiwgCi0JImdsVGV4Q29vcmQ0ZnYiLCAKLQkiZ2xUZXhDb29yZDRpIiwgCi0JImdsVGV4Q29vcmQ0aXYiLCAKLQkiZ2xUZXhDb29yZDRzIiwgCi0JImdsVGV4Q29vcmQ0c3YiLCAKLQkiZ2xUZXhDb29yZFBvaW50ZXIiLCAKLQkiZ2xUZXhFbnZmIiwgCi0JImdsVGV4RW52ZnYiLCAKLQkiZ2xUZXhFbnZpIiwgCi0JImdsVGV4RW52aXYiLCAKLQkiZ2xUZXhHZW5kIiwgCi0JImdsVGV4R2VuZHYiLCAKLQkiZ2xUZXhHZW5mIiwgCi0JImdsVGV4R2VuZnYiLCAKLQkiZ2xUZXhHZW5pIiwgCi0JImdsVGV4R2VuaXYiLCAKLQkiZ2xUZXhJbWFnZTFEIiwgCi0JImdsVGV4SW1hZ2UyRCIsIAotCSJnbFRleFBhcmFtZXRlcmYiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJmdiIsIAotCSJnbFRleFBhcmFtZXRlcmkiLCAKLQkiZ2xUZXhQYXJhbWV0ZXJpdiIsIAotCSJnbFRleFN1YkltYWdlMUQiLCAKLQkiZ2xUZXhTdWJJbWFnZTJEIiwgCi0JImdsVHJhbnNsYXRlZCIsIAotCSJnbFRyYW5zbGF0ZWYiLCAKLQkiZ2xWZXJ0ZXgyZCIsIAotCSJnbFZlcnRleDJkdiIsIAotCSJnbFZlcnRleDJmIiwgCi0JImdsVmVydGV4MmZ2IiwgCi0JImdsVmVydGV4MmkiLCAKLQkiZ2xWZXJ0ZXgyaXYiLCAKLQkiZ2xWZXJ0ZXgycyIsIAotCSJnbFZlcnRleDJzdiIsIAotCSJnbFZlcnRleDNkIiwgCi0JImdsVmVydGV4M2R2IiwgCi0JImdsVmVydGV4M2YiLCAKLQkiZ2xWZXJ0ZXgzZnYiLCAKLQkiZ2xWZXJ0ZXgzaSIsIAotCSJnbFZlcnRleDNpdiIsIAotCSJnbFZlcnRleDNzIiwgCi0JImdsVmVydGV4M3N2IiwgCi0JImdsVmVydGV4NGQiLCAKLQkiZ2xWZXJ0ZXg0ZHYiLCAKLQkiZ2xWZXJ0ZXg0ZiIsIAotCSJnbFZlcnRleDRmdiIsIAotCSJnbFZlcnRleDRpIiwgCi0JImdsVmVydGV4NGl2IiwgCi0JImdsVmVydGV4NHMiLCAKLQkiZ2xWZXJ0ZXg0c3YiLCAKLQkiZ2xWZXJ0ZXhQb2ludGVyIiwgCi0JImdsVmlld3BvcnQiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25Db3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCXJldHVybiBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xfbmF0aXZlRnVuY3Rpb25OYW1lc1tpbmRleF0pOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdGF0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMWZlZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotI2lmZGVmIE5BVElWRV9TVEFUUwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMX25hdGl2ZUZ1bmN0aW9uTmFtZXNbXTsKLSNkZWZpbmUgR0xfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbHNlCi0jZGVmaW5lIEdMX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xBY2N1bV9GVU5DLAotCWdsQWxwaGFGdW5jX0ZVTkMsCi0JZ2xBcmVUZXh0dXJlc1Jlc2lkZW50X0ZVTkMsCi0JZ2xBcnJheUVsZW1lbnRfRlVOQywKLQlnbEJlZ2luX0ZVTkMsCi0JZ2xCaW5kVGV4dHVyZV9GVU5DLAotCWdsQml0bWFwX0ZVTkMsCi0JZ2xCbGVuZEZ1bmNfRlVOQywKLQlnbENhbGxMaXN0X0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNCX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNDX0ZVTkMsCi0JZ2xDYWxsTGlzdHNfX0lJXzNJX0ZVTkMsCi0JZ2xDbGVhcl9GVU5DLAotCWdsQ2xlYXJBY2N1bV9GVU5DLAotCWdsQ2xlYXJDb2xvcl9GVU5DLAotCWdsQ2xlYXJEZXB0aF9GVU5DLAotCWdsQ2xlYXJJbmRleF9GVU5DLAotCWdsQ2xlYXJTdGVuY2lsX0ZVTkMsCi0JZ2xDbGlwUGxhbmVfRlVOQywKLQlnbENvbG9yM2JfRlVOQywKLQlnbENvbG9yM2J2X0ZVTkMsCi0JZ2xDb2xvcjNkX0ZVTkMsCi0JZ2xDb2xvcjNkdl9GVU5DLAotCWdsQ29sb3IzZl9GVU5DLAotCWdsQ29sb3IzZnZfRlVOQywKLQlnbENvbG9yM2lfRlVOQywKLQlnbENvbG9yM2l2X0ZVTkMsCi0JZ2xDb2xvcjNzX0ZVTkMsCi0JZ2xDb2xvcjNzdl9GVU5DLAotCWdsQ29sb3IzdWJfRlVOQywKLQlnbENvbG9yM3Vidl9GVU5DLAotCWdsQ29sb3IzdWlfRlVOQywKLQlnbENvbG9yM3Vpdl9GVU5DLAotCWdsQ29sb3IzdXNfRlVOQywKLQlnbENvbG9yM3Vzdl9GVU5DLAotCWdsQ29sb3I0Yl9GVU5DLAotCWdsQ29sb3I0YnZfRlVOQywKLQlnbENvbG9yNGRfRlVOQywKLQlnbENvbG9yNGR2X0ZVTkMsCi0JZ2xDb2xvcjRmX0ZVTkMsCi0JZ2xDb2xvcjRmdl9GVU5DLAotCWdsQ29sb3I0aV9GVU5DLAotCWdsQ29sb3I0aXZfRlVOQywKLQlnbENvbG9yNHNfRlVOQywKLQlnbENvbG9yNHViX0ZVTkMsCi0JZ2xDb2xvcjR1YnZfRlVOQywKLQlnbENvbG9yNHVpX0ZVTkMsCi0JZ2xDb2xvcjR1aXZfRlVOQywKLQlnbENvbG9yNHVzX0ZVTkMsCi0JZ2xDb2xvcjR1c3ZfRlVOQywKLQlnbENvbG9yTWFza19GVU5DLAotCWdsQ29sb3JNYXRlcmlhbF9GVU5DLAotCWdsQ29sb3JQb2ludGVyX0ZVTkMsCi0JZ2xDb3B5UGl4ZWxzX0ZVTkMsCi0JZ2xDb3B5VGV4SW1hZ2UxRF9GVU5DLAotCWdsQ29weVRleEltYWdlMkRfRlVOQywKLQlnbENvcHlUZXhTdWJJbWFnZTFEX0ZVTkMsCi0JZ2xDb3B5VGV4U3ViSW1hZ2UyRF9GVU5DLAotCWdsQ3VsbEZhY2VfRlVOQywKLQlnbERlbGV0ZUxpc3RzX0ZVTkMsCi0JZ2xEZWxldGVUZXh0dXJlc19GVU5DLAotCWdsRGVwdGhGdW5jX0ZVTkMsCi0JZ2xEZXB0aE1hc2tfRlVOQywKLQlnbERlcHRoUmFuZ2VfRlVOQywKLQlnbERpc2FibGVfRlVOQywKLQlnbERpc2FibGVDbGllbnRTdGF0ZV9GVU5DLAotCWdsRHJhd0FycmF5c19GVU5DLAotCWdsRHJhd0J1ZmZlcl9GVU5DLAotCWdsRHJhd0VsZW1lbnRzX0ZVTkMsCi0JZ2xEcmF3UGl4ZWxzX0ZVTkMsCi0JZ2xFZGdlRmxhZ19GVU5DLAotCWdsRWRnZUZsYWdQb2ludGVyX0ZVTkMsCi0JZ2xFZGdlRmxhZ3ZfRlVOQywKLQlnbEVuYWJsZV9GVU5DLAotCWdsRW5hYmxlQ2xpZW50U3RhdGVfRlVOQywKLQlnbEVuZF9GVU5DLAotCWdsRW5kTGlzdF9GVU5DLAotCWdsRXZhbENvb3JkMWRfRlVOQywKLQlnbEV2YWxDb29yZDFkdl9GVU5DLAotCWdsRXZhbENvb3JkMWZfRlVOQywKLQlnbEV2YWxDb29yZDFmdl9GVU5DLAotCWdsRXZhbENvb3JkMmRfRlVOQywKLQlnbEV2YWxDb29yZDJkdl9GVU5DLAotCWdsRXZhbENvb3JkMmZfRlVOQywKLQlnbEV2YWxDb29yZDJmdl9GVU5DLAotCWdsRXZhbE1lc2gxX0ZVTkMsCi0JZ2xFdmFsTWVzaDJfRlVOQywKLQlnbEV2YWxQb2ludDFfRlVOQywKLQlnbEV2YWxQb2ludDJfRlVOQywKLQlnbEZlZWRiYWNrQnVmZmVyX0ZVTkMsCi0JZ2xGaW5pc2hfRlVOQywKLQlnbEZsdXNoX0ZVTkMsCi0JZ2xGb2dmX0ZVTkMsCi0JZ2xGb2dmdl9GVU5DLAotCWdsRm9naV9GVU5DLAotCWdsRm9naXZfRlVOQywKLQlnbEZyb250RmFjZV9GVU5DLAotCWdsRnJ1c3R1bV9GVU5DLAotCWdsR2VuTGlzdHNfRlVOQywKLQlnbEdlblRleHR1cmVzX0ZVTkMsCi0JZ2xHZXRCb29sZWFudl9GVU5DLAotCWdsR2V0Q2xpcFBsYW5lX0ZVTkMsCi0JZ2xHZXREb3VibGV2X0ZVTkMsCi0JZ2xHZXRFcnJvcl9GVU5DLAotCWdsR2V0RmxvYXR2X0ZVTkMsCi0JZ2xHZXRJbnRlZ2Vydl9GVU5DLAotCWdsR2V0TGlnaHRmdl9GVU5DLAotCWdsR2V0TGlnaHRpdl9GVU5DLAotCWdsR2V0TWFwZHZfRlVOQywKLQlnbEdldE1hcGZ2X0ZVTkMsCi0JZ2xHZXRNYXBpdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxmdl9GVU5DLAotCWdsR2V0TWF0ZXJpYWxpdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXBmdl9GVU5DLAotCWdsR2V0UGl4ZWxNYXB1aXZfRlVOQywKLQlnbEdldFBpeGVsTWFwdXN2X0ZVTkMsCi0JZ2xHZXRQb2ludGVydl9GVU5DLAotCWdsR2V0UG9seWdvblN0aXBwbGVfRlVOQywKLQlnbEdldFN0cmluZ19GVU5DLAotCWdsR2V0VGV4RW52ZnZfRlVOQywKLQlnbEdldFRleEVudml2X0ZVTkMsCi0JZ2xHZXRUZXhHZW5kdl9GVU5DLAotCWdsR2V0VGV4R2VuZnZfRlVOQywKLQlnbEdldFRleEdlbml2X0ZVTkMsCi0JZ2xHZXRUZXhJbWFnZV9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdl9GVU5DLAotCWdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdl9GVU5DLAotCWdsR2V0VGV4UGFyYW1ldGVyZnZfRlVOQywKLQlnbEdldFRleFBhcmFtZXRlcml2X0ZVTkMsCi0JZ2xIaW50X0ZVTkMsCi0JZ2xJbmRleE1hc2tfRlVOQywKLQlnbEluZGV4UG9pbnRlcl9GVU5DLAotCWdsSW5kZXhkX0ZVTkMsCi0JZ2xJbmRleGR2X0ZVTkMsCi0JZ2xJbmRleGZfRlVOQywKLQlnbEluZGV4ZnZfRlVOQywKLQlnbEluZGV4aV9GVU5DLAotCWdsSW5kZXhpdl9GVU5DLAotCWdsSW5kZXhzX0ZVTkMsCi0JZ2xJbmRleHN2X0ZVTkMsCi0JZ2xJbml0TmFtZXNfRlVOQywKLQlnbEludGVybGVhdmVkQXJyYXlzX0ZVTkMsCi0JZ2xJc0VuYWJsZWRfRlVOQywKLQlnbElzTGlzdF9GVU5DLAotCWdsSXNUZXh0dXJlX0ZVTkMsCi0JZ2xMaWdodE1vZGVsZl9GVU5DLAotCWdsTGlnaHRNb2RlbGZ2X0ZVTkMsCi0JZ2xMaWdodE1vZGVsaV9GVU5DLAotCWdsTGlnaHRNb2RlbGl2X0ZVTkMsCi0JZ2xMaWdodGZfRlVOQywKLQlnbExpZ2h0ZnZfRlVOQywKLQlnbExpZ2h0aV9GVU5DLAotCWdsTGlnaHRpdl9GVU5DLAotCWdsTGluZVN0aXBwbGVfRlVOQywKLQlnbExpbmVXaWR0aF9GVU5DLAotCWdsTGlzdEJhc2VfRlVOQywKLQlnbExvYWRJZGVudGl0eV9GVU5DLAotCWdsTG9hZE1hdHJpeGRfRlVOQywKLQlnbExvYWRNYXRyaXhmX0ZVTkMsCi0JZ2xMb2FkTmFtZV9GVU5DLAotCWdsTG9naWNPcF9GVU5DLAotCWdsTWFwMWRfRlVOQywKLQlnbE1hcDFmX0ZVTkMsCi0JZ2xNYXAyZF9GVU5DLAotCWdsTWFwMmZfRlVOQywKLQlnbE1hcEdyaWQxZF9GVU5DLAotCWdsTWFwR3JpZDFmX0ZVTkMsCi0JZ2xNYXBHcmlkMmRfRlVOQywKLQlnbE1hcEdyaWQyZl9GVU5DLAotCWdsTWF0ZXJpYWxmX0ZVTkMsCi0JZ2xNYXRlcmlhbGZ2X0ZVTkMsCi0JZ2xNYXRlcmlhbGlfRlVOQywKLQlnbE1hdGVyaWFsaXZfRlVOQywKLQlnbE1hdHJpeE1vZGVfRlVOQywKLQlnbE11bHRNYXRyaXhkX0ZVTkMsCi0JZ2xNdWx0TWF0cml4Zl9GVU5DLAotCWdsTmV3TGlzdF9GVU5DLAotCWdsTm9ybWFsM2JfRlVOQywKLQlnbE5vcm1hbDNidl9GVU5DLAotCWdsTm9ybWFsM2RfRlVOQywKLQlnbE5vcm1hbDNkdl9GVU5DLAotCWdsTm9ybWFsM2ZfRlVOQywKLQlnbE5vcm1hbDNmdl9GVU5DLAotCWdsTm9ybWFsM2lfRlVOQywKLQlnbE5vcm1hbDNpdl9GVU5DLAotCWdsTm9ybWFsM3NfRlVOQywKLQlnbE5vcm1hbDNzdl9GVU5DLAotCWdsTm9ybWFsUG9pbnRlcl9GVU5DLAotCWdsT3J0aG9fRlVOQywKLQlnbFBhc3NUaHJvdWdoX0ZVTkMsCi0JZ2xQaXhlbE1hcGZ2X0ZVTkMsCi0JZ2xQaXhlbE1hcHVpdl9GVU5DLAotCWdsUGl4ZWxNYXB1c3ZfRlVOQywKLQlnbFBpeGVsU3RvcmVmX0ZVTkMsCi0JZ2xQaXhlbFN0b3JlaV9GVU5DLAotCWdsUGl4ZWxUcmFuc2ZlcmZfRlVOQywKLQlnbFBpeGVsVHJhbnNmZXJpX0ZVTkMsCi0JZ2xQaXhlbFpvb21fRlVOQywKLQlnbFBvaW50U2l6ZV9GVU5DLAotCWdsUG9seWdvbk1vZGVfRlVOQywKLQlnbFBvbHlnb25PZmZzZXRfRlVOQywKLQlnbFBvbHlnb25TdGlwcGxlX0ZVTkMsCi0JZ2xQb3BBdHRyaWJfRlVOQywKLQlnbFBvcENsaWVudEF0dHJpYl9GVU5DLAotCWdsUG9wTWF0cml4X0ZVTkMsCi0JZ2xQb3BOYW1lX0ZVTkMsCi0JZ2xQcmlvcml0aXplVGV4dHVyZXNfRlVOQywKLQlnbFB1c2hBdHRyaWJfRlVOQywKLQlnbFB1c2hDbGllbnRBdHRyaWJfRlVOQywKLQlnbFB1c2hNYXRyaXhfRlVOQywKLQlnbFB1c2hOYW1lX0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZF9GVU5DLAotCWdsUmFzdGVyUG9zMmR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyZl9GVU5DLAotCWdsUmFzdGVyUG9zMmZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MyaV9GVU5DLAotCWdsUmFzdGVyUG9zMml2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Myc19GVU5DLAotCWdsUmFzdGVyUG9zMnN2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZF9GVU5DLAotCWdsUmFzdGVyUG9zM2R2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzZl9GVU5DLAotCWdsUmFzdGVyUG9zM2Z2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3MzaV9GVU5DLAotCWdsUmFzdGVyUG9zM2l2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3Mzc19GVU5DLAotCWdsUmFzdGVyUG9zM3N2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0ZF9GVU5DLAotCWdsUmFzdGVyUG9zNGR2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0Zl9GVU5DLAotCWdsUmFzdGVyUG9zNGZ2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0aV9GVU5DLAotCWdsUmFzdGVyUG9zNGl2X0ZVTkMsCi0JZ2xSYXN0ZXJQb3M0c19GVU5DLAotCWdsUmFzdGVyUG9zNHN2X0ZVTkMsCi0JZ2xSZWFkQnVmZmVyX0ZVTkMsCi0JZ2xSZWFkUGl4ZWxzX0ZVTkMsCi0JZ2xSZWN0ZF9GVU5DLAotCWdsUmVjdGR2X0ZVTkMsCi0JZ2xSZWN0Zl9GVU5DLAotCWdsUmVjdGZ2X0ZVTkMsCi0JZ2xSZWN0aV9GVU5DLAotCWdsUmVjdGl2X0ZVTkMsCi0JZ2xSZWN0c19GVU5DLAotCWdsUmVjdHN2X0ZVTkMsCi0JZ2xSZW5kZXJNb2RlX0ZVTkMsCi0JZ2xSb3RhdGVkX0ZVTkMsCi0JZ2xSb3RhdGVmX0ZVTkMsCi0JZ2xTY2FsZWRfRlVOQywKLQlnbFNjYWxlZl9GVU5DLAotCWdsU2Npc3Nvcl9GVU5DLAotCWdsU2VsZWN0QnVmZmVyX0ZVTkMsCi0JZ2xTaGFkZU1vZGVsX0ZVTkMsCi0JZ2xTdGVuY2lsRnVuY19GVU5DLAotCWdsU3RlbmNpbE1hc2tfRlVOQywKLQlnbFN0ZW5jaWxPcF9GVU5DLAotCWdsVGV4Q29vcmQxZF9GVU5DLAotCWdsVGV4Q29vcmQxZHZfRlVOQywKLQlnbFRleENvb3JkMWZfRlVOQywKLQlnbFRleENvb3JkMWZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDFpX0ZVTkMsCi0JZ2xUZXhDb29yZDFpdl9GVU5DLAotCWdsVGV4Q29vcmQxc19GVU5DLAotCWdsVGV4Q29vcmQxc3ZfRlVOQywKLQlnbFRleENvb3JkMmRfRlVOQywKLQlnbFRleENvb3JkMmR2X0ZVTkMsCi0JZ2xUZXhDb29yZDJmX0ZVTkMsCi0JZ2xUZXhDb29yZDJmdl9GVU5DLAotCWdsVGV4Q29vcmQyaV9GVU5DLAotCWdsVGV4Q29vcmQyaXZfRlVOQywKLQlnbFRleENvb3JkMnNfRlVOQywKLQlnbFRleENvb3JkMnN2X0ZVTkMsCi0JZ2xUZXhDb29yZDNkX0ZVTkMsCi0JZ2xUZXhDb29yZDNkdl9GVU5DLAotCWdsVGV4Q29vcmQzZl9GVU5DLAotCWdsVGV4Q29vcmQzZnZfRlVOQywKLQlnbFRleENvb3JkM2lfRlVOQywKLQlnbFRleENvb3JkM2l2X0ZVTkMsCi0JZ2xUZXhDb29yZDNzX0ZVTkMsCi0JZ2xUZXhDb29yZDNzdl9GVU5DLAotCWdsVGV4Q29vcmQ0ZF9GVU5DLAotCWdsVGV4Q29vcmQ0ZHZfRlVOQywKLQlnbFRleENvb3JkNGZfRlVOQywKLQlnbFRleENvb3JkNGZ2X0ZVTkMsCi0JZ2xUZXhDb29yZDRpX0ZVTkMsCi0JZ2xUZXhDb29yZDRpdl9GVU5DLAotCWdsVGV4Q29vcmQ0c19GVU5DLAotCWdsVGV4Q29vcmQ0c3ZfRlVOQywKLQlnbFRleENvb3JkUG9pbnRlcl9GVU5DLAotCWdsVGV4RW52Zl9GVU5DLAotCWdsVGV4RW52ZnZfRlVOQywKLQlnbFRleEVudmlfRlVOQywKLQlnbFRleEVudml2X0ZVTkMsCi0JZ2xUZXhHZW5kX0ZVTkMsCi0JZ2xUZXhHZW5kdl9GVU5DLAotCWdsVGV4R2VuZl9GVU5DLAotCWdsVGV4R2VuZnZfRlVOQywKLQlnbFRleEdlbmlfRlVOQywKLQlnbFRleEdlbml2X0ZVTkMsCi0JZ2xUZXhJbWFnZTFEX0ZVTkMsCi0JZ2xUZXhJbWFnZTJEX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmX0ZVTkMsCi0JZ2xUZXhQYXJhbWV0ZXJmdl9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaV9GVU5DLAotCWdsVGV4UGFyYW1ldGVyaXZfRlVOQywKLQlnbFRleFN1YkltYWdlMURfRlVOQywKLQlnbFRleFN1YkltYWdlMkRfRlVOQywKLQlnbFRyYW5zbGF0ZWRfRlVOQywKLQlnbFRyYW5zbGF0ZWZfRlVOQywKLQlnbFZlcnRleDJkX0ZVTkMsCi0JZ2xWZXJ0ZXgyZHZfRlVOQywKLQlnbFZlcnRleDJmX0ZVTkMsCi0JZ2xWZXJ0ZXgyZnZfRlVOQywKLQlnbFZlcnRleDJpX0ZVTkMsCi0JZ2xWZXJ0ZXgyaXZfRlVOQywKLQlnbFZlcnRleDJzX0ZVTkMsCi0JZ2xWZXJ0ZXgyc3ZfRlVOQywKLQlnbFZlcnRleDNkX0ZVTkMsCi0JZ2xWZXJ0ZXgzZHZfRlVOQywKLQlnbFZlcnRleDNmX0ZVTkMsCi0JZ2xWZXJ0ZXgzZnZfRlVOQywKLQlnbFZlcnRleDNpX0ZVTkMsCi0JZ2xWZXJ0ZXgzaXZfRlVOQywKLQlnbFZlcnRleDNzX0ZVTkMsCi0JZ2xWZXJ0ZXgzc3ZfRlVOQywKLQlnbFZlcnRleDRkX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZHZfRlVOQywKLQlnbFZlcnRleDRmX0ZVTkMsCi0JZ2xWZXJ0ZXg0ZnZfRlVOQywKLQlnbFZlcnRleDRpX0ZVTkMsCi0JZ2xWZXJ0ZXg0aXZfRlVOQywKLQlnbFZlcnRleDRzX0ZVTkMsCi0JZ2xWZXJ0ZXg0c3ZfRlVOQywKLQlnbFZlcnRleFBvaW50ZXJfRlVOQywKLQlnbFZpZXdwb3J0X0ZVTkMsCi19IEdMX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDkwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsX3N0cnVjdHMuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZTk2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsX3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI2luY2x1ZGUgImdsLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNzA3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTggKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNkZWZpbmUgR0xVX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX29wZW5nbF9HTFVfIyNmdW5jCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5DdXJ2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCZWdpbkN1cnZlX0ZVTkMpOwotCWdsdUJlZ2luQ3VydmUoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5DdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luUG9seWdvbgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luUG9seWdvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLQlnbHVCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJlZ2luU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJlZ2luU3VyZmFjZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUJlZ2luU3VyZmFjZV9GVU5DKTsKLQlnbHVCZWdpblN1cmZhY2UoKEdMVW51cmJzICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1QmVnaW5TdXJmYWNlX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1QmVnaW5UcmltCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QmVnaW5UcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QmVnaW5UcmltX0ZVTkMpOwotCWdsdUJlZ2luVHJpbSgoR0xVbnVyYnMgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVCZWdpblRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVCdWlsZDFETWlwbWFwcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUJ1aWxkMURNaXBtYXBzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1QnVpbGQxRE1pcG1hcHNfRlVOQyk7Ci0JcmMgPSAoamludClnbHVCdWlsZDFETWlwbWFwcyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCAoY29uc3Qgdm9pZCAqKWFyZzUpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMURNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUJ1aWxkMkRNaXBtYXBzCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1QnVpbGQyRE1pcG1hcHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamJ5dGVBcnJheSBhcmc2KQotewotCWpieXRlICpscGFyZzY9TlVMTDsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVCdWlsZDJETWlwbWFwc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSBscGFyZzYgPSAoKmVudiktPkdldEJ5dGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JfQotCXJjID0gKGppbnQpZ2x1QnVpbGQyRE1pcG1hcHMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgbHBhcmc2KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc2KSAoKmVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUN5bGluZGVyCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1Q3lsaW5kZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1Q3lsaW5kZXJfRlVOQyk7Ci0JZ2x1Q3lsaW5kZXIoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVDeWxpbmRlcl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdURlbGV0ZU51cmJzUmVuZGVyZXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVEZWxldGVOdXJic1JlbmRlcmVyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlcl9GVU5DKTsKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyKChHTFVudXJicyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZU51cmJzUmVuZGVyZXJfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVRdWFkcmljCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlUXVhZHJpYykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci0JZ2x1RGVsZXRlUXVhZHJpYygoR0xVcXVhZHJpYyAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVF1YWRyaWNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEZWxldGVUZXNzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGVsZXRlVGVzcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci0JZ2x1RGVsZXRlVGVzcygoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdURlbGV0ZVRlc3NfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVEaXNrCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLQlnbHVEaXNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RGlza19GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZEN1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1RW5kQ3VydmUpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLQlnbHVFbmRDdXJ2ZSgoR0xVbnVyYnNPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRQb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kUG9seWdvbl9GVU5DKTsKLQlnbHVFbmRQb2x5Z29uKChHTFV0cmlhbmd1bGF0b3JPYmogKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1RW5kU3VyZmFjZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVuZFN1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFbmRTdXJmYWNlX0ZVTkMpOwotCWdsdUVuZFN1cmZhY2UoKEdMVW51cmJzT2JqICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1RW5kU3VyZmFjZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUVuZFRyaW0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVFbmRUcmltKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1RW5kVHJpbV9GVU5DKTsKLQlnbHVFbmRUcmltKChHTFVudXJic09iaiAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVuZFRyaW1fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVFcnJvclN0cmluZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUVycm9yU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVFcnJvclN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUVycm9yU3RyaW5nKGFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUVycm9yU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdUdldE51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXROdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXRBcnJheSBhcmcyKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1R2V0TnVyYnNQcm9wZXJ0eSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUdldE51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVHZXRTdHJpbmcKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVHZXRTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUdldFN0cmluZ19GVU5DKTsKLQlyYyA9IChqaW50KWdsdUdldFN0cmluZyhhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRTdHJpbmdfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1R2V0VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1R2V0VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlQXJyYXkgYXJnMikKLXsKLQlqZG91YmxlICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1R2V0VGVzc1Byb3BlcnR5X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCX0KLQlnbHVHZXRUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBscGFyZzIpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVHZXRUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVMb2FkU2FtcGxpbmdNYXRyaWNlcwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamZsb2F0QXJyYXkgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JamZsb2F0ICpscGFyZzE9TlVMTDsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgTlVMTCk7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBOVUxMKTsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKTsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmczKSBscGFyZzMgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBOVUxMKTsKLQl9Ci0JZ2x1TG9hZFNhbXBsaW5nTWF0cmljZXMoKEdMVW51cmJzICopYXJnMCwgbHBhcmcxLCBscGFyZzIsIGxwYXJnMyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQkJaWYgKGFyZzEpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TG9va0F0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TG9va0F0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMywgamRvdWJsZSBhcmc0LCBqZG91YmxlIGFyZzUsIGpkb3VibGUgYXJnNiwgamRvdWJsZSBhcmc3LCBqZG91YmxlIGFyZzgpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdUxvb2tBdF9GVU5DKTsKLQlnbHVMb29rQXQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TG9va0F0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3TnVyYnNSZW5kZXJlcgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld051cmJzUmVuZGVyZXIpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdOdXJic1JlbmRlcmVyX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3TnVyYnNSZW5kZXJlcigpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld051cmJzUmVuZGVyZXJfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3UXVhZHJpYwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1F1YWRyaWMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdRdWFkcmljX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3UXVhZHJpYygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1F1YWRyaWNfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV3VGVzcwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdU5ld1Rlc3MpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOZXdUZXNzX0ZVTkMpOwotCXJjID0gKGppbnQpZ2x1TmV3VGVzcygpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU5ld1Rlc3NfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1TmV4dENvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOZXh0Q29udG91cikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TmV4dENvbnRvdXJfRlVOQyk7Ci0JZ2x1TmV4dENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOZXh0Q29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzQ2FsbGJhY2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic0NhbGxiYWNrKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1TnVyYnNDYWxsYmFjaygoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCAoR0x2b2lkKCopKWFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic0N1cnZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1TnVyYnNDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqZmxvYXRBcnJheSBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNikKLXsKLQlqZmxvYXQgKmxwYXJnMj1OVUxMOwotCWpmbG9hdCAqbHBhcmc0PU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU51cmJzQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNDdXJ2ZSgoR0xVbnVyYnMgKilhcmcwLCBhcmcxLCBscGFyZzIsIGFyZzMsIGxwYXJnNCwgYXJnNSwgYXJnNik7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1TnVyYnNDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdU51cmJzUHJvcGVydHkKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZmxvYXQgYXJnMikKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1TnVyYnNQcm9wZXJ0eV9GVU5DKTsKLQlnbHVOdXJic1Byb3BlcnR5KChHTFVudXJicyAqKWFyZzAsIGFyZzEsIGFyZzIpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdU51cmJzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVOdXJic1N1cmZhY2UKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVOdXJic1N1cmZhY2UpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGpmbG9hdEFycmF5IGFyZzIsIGppbnQgYXJnMywgamZsb2F0QXJyYXkgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGpmbG9hdEFycmF5IGFyZzcsIGppbnQgYXJnOCwgamludCBhcmc5LCBqaW50IGFyZzEwKQotewotCWpmbG9hdCAqbHBhcmcyPU5VTEw7Ci0JamZsb2F0ICpscGFyZzQ9TlVMTDsKLQlqZmxvYXQgKmxwYXJnNz1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQl9Ci0JZ2x1TnVyYnNTdXJmYWNlKChHTFVudXJic09iaiAqKWFyZzAsIGFyZzEsIGxwYXJnMiwgYXJnMywgbHBhcmc0LCBhcmc1LCBhcmc2LCBscGFyZzcsIGFyZzgsIGFyZzksIGFyZzEwKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzcsIGxwYXJnNywgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzIpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNykgKCplbnYpLT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVOdXJic1N1cmZhY2VfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVPcnRobzJECi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1T3J0aG8yRCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdU9ydGhvMkRfRlVOQyk7Ci0JZ2x1T3J0aG8yRChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVPcnRobzJEX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UGFydGlhbERpc2sKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQYXJ0aWFsRGlzaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamRvdWJsZSBhcmc1LCBqZG91YmxlIGFyZzYpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVBhcnRpYWxEaXNrX0ZVTkMpOwotCWdsdVBhcnRpYWxEaXNrKChHTFVxdWFkcmljICopYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGFydGlhbERpc2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQZXJzcGVjdGl2ZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVBlcnNwZWN0aXZlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpkb3VibGUgYXJnMCwgamRvdWJsZSBhcmcxLCBqZG91YmxlIGFyZzIsIGpkb3VibGUgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci0JZ2x1UGVyc3BlY3RpdmUoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UGVyc3BlY3RpdmVfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQaWNrTWF0cml4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UGlja01hdHJpeCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlIGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVQaWNrTWF0cml4X0ZVTkMpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCX0KLQlnbHVQaWNrTWF0cml4KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGxwYXJnNCk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVBpY2tNYXRyaXhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVQcm9qZWN0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc4LCBOVUxMKTsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKGFyZzMpIGxwYXJnMyA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIE5VTEwpOwotCQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JCWlmIChhcmc1KSBscGFyZzUgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmc1LCBOVUxMKTsKLQkJaWYgKGFyZzYpIGxwYXJnNiA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIE5VTEwpOwotCQlpZiAoYXJnNykgbHBhcmc3ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgTlVMTCk7Ci0JCWlmIChhcmc4KSBscGFyZzggPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc4LCBOVUxMKTsKLQl9Ci0JcmMgPSAoamludClnbHVQcm9qZWN0KGFyZzAsIGFyZzEsIGFyZzIsIGxwYXJnMywgbHBhcmc0LCBscGFyZzUsIGxwYXJnNiwgbHBhcmc3LCBscGFyZzgpOwotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotCWlmIChJU19KTklfMV8yKSB7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmc4KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnOCwgbHBhcmc4LCAwKTsKLQkJaWYgKGFyZzcpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBscGFyZzcsIDApOwotCQlpZiAoYXJnNikgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzYsIGxwYXJnNiwgMCk7Ci0JCWlmIChhcmc1KSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNSwgbHBhcmc1LCAwKTsKLQkJaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCQlpZiAoYXJnMykgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JfQotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1UHdsQ3VydmUKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVQd2xDdXJ2ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamZsb2F0QXJyYXkgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQpCi17Ci0JamZsb2F0ICpscGFyZzI9TlVMTDsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UHdsQ3VydmVfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMikgbHBhcmcyID0gKCplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQl9Ci0JZ2x1UHdsQ3VydmUoKEdMVW51cmJzICopYXJnMCwgYXJnMSwgbHBhcmcyLCBhcmczLCBhcmc0KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVQd2xDdXJ2ZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1UXVhZHJpY0NhbGxiYWNrKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljRHJhd1N0eWxlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY0RyYXdTdHlsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLQlnbHVRdWFkcmljRHJhd1N0eWxlKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVF1YWRyaWNOb3JtYWxzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1UXVhZHJpY05vcm1hbHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMpOwotCWdsdVF1YWRyaWNOb3JtYWxzKChHTFVxdWFkcmljT2JqICopYXJnMCwgYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1UXVhZHJpY05vcm1hbHNfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljT3JpZW50YXRpb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVRdWFkcmljT3JpZW50YXRpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVF1YWRyaWNPcmllbnRhdGlvbl9GVU5DKTsKLQlnbHVRdWFkcmljT3JpZW50YXRpb24oKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljT3JpZW50YXRpb25fRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVRdWFkcmljVGV4dHVyZQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVF1YWRyaWNUZXh0dXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamJvb2xlYW4gYXJnMSkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1UXVhZHJpY1RleHR1cmVfRlVOQyk7Ci0JZ2x1UXVhZHJpY1RleHR1cmUoKEdMVXF1YWRyaWMgKilhcmcwLCBhcmcxKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVRdWFkcmljVGV4dHVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVNjYWxlSW1hZ2UKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xVX05BVElWRShnbHVTY2FsZUltYWdlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgpCi17Ci0JamludCByYzsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U2NhbGVJbWFnZV9GVU5DKTsKLQlyYyA9IChqaW50KWdsdVNjYWxlSW1hZ2UoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKGNvbnN0IHZvaWQgKilhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCAodm9pZCAqKWFyZzgpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNjYWxlSW1hZ2VfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1U3BoZXJlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1U3BoZXJlKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamRvdWJsZSBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1U3BoZXJlX0ZVTkMpOwotCWdsdVNwaGVyZSgoR0xVcXVhZHJpYyAqKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVNwaGVyZV9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpbkNvbnRvdXIKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Db250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLQlnbHVUZXNzQmVnaW5Db250b3VyKChHTFV0ZXNzZWxhdG9yICopYXJnMCk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NCZWdpblBvbHlnb24KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xVX05BVElWRShnbHVUZXNzQmVnaW5Qb2x5Z29uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQmVnaW5Qb2x5Z29uX0ZVTkMpOwotCWdsdVRlc3NCZWdpblBvbHlnb24oKEdMVXRlc3NlbGF0b3IgKilhcmcwLCAoR0x2b2lkICopYXJnMSk7Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc0JlZ2luUG9seWdvbl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NDYWxsYmFjawotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NDYWxsYmFjaykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci0JZ2x1VGVzc0NhbGxiYWNrKChHTFV0ZXNzZWxhdG9yICopYXJnMCwgYXJnMSwgKEdMdm9pZCgqKSlhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzQ2FsbGJhY2tfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzRW5kQ29udG91cgotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NFbmRDb250b3VyKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2x1VGVzc0VuZENvbnRvdXJfRlVOQyk7Ci0JZ2x1VGVzc0VuZENvbnRvdXIoKEdMVXRlc3NlbGF0b3IgKilhcmcwKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzRW5kQ29udG91cl9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVRlc3NFbmRQb2x5Z29uCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc0VuZFBvbHlnb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzRW5kUG9seWdvbl9GVU5DKTsKLQlnbHVUZXNzRW5kUG9seWdvbigoR0xVdGVzc2VsYXRvciAqKWFyZzApOwotCUdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc05vcm1hbAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVRlc3NOb3JtYWwpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqZG91YmxlIGFyZzEsIGpkb3VibGUgYXJnMiwgamRvdWJsZSBhcmczKQotewotCUdMVV9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotCWdsdVRlc3NOb3JtYWwoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzTm9ybWFsX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2x1VGVzc1Byb3BlcnR5Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1Byb3BlcnR5KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqZG91YmxlIGFyZzIpCi17Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NQcm9wZXJ0eV9GVU5DKTsKLQlnbHVUZXNzUHJvcGVydHkoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVUZXNzUHJvcGVydHlfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbHVUZXNzVmVydGV4Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMVV9OQVRJVkUoZ2x1VGVzc1ZlcnRleCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpkb3VibGVBcnJheSBhcmcxLCBqaW50IGFyZzIpCi17Ci0JamRvdWJsZSAqbHBhcmcxPU5VTEw7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVRlc3NWZXJ0ZXhfRlVOQyk7Ci0jaWZkZWYgSk5JX1ZFUlNJT05fMV8yCi0JaWYgKElTX0pOSV8xXzIpIHsKLQkJaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JfQotCWdsdVRlc3NWZXJ0ZXgoKEdMVXRlc3NlbGF0b3IgKilhcmcwLCBscGFyZzEsIChHTHZvaWQgKilhcmcyKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQl9Ci0JR0xVX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2x1VGVzc1ZlcnRleF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsdVVuUHJvamVjdAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFVfTkFUSVZFKGdsdVVuUHJvamVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqZG91YmxlIGFyZzAsIGpkb3VibGUgYXJnMSwgamRvdWJsZSBhcmcyLCBqZG91YmxlQXJyYXkgYXJnMywgamRvdWJsZUFycmF5IGFyZzQsIGppbnRBcnJheSBhcmc1LCBqZG91YmxlQXJyYXkgYXJnNiwgamRvdWJsZUFycmF5IGFyZzcsIGpkb3VibGVBcnJheSBhcmc4KQotewotCWpkb3VibGUgKmxwYXJnMz1OVUxMOwotCWpkb3VibGUgKmxwYXJnND1OVUxMOwotCWppbnQgKmxwYXJnNT1OVUxMOwotCWpkb3VibGUgKmxwYXJnNj1OVUxMOwotCWpkb3VibGUgKmxwYXJnNz1OVUxMOwotCWpkb3VibGUgKmxwYXJnOD1OVUxMOwotCWppbnQgcmM7Ci0JR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsdVVuUHJvamVjdF9GVU5DKTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIE5VTEwpOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JCWlmIChhcmc0KSBscGFyZzQgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBOVUxMKTsKLQkJaWYgKGFyZzUpIGxwYXJnNSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIE5VTEwpOwotCQlpZiAoYXJnNikgbHBhcmc2ID0gKCplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNiwgTlVMTCk7Ci0JCWlmIChhcmc3KSBscGFyZzcgPSAoKmVudiktPkdldERvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc3LCBOVUxMKTsKLQkJaWYgKGFyZzgpIGxwYXJnOCA9ICgqZW52KS0+R2V0RG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIE5VTEwpOwotCX0KLQlyYyA9IChqaW50KWdsdVVuUHJvamVjdChhcmcwLCBhcmcxLCBhcmcyLCBscGFyZzMsIGxwYXJnNCwgbHBhcmc1LCBscGFyZzYsIGxwYXJnNywgbHBhcmc4KTsKLSNpZmRlZiBKTklfVkVSU0lPTl8xXzIKLQlpZiAoSVNfSk5JXzFfMikgewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlpZiAoYXJnOCkgKCplbnYpLT5SZWxlYXNlRG91YmxlQXJyYXlFbGVtZW50cyhlbnYsIGFyZzgsIGxwYXJnOCwgMCk7Ci0JCWlmIChhcmc3KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNywgbHBhcmc3LCAwKTsKLQkJaWYgKGFyZzYpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmc2LCBscGFyZzYsIDApOwotCQlpZiAoYXJnNSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzUsIGxwYXJnNSwgMCk7Ci0JCWlmIChhcmc0KSAoKmVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgbHBhcmc0LCAwKTsKLQkJaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZURvdWJsZUFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCX0KLQlHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbHVVblByb2plY3RfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOGIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8T3BlbkdML2dsdS5oPgotI2Vsc2UKLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPEdML2dsdS5oPgotI2VuZGlmCi0KLWV4dGVybiBpbnQgSVNfSk5JXzFfMjsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZmMyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x1X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50ID0gNTE7Ci1pbnQgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzUxXTsKLWNoYXIgKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbHVCZWdpbkN1cnZlIiwgCi0JImdsdUJlZ2luUG9seWdvbiIsIAotCSJnbHVCZWdpblN1cmZhY2UiLCAKLQkiZ2x1QmVnaW5UcmltIiwgCi0JImdsdUJ1aWxkMURNaXBtYXBzIiwgCi0JImdsdUJ1aWxkMkRNaXBtYXBzIiwgCi0JImdsdUN5bGluZGVyIiwgCi0JImdsdURlbGV0ZU51cmJzUmVuZGVyZXIiLCAKLQkiZ2x1RGVsZXRlUXVhZHJpYyIsIAotCSJnbHVEZWxldGVUZXNzIiwgCi0JImdsdURpc2siLCAKLQkiZ2x1RW5kQ3VydmUiLCAKLQkiZ2x1RW5kUG9seWdvbiIsIAotCSJnbHVFbmRTdXJmYWNlIiwgCi0JImdsdUVuZFRyaW0iLCAKLQkiZ2x1RXJyb3JTdHJpbmciLCAKLQkiZ2x1R2V0TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVHZXRTdHJpbmciLCAKLQkiZ2x1R2V0VGVzc1Byb3BlcnR5IiwgCi0JImdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIiwgCi0JImdsdUxvb2tBdCIsIAotCSJnbHVOZXdOdXJic1JlbmRlcmVyIiwgCi0JImdsdU5ld1F1YWRyaWMiLCAKLQkiZ2x1TmV3VGVzcyIsIAotCSJnbHVOZXh0Q29udG91ciIsIAotCSJnbHVOdXJic0NhbGxiYWNrIiwgCi0JImdsdU51cmJzQ3VydmUiLCAKLQkiZ2x1TnVyYnNQcm9wZXJ0eSIsIAotCSJnbHVOdXJic1N1cmZhY2UiLCAKLQkiZ2x1T3J0aG8yRCIsIAotCSJnbHVQYXJ0aWFsRGlzayIsIAotCSJnbHVQZXJzcGVjdGl2ZSIsIAotCSJnbHVQaWNrTWF0cml4IiwgCi0JImdsdVByb2plY3QiLCAKLQkiZ2x1UHdsQ3VydmUiLCAKLQkiZ2x1UXVhZHJpY0NhbGxiYWNrIiwgCi0JImdsdVF1YWRyaWNEcmF3U3R5bGUiLCAKLQkiZ2x1UXVhZHJpY05vcm1hbHMiLCAKLQkiZ2x1UXVhZHJpY09yaWVudGF0aW9uIiwgCi0JImdsdVF1YWRyaWNUZXh0dXJlIiwgCi0JImdsdVNjYWxlSW1hZ2UiLCAKLQkiZ2x1U3BoZXJlIiwgCi0JImdsdVRlc3NCZWdpbkNvbnRvdXIiLCAKLQkiZ2x1VGVzc0JlZ2luUG9seWdvbiIsIAotCSJnbHVUZXNzQ2FsbGJhY2siLCAKLQkiZ2x1VGVzc0VuZENvbnRvdXIiLCAKLQkiZ2x1VGVzc0VuZFBvbHlnb24iLCAKLQkiZ2x1VGVzc05vcm1hbCIsIAotCSJnbHVUZXNzUHJvcGVydHkiLCAKLQkiZ2x1VGVzc1ZlcnRleCIsIAotCSJnbHVVblByb2plY3QiLCAKLX07Ci0KLSNkZWZpbmUgU1RBVFNfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X3Rvb2xzX2ludGVybmFsX05hdGl2ZVN0YXRzXyMjZnVuYwotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFNUQVRTX05BVElWRShHTFVfMUdldEZ1bmN0aW9uQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlyZXR1cm4gR0xVX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci19Ci0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMVV8xR2V0RnVuY3Rpb25OYW1lKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaW5kZXgpCi17Ci0JcmV0dXJuICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgR0xVX25hdGl2ZUZ1bmN0aW9uTmFtZXNbaW5kZXhdKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xVXzFHZXRGdW5jdGlvbkNhbGxDb3VudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbaW5kZXhdOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RhdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxNzNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0YXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jaWZkZWYgTkFUSVZFX1NUQVRTCi1leHRlcm4gaW50IEdMVV9uYXRpdmVGdW5jdGlvbkNvdW50OwotZXh0ZXJuIGludCBHTFVfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbXTsKLWV4dGVybiBjaGFyKiBHTFVfbmF0aXZlRnVuY3Rpb25OYW1lc1tdOwotI2RlZmluZSBHTFVfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgR0xVX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2Z1bmNdKys7Ci0jZGVmaW5lIEdMVV9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2Vsc2UKLSNkZWZpbmUgR0xVX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGZ1bmMpIAotI2RlZmluZSBHTFVfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBmdW5jKSAKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotCWdsdUJlZ2luQ3VydmVfRlVOQywKLQlnbHVCZWdpblBvbHlnb25fRlVOQywKLQlnbHVCZWdpblN1cmZhY2VfRlVOQywKLQlnbHVCZWdpblRyaW1fRlVOQywKLQlnbHVCdWlsZDFETWlwbWFwc19GVU5DLAotCWdsdUJ1aWxkMkRNaXBtYXBzX0ZVTkMsCi0JZ2x1Q3lsaW5kZXJfRlVOQywKLQlnbHVEZWxldGVOdXJic1JlbmRlcmVyX0ZVTkMsCi0JZ2x1RGVsZXRlUXVhZHJpY19GVU5DLAotCWdsdURlbGV0ZVRlc3NfRlVOQywKLQlnbHVEaXNrX0ZVTkMsCi0JZ2x1RW5kQ3VydmVfRlVOQywKLQlnbHVFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1RW5kU3VyZmFjZV9GVU5DLAotCWdsdUVuZFRyaW1fRlVOQywKLQlnbHVFcnJvclN0cmluZ19GVU5DLAotCWdsdUdldE51cmJzUHJvcGVydHlfRlVOQywKLQlnbHVHZXRTdHJpbmdfRlVOQywKLQlnbHVHZXRUZXNzUHJvcGVydHlfRlVOQywKLQlnbHVMb2FkU2FtcGxpbmdNYXRyaWNlc19GVU5DLAotCWdsdUxvb2tBdF9GVU5DLAotCWdsdU5ld051cmJzUmVuZGVyZXJfRlVOQywKLQlnbHVOZXdRdWFkcmljX0ZVTkMsCi0JZ2x1TmV3VGVzc19GVU5DLAotCWdsdU5leHRDb250b3VyX0ZVTkMsCi0JZ2x1TnVyYnNDYWxsYmFja19GVU5DLAotCWdsdU51cmJzQ3VydmVfRlVOQywKLQlnbHVOdXJic1Byb3BlcnR5X0ZVTkMsCi0JZ2x1TnVyYnNTdXJmYWNlX0ZVTkMsCi0JZ2x1T3J0aG8yRF9GVU5DLAotCWdsdVBhcnRpYWxEaXNrX0ZVTkMsCi0JZ2x1UGVyc3BlY3RpdmVfRlVOQywKLQlnbHVQaWNrTWF0cml4X0ZVTkMsCi0JZ2x1UHJvamVjdF9GVU5DLAotCWdsdVB3bEN1cnZlX0ZVTkMsCi0JZ2x1UXVhZHJpY0NhbGxiYWNrX0ZVTkMsCi0JZ2x1UXVhZHJpY0RyYXdTdHlsZV9GVU5DLAotCWdsdVF1YWRyaWNOb3JtYWxzX0ZVTkMsCi0JZ2x1UXVhZHJpY09yaWVudGF0aW9uX0ZVTkMsCi0JZ2x1UXVhZHJpY1RleHR1cmVfRlVOQywKLQlnbHVTY2FsZUltYWdlX0ZVTkMsCi0JZ2x1U3BoZXJlX0ZVTkMsCi0JZ2x1VGVzc0JlZ2luQ29udG91cl9GVU5DLAotCWdsdVRlc3NCZWdpblBvbHlnb25fRlVOQywKLQlnbHVUZXNzQ2FsbGJhY2tfRlVOQywKLQlnbHVUZXNzRW5kQ29udG91cl9GVU5DLAotCWdsdVRlc3NFbmRQb2x5Z29uX0ZVTkMsCi0JZ2x1VGVzc05vcm1hbF9GVU5DLAotCWdsdVRlc3NQcm9wZXJ0eV9GVU5DLAotCWdsdVRlc3NWZXJ0ZXhfRlVOQywKLQlnbHVVblByb2plY3RfRlVOQywKLX0gR0xVX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwY2U0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL2xpYnJhcnkvZ2x1X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgImdsdV9zdHJ1Y3RzLmgiCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9nbHVfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTFhY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L2dsdV9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNpbmNsdWRlICJnbHUuaCIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAic3d0LmgiCi0KLWludCBJU19KTklfMV8yID0gMDsKLQotI2lmZGVmIEpOSV9WRVJTSU9OXzFfMgotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKTklfT25Mb2FkKEphdmFWTSAqdm0sIHZvaWQgKnJlc2VydmVkKSB7Ci0JSVNfSk5JXzFfMiA9IDE7Ci0JcmV0dXJuIEpOSV9WRVJTSU9OXzFfMjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9saWJyYXJ5L3N3dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI5MDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vbGlicmFyeS9zd3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgSU5DX3N3dF9ICi0jZGVmaW5lIElOQ19zd3RfSAotCi0jaW5jbHVkZSAiam5pLmgiCi0KLS8qIEZvciBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGKHgpCi0vKiNkZWZpbmUgREVCVUdfUFJJTlRGKHgpIHByaW50ZiB4OyAqLwotCi0vKiBkZWZpbmUgdGhpcyB0byBwcmludCBvdXQgZGVidWcgc3RhdGVtZW50cyAqLwotLyogI2RlZmluZSBERUJVR19DQUxMX1BSSU5UUyAqLwotLyogI2RlZmluZSBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMgKi8KLQotI2lmZGVmIERFQlVHX0NBTExfUFJJTlRTCi0jZGVmaW5lIERFQlVHX0NBTEwoZnVuYykgZnByaW50ZihzdGRlcnIsIGZ1bmMpOwotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0FMTChmdW5jKQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19DSEVDS19OVUxMX0VYQ0VQVElPTlMKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpIFwKLQlpZiAoYWRkcmVzcyA9PSAwKSB7IFwKLQkJamNsYXNzIGNsYXp6ID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAib3JnL2VjbGlwc2Uvc3d0L1NXVEVycm9yIik7IFwKLQkJaWYgKGNsYXp6ICE9IE5VTEwpIHsgXAotCQkJKCplbnYpLT5UaHJvd05ldyhlbnYsIGNsYXp6LCAiQXJndW1lbnQgY2Fubm90IGJlIE5VTEwiKTsgXAotCQl9IFwKLQkJcmV0dXJuOyBcCi0JfQotI2Vsc2UKLSNkZWZpbmUgREVCVUdfQ0hFQ0tfTlVMTChlbnYsIGFkZHJlc3MpCi0jZW5kaWYKLQotI2RlZmluZSBERUNMX0dMT0IocFN5bSkKLSNkZWZpbmUgUEdMT0IoeCkgeAotCi0jZGVmaW5lIE5BVElWRV9FTlRFUihlbnYsY2xhenosZnVuYykKLSNkZWZpbmUgTkFUSVZFX0VYSVQoZW52LGNsYXp6LGZ1bmMpCi0KLSNlbmRpZiAvKiBpZm5kZWYgSU5DX3N3dF9IICovCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFhNGZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi1wdWJsaWMgY2xhc3MgR0wgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSU0lPTl8xXzEgPSAxOwotCi0JLyogQWNjdW1PcCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNID0gMHgwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPQUQgPSAweDAxMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVUVVJOID0gMHgwMTAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01VTFQgPSAweDAxMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUREID0gMHgwMTA0OwotCi0JLyogQWxwaGFGdW5jdGlvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FVkVSID0gMHgwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFU1MgPSAweDAyMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVQUwgPSAweDAyMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMID0gMHgwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUFURVIgPSAweDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9URVFVQUwgPSAweDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR0VRVUFMID0gMHgwMjA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMV0FZUyA9IDB4MDIwNzsKLQotCS8qIEF0dHJpYk1hc2sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0JJVCA9IDB4MDAwMDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX0JJVCA9IDB4MDAwMDAwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9CSVQgPSAweDAwMDAwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRV9CSVQgPSAweDAwMDAwMDEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01PREVfQklUID0gMHgwMDAwMDAyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVElOR19CSVQgPSAweDAwMDAwMDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19CSVQgPSAweDAwMDAwMDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgPSAweDAwMDAwMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDQ1VNX0JVRkZFUl9CSVQgPSAweDAwMDAwMjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCA9IDB4MDAwMDA0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlRfQklUID0gMHgwMDAwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUkFOU0ZPUk1fQklUID0gMHgwMDAwMTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTkFCTEVfQklUID0gMHgwMDAwMjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9CVUZGRVJfQklUID0gMHgwMDAwNDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ISU5UX0JJVCA9IDB4MDAwMDgwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVZBTF9CSVQgPSAweDAwMDEwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfQklUID0gMHgwMDAyMDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJVCA9IDB4MDAwNDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CSVQgPSAweDAwMDgwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMTF9BVFRSSUJfQklUUyA9IDB4MDAwZmZmZmY7Ci0KLQkvKiBCZWdpbk1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMgPSAweDAwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORVMgPSAweDAwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9MT09QID0gMHgwMDAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RSSVAgPSAweDAwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVTID0gMHgwMDA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX1NUUklQID0gMHgwMDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFX0ZBTiA9IDB4MDAwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEUyA9IDB4MDAwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9RVUFEX1NUUklQID0gMHgwMDA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT04gPSAweDAwMDk7Ci0KLQkvKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aRVJPID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19DT0xPUiA9IDB4MDMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SID0gMHgwMzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQSA9IDB4MDMwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBID0gMHgwMzAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9BTFBIQSA9IDB4MDMwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBID0gMHgwMzA1OwotCi0JLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLQkvKiAgICAgIEdMX1pFUk8gKi8KLQkvKiAgICAgIEdMX09ORSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9DT0xPUiA9IDB4MDMwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SID0gMHgwMzA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSA9IDB4MDMwODsKLQkvKiAgICAgIEdMX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLwotCS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0JLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCi0KLQkvKiBCb29sZWFuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJVRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFMU0UgPSAwOwotCi0JLyogQ2xlYXJCdWZmZXJNYXNrICovCi0JLyogICAgICBHTF9DT0xPUl9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9BQ0NVTV9CVUZGRVJfQklUICovCi0JLyogICAgICBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgKi8KLQkvKiAgICAgIEdMX0RFUFRIX0JVRkZFUl9CSVQgKi8KLQotCS8qIENsaWVudEFycmF5VHlwZSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0KLQkvKiBDbGlwUGxhbmVOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTAgPSAweDMwMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTEgPSAweDMwMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTIgPSAweDMwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTMgPSAweDMwMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTQgPSAweDMwMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTUgPSAweDMwMDU7Ci0KLQkvKiBDb2xvck1hdGVyaWFsRmFjZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9BTUJJRU5UICovCi0JLyogICAgICBHTF9ESUZGVVNFICovCi0JLyogICAgICBHTF9TUEVDVUxBUiAqLwotCS8qICAgICAgR0xfRU1JU1NJT04gKi8KLQkvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLQotCS8qIENvbG9yUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX0JZVEUgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9VTlNJR05FRF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9VTlNJR05FRF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIEN1bGxGYWNlTW9kZSAqLwotCS8qICAgICAgR0xfRlJPTlQgKi8KLQkvKiAgICAgIEdMX0JBQ0sgKi8KLQkvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLQkvKiBEYXRhVHlwZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JZVEUgPSAweDE0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfQllURSA9IDB4MTQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSE9SVCA9IDB4MTQwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVCA9IDB4MTQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlQgPSAweDE0MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfSU5UID0gMHgxNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUID0gMHgxNDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzJfQllURVMgPSAweDE0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfM19CWVRFUyA9IDB4MTQwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF80X0JZVEVTID0gMHgxNDA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPVUJMRSA9IDB4MTQwQTsKLQotCS8qIERlcHRoRnVuY3Rpb24gKi8KLQkvKiAgICAgIEdMX05FVkVSICovCi0JLyogICAgICBHTF9MRVNTICovCi0JLyogICAgICBHTF9FUVVBTCAqLwotCS8qICAgICAgR0xfTEVRVUFMICovCi0JLyogICAgICBHTF9HUkVBVEVSICovCi0JLyogICAgICBHTF9OT1RFUVVBTCAqLwotCS8qICAgICAgR0xfR0VRVUFMICovCi0JLyogICAgICBHTF9BTFdBWVMgKi8KLQotCS8qIERyYXdCdWZmZXJNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfTEVGVCA9IDB4MDQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9SSUdIVCA9IDB4MDQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLX0xFRlQgPSAweDA0MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkFDS19SSUdIVCA9IDB4MDQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVCA9IDB4MDQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLID0gMHgwNDA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFRlQgPSAweDA0MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUklHSFQgPSAweDA0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgPSAweDA0MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMCA9IDB4MDQwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BVVgxID0gMHgwNDBBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVWDIgPSAweDA0MEI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYMyA9IDB4MDQwQzsKLQotCS8qIEVuYWJsZSAqLwotCS8qICAgICAgR0xfRk9HICovCi0JLyogICAgICBHTF9MSUdIVElORyAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8xRCAqLwotCS8qICAgICAgR0xfVEVYVFVSRV8yRCAqLwotCS8qICAgICAgR0xfTElORV9TVElQUExFICovCi0JLyogICAgICBHTF9QT0xZR09OX1NUSVBQTEUgKi8KLQkvKiAgICAgIEdMX0NVTExfRkFDRSAqLwotCS8qICAgICAgR0xfQUxQSEFfVEVTVCAqLwotCS8qICAgICAgR0xfQkxFTkQgKi8KLQkvKiAgICAgIEdMX0lOREVYX0xPR0lDX09QICovCi0JLyogICAgICBHTF9DT0xPUl9MT0dJQ19PUCAqLwotCS8qICAgICAgR0xfRElUSEVSICovCi0JLyogICAgICBHTF9TVEVOQ0lMX1RFU1QgKi8KLQkvKiAgICAgIEdMX0RFUFRIX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUwICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FMSAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTIgKi8KLQkvKiAgICAgIEdMX0NMSVBfUExBTkUzICovCi0JLyogICAgICBHTF9DTElQX1BMQU5FNCAqLwotCS8qICAgICAgR0xfQ0xJUF9QTEFORTUgKi8KLQkvKiAgICAgIEdMX0xJR0hUMCAqLwotCS8qICAgICAgR0xfTElHSFQxICovCi0JLyogICAgICBHTF9MSUdIVDIgKi8KLQkvKiAgICAgIEdMX0xJR0hUMyAqLwotCS8qICAgICAgR0xfTElHSFQ0ICovCi0JLyogICAgICBHTF9MSUdIVDUgKi8KLQkvKiAgICAgIEdMX0xJR0hUNiAqLwotCS8qICAgICAgR0xfTElHSFQ3ICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9TICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9UICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9SICovCi0JLyogICAgICBHTF9URVhUVVJFX0dFTl9RICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAxX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDFfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDFfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCS8qICAgICAgR0xfTUFQMl9DT0xPUl80ICovCi0JLyogICAgICBHTF9NQVAyX0lOREVYICovCi0JLyogICAgICBHTF9NQVAyX05PUk1BTCAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzEgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8yICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USCAqLwotCS8qICAgICAgR0xfTElORV9TTU9PVEggKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fU01PT1RIICovCi0JLyogICAgICBHTF9TQ0lTU09SX1RFU1QgKi8KLQkvKiAgICAgIEdMX0NPTE9SX01BVEVSSUFMICovCi0JLyogICAgICBHTF9OT1JNQUxJWkUgKi8KLQkvKiAgICAgIEdMX0FVVE9fTk9STUFMICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVkgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWSAqLwotCS8qICAgICAgR0xfQ09MT1JfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVkgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9MSU5FICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GSUxMICovCi0KLQkvKiBFcnJvckNvZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9FTlVNID0gMHgwNTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfVkFMVUUgPSAweDA1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gPSAweDA1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfT1ZFUkZMT1cgPSAweDA1MDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfVU5ERVJGTE9XID0gMHgwNTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09VVF9PRl9NRU1PUlkgPSAweDA1MDU7Ci0KLQkvKiBGZWVkQmFja01vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8yRCA9IDB4MDYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRCA9IDB4MDYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUiA9IDB4MDYwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRF9DT0xPUl9URVhUVVJFID0gMHgwNjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMXzREX0NPTE9SX1RFWFRVUkUgPSAweDA2MDQ7Ci0KLQkvKiBGZWVkQmFja1Rva2VuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFTU19USFJPVUdIX1RPS0VOID0gMHgwNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1RPS0VOID0gMHgwNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfVE9LRU4gPSAweDA3MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9UT0tFTiA9IDB4MDcwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CSVRNQVBfVE9LRU4gPSAweDA3MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19QSVhFTF9UT0tFTiA9IDB4MDcwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT1BZX1BJWEVMX1RPS0VOID0gMHgwNzA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfUkVTRVRfVE9LRU4gPSAweDA3MDc7Ci0KLQkvKiBGb2dNb2RlICovCi0JLyogICAgICBHTF9MSU5FQVIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFAgPSAweDA4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhQMiA9IDB4MDgwMTsKLQotCS8qIEZvZ1BhcmFtZXRlciAqLwotCS8qICAgICAgR0xfRk9HX0NPTE9SICovCi0JLyogICAgICBHTF9GT0dfREVOU0lUWSAqLwotCS8qICAgICAgR0xfRk9HX0VORCAqLwotCS8qICAgICAgR0xfRk9HX0lOREVYICovCi0JLyogICAgICBHTF9GT0dfTU9ERSAqLwotCS8qICAgICAgR0xfRk9HX1NUQVJUICovCi0KLQkvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVyA9IDB4MDkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DQ1cgPSAweDA5MDE7Ci0KLQkvKiBHZXRNYXBUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0VGRiA9IDB4MEEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUkRFUiA9IDB4MEEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET01BSU4gPSAweDBBMDI7Ci0KLQkvKiBHZXRQaXhlbE1hcCAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fSSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1NfVE9fUyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0lfVE9fQSAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX1JfVE9fUiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0dfVE9fRyAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0JfVE9fQiAqLwotCS8qICAgICAgR0xfUElYRUxfTUFQX0FfVE9fQSAqLwotCi0JLyogR2V0UG9pbnRlclRhcmdldCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWV9QT0lOVEVSICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgKi8KLQkvKiAgICAgIEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSICovCi0KLQkvKiBHZXRUYXJnZXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX0NPTE9SID0gMHgwQjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfSU5ERVggPSAweDBCMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwgPSAweDBCMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyA9IDB4MEIwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9DT0xPUiA9IDB4MEIwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWCA9IDB4MEIwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9URVhUVVJFX0NPT1JEUyA9IDB4MEIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTiA9IDB4MEIwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRCA9IDB4MEIwODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1JBU1RFUl9ESVNUQU5DRSA9IDB4MEIwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TTU9PVEggPSAweDBCMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRSA9IDB4MEIxMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX1JBTkdFID0gMHgwQjEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkgPSAweDBCMTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEggPSAweDBCMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9XSURUSCA9IDB4MEIyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1dJRFRIX1JBTkdFID0gMHgwQjIyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkgPSAweDBCMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TVElQUExFID0gMHgwQjI0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9QQVRURVJOID0gMHgwQjI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU1RJUFBMRV9SRVBFQVQgPSAweDBCMjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9NT0RFID0gMHgwQjMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSVNUX05FU1RJTkcgPSAweDBCMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElTVF9CQVNFID0gMHgwQjMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJU1RfSU5ERVggPSAweDBCMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9NT0RFID0gMHgwQjQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU01PT1RIID0gMHgwQjQxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU1RJUFBMRSA9IDB4MEI0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUcgPSAweDBCNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFID0gMHgwQjQ0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFID0gMHgwQjQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UX0ZBQ0UgPSAweDBCNDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRJTkcgPSAweDBCNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSID0gMHgwQjUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX1RXT19TSURFID0gMHgwQjUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX0FNQklFTlQgPSAweDBCNTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVfTU9ERUwgPSAweDBCNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUxfRkFDRSA9IDB4MEI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9NQVRFUklBTF9QQVJBTUVURVIgPSAweDBCNTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTUFURVJJQUwgPSAweDBCNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HID0gMHgwQjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19JTkRFWCA9IDB4MEI2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfREVOU0lUWSA9IDB4MEI2MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfU1RBUlQgPSAweDBCNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0VORCA9IDB4MEI2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfTU9ERSA9IDB4MEI2NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfQ09MT1IgPSAweDBCNjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfUkFOR0UgPSAweDBCNzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfVEVTVCA9IDB4MEI3MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9XUklURU1BU0sgPSAweDBCNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgPSAweDBCNzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfRlVOQyA9IDB4MEI3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9DTEVBUl9WQUxVRSA9IDB4MEI4MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1RFU1QgPSAweDBCOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSA9IDB4MEI5MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZVTkMgPSAweDBCOTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9WQUxVRV9NQVNLID0gMHgwQjkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRkFJTCA9IDB4MEI5NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCA9IDB4MEI5NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyA9IDB4MEI5NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1JFRiA9IDB4MEI5NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyA9IDB4MEI5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfTU9ERSA9IDB4MEJBMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxJWkUgPSAweDBCQTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVklFV1BPUlQgPSAweDBCQTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIID0gMHgwQkEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBCQTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9TVEFDS19ERVBUSCA9IDB4MEJBNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYID0gMHgwQkE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYID0gMHgwQkE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFUUklYID0gMHgwQkE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUVFJJQl9TVEFDS19ERVBUSCA9IDB4MEJCMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwQkIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1QgPSAweDBCQzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfVEVTVF9GVU5DID0gMHgwQkMxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1RfUkVGID0gMHgwQkMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJVEhFUiA9IDB4MEJEMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1QgPSAweDBCRTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDID0gMHgwQkUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EID0gMHgwQkUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QX01PREUgPSAweDBCRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTE9HSUNfT1AgPSAweDBCRjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTE9HSUNfT1AgPSAweDBCRjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVVYX0JVRkZFUlMgPSAweDBDMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFJBV19CVUZGRVIgPSAweDBDMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVBRF9CVUZGRVIgPSAweDBDMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9CT1ggPSAweDBDMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0NJU1NPUl9URVNUID0gMHgwQzExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0NMRUFSX1ZBTFVFID0gMHgwQzIwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX1dSSVRFTUFTSyA9IDB4MEMyMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSA9IDB4MEMyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9XUklURU1BU0sgPSAweDBDMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfTU9ERSA9IDB4MEMzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBX01PREUgPSAweDBDMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFQlVGRkVSID0gMHgwQzMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURVJFTyA9IDB4MEMzMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJfTU9ERSA9IDB4MEM0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgPSAweDBDNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU01PT1RIX0hJTlQgPSAweDBDNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEhfSElOVCA9IDB4MEM1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UID0gMHgwQzUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19ISU5UID0gMHgwQzU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1MgPSAweDBDNjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9HRU5fVCA9IDB4MEM2MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9SID0gMHgwQzYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX1EgPSAweDBDNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fSSA9IDB4MEM3MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfU19UT19TID0gMHgwQzcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1IgPSAweDBDNzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fRyA9IDB4MEM3MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19CID0gMHgwQzc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0EgPSAweDBDNzU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1JfVE9fUiA9IDB4MEM3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfR19UT19HID0gMHgwQzc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0IgPSAweDBDNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0FfVE9fQSA9IDB4MEM3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19JX1NJWkUgPSAweDBDQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX1NfVE9fU19TSVpFID0gMHgwQ0IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX1JfU0laRSA9IDB4MENCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfSV9UT19HX1NJWkUgPSAweDBDQjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0lfVE9fQl9TSVpFID0gMHgwQ0I0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9JX1RPX0FfU0laRSA9IDB4MENCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfUl9UT19SX1NJWkUgPSAweDBDQjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUElYRUxfTUFQX0dfVE9fR19TSVpFID0gMHgwQ0I3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BJWEVMX01BUF9CX1RPX0JfU0laRSA9IDB4MENCODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSVhFTF9NQVBfQV9UT19BX1NJWkUgPSAweDBDQjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX1NXQVBfQllURVMgPSAweDBDRjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX0xTQl9GSVJTVCA9IDB4MENGMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfUk9XX0xFTkdUSCA9IDB4MENGMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfU0tJUF9ST1dTID0gMHgwQ0YzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOUEFDS19TS0lQX1BJWEVMUyA9IDB4MENGNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UID0gMHgwQ0Y1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBQ0tfU1dBUF9CWVRFUyA9IDB4MEQwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0xTQl9GSVJTVCA9IDB4MEQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX1JPV19MRU5HVEggPSAweDBEMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1JPV1MgPSAweDBEMDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19TS0lQX1BJWEVMUyA9IDB4MEQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUNLX0FMSUdOTUVOVCA9IDB4MEQwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVBfQ09MT1IgPSAweDBEMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQX1NURU5DSUwgPSAweDBEMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfU0hJRlQgPSAweDBEMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfT0ZGU0VUID0gMHgwRDEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9TQ0FMRSA9IDB4MEQxNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRURfQklBUyA9IDB4MEQxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aT09NX1ggPSAweDBEMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfWk9PTV9ZID0gMHgwRDE3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX1NDQUxFID0gMHgwRDE4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJQVMgPSAweDBEMTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9TQ0FMRSA9IDB4MEQxQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTFVFX0JJQVMgPSAweDBEMUI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfU0NBTEUgPSAweDBEMUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfQklBUyA9IDB4MEQxRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9TQ0FMRSA9IDB4MEQxRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CSUFTID0gMHgwRDFGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FVkFMX09SREVSID0gMHgwRDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSUdIVFMgPSAweDBEMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSVBfUExBTkVTID0gMHgwRDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgPSAweDBEMzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BJWEVMX01BUF9UQUJMRSA9IDB4MEQzNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRIID0gMHgwRDM1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggPSAweDBEMzY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX05BTUVfU1RBQ0tfREVQVEggPSAweDBEMzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggPSAweDBEMzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggPSAweDBEMzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgPSAweDBEM0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NMSUVOVF9BVFRSSUJfU1RBQ0tfREVQVEggPSAweDBEM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCUElYRUxfQklUUyA9IDB4MEQ1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9CSVRTID0gMHgwRDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9CSVRTID0gMHgwRDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOX0JJVFMgPSAweDBENTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTID0gMHgwRDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX0JJVFMgPSAweDBENTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQklUUyA9IDB4MEQ1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JJVFMgPSAweDBENTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fUkVEX0JJVFMgPSAweDBENTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fR1JFRU5fQklUUyA9IDB4MEQ1OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BQ0NVTV9CTFVFX0JJVFMgPSAweDBENUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUNDVU1fQUxQSEFfQklUUyA9IDB4MEQ1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OQU1FX1NUQUNLX0RFUFRIID0gMHgwRDcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FVVE9fTk9STUFMID0gMHgwRDgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfQ09MT1JfNCA9IDB4MEQ5MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0lOREVYID0gMHgwRDkxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfTk9STUFMID0gMHgwRDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8xID0gMHgwRDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8yID0gMHgwRDk0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF8zID0gMHgwRDk1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVEVYVFVSRV9DT09SRF80ID0gMHgwRDk2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDFfVkVSVEVYXzMgPSAweDBEOTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9WRVJURVhfNCA9IDB4MEQ5ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0NPTE9SXzQgPSAweDBEQjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9JTkRFWCA9IDB4MERCMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX05PUk1BTCA9IDB4MERCMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSA9IDB4MERCMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMiA9IDB4MERCNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMyA9IDB4MERCNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCA9IDB4MERCNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX1ZFUlRFWF8zID0gMHgwREI3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BUDJfVkVSVEVYXzQgPSAweDBEQjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMV9HUklEX0RPTUFJTiA9IDB4MEREMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAxX0dSSURfU0VHTUVOVFMgPSAweDBERDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFQMl9HUklEX0RPTUFJTiA9IDB4MEREMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVAyX0dSSURfU0VHTUVOVFMgPSAweDBERDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV8xRCA9IDB4MERFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFXzJEID0gMHgwREUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSID0gMHgwREYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9TSVpFID0gMHgwREYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZFRURCQUNLX0JVRkZFUl9UWVBFID0gMHgwREYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NFTEVDVElPTl9CVUZGRVJfUE9JTlRFUiA9IDB4MERGMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1RJT05fQlVGRkVSX1NJWkUgPSAweDBERjQ7Ci0JLyogICAgICBHTF9URVhUVVJFX0JJTkRJTkdfMUQgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQklORElOR18yRCAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVkgKi8KLQkvKiAgICAgIEdMX0NPTE9SX0FSUkFZICovCi0JLyogICAgICBHTF9JTkRFWF9BUlJBWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAqLwotCS8qICAgICAgR0xfRURHRV9GTEFHX0FSUkFZICovCi0JLyogICAgICBHTF9WRVJURVhfQVJSQVlfU0laRSAqLwotCS8qICAgICAgR0xfVkVSVEVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX05PUk1BTF9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9UWVBFICovCi0JLyogICAgICBHTF9DT0xPUl9BUlJBWV9TVFJJREUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX0lOREVYX0FSUkFZX1NUUklERSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFICovCi0JLyogICAgICBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFICovCi0JLyogICAgICBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgKi8KLQkvKiAgICAgIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICovCi0KLQkvKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCi0JLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XSURUSCA9IDB4MTAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0hFSUdIVCA9IDB4MTAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVCA9IDB4MTAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUiA9IDB4MTAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JPUkRFUiA9IDB4MTAwNTsKLQkvKiAgICAgIEdMX1RFWFRVUkVfUkVEX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfR1JFRU5fU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9CTFVFX1NJWkUgKi8KLQkvKiAgICAgIEdMX1RFWFRVUkVfQUxQSEFfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9JTlRFTlNJVFlfU0laRSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9QUklPUklUWSAqLwotCS8qICAgICAgR0xfVEVYVFVSRV9SRVNJREVOVCAqLwotCi0JLyogSGludE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET05UX0NBUkUgPSAweDExMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFTVEVTVCA9IDB4MTEwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OSUNFU1QgPSAweDExMDI7Ci0KLQkvKiBIaW50VGFyZ2V0ICovCi0JLyogICAgICBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgKi8KLQkvKiAgICAgIEdMX1BPSU5UX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9MSU5FX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9QT0xZR09OX1NNT09USF9ISU5UICovCi0JLyogICAgICBHTF9GT0dfSElOVCAqLwotCS8qICAgICAgR0xfUEhPTkdfSElOVCAqLwotCi0JLyogSW5kZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAqLwotCS8qICAgICAgR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSICovCi0JLyogICAgICBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAqLwotCi0JLyogTGlnaHROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQwID0gMHg0MDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMSA9IDB4NDAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDIgPSAweDQwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQzID0gMHg0MDAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNCA9IDB4NDAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDUgPSAweDQwMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ2ID0gMHg0MDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNyA9IDB4NDAwNzsKLQotCS8qIExpZ2h0UGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU1CSUVOVCA9IDB4MTIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ESUZGVVNFID0gMHgxMjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQRUNVTEFSID0gMHgxMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPU0lUSU9OID0gMHgxMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRElSRUNUSU9OID0gMHgxMjA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRVhQT05FTlQgPSAweDEyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BPVF9DVVRPRkYgPSAweDEyMDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gPSAweDEyMDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OID0gMHgxMjA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiA9IDB4MTIwOTsKLQotCS8qIEludGVybGVhdmVkQXJyYXlzICovCi0JLyogICAgICBHTF9WMkYgKi8KLQkvKiAgICAgIEdMX1YzRiAqLwotCS8qICAgICAgR0xfQzRVQl9WMkYgKi8KLQkvKiAgICAgIEdMX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9DM0ZfVjNGICovCi0JLyogICAgICBHTF9OM0ZfVjNGICovCi0JLyogICAgICBHTF9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX1Y0RiAqLwotCS8qICAgICAgR0xfVDJGX0M0VUJfVjNGICovCi0JLyogICAgICBHTF9UMkZfQzNGX1YzRiAqLwotCS8qICAgICAgR0xfVDJGX04zRl9WM0YgKi8KLQkvKiAgICAgIEdMX1QyRl9DNEZfTjNGX1YzRiAqLwotCS8qICAgICAgR0xfVDRGX0M0Rl9OM0ZfVjRGICovCi0KLQkvKiBMaXN0TW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTVBJTEUgPSAweDEzMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NUElMRV9BTkRfRVhFQ1VURSA9IDB4MTMwMTsKLQotCS8qIExpc3ROYW1lVHlwZSAqLwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMXzJfQllURVMgKi8KLQkvKiAgICAgIEdMXzNfQllURVMgKi8KLQkvKiAgICAgIEdMXzRfQllURVMgKi8KLQotCS8qIExvZ2ljT3AgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEVBUiA9IDB4MTUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkQgPSAweDE1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EX1JFVkVSU0UgPSAweDE1MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09QWSA9IDB4MTUwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkRfSU5WRVJURUQgPSAweDE1MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9PUCA9IDB4MTUwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9YT1IgPSAweDE1MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1IgPSAweDE1MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9SID0gMHgxNTA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VRVUlWID0gMHgxNTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkVSVCA9IDB4MTUwQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUl9SRVZFUlNFID0gMHgxNTBCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFlfSU5WRVJURUQgPSAweDE1MEM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfSU5WRVJURUQgPSAweDE1MEQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkFORCA9IDB4MTUwRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRVQgPSAweDE1MEY7Ci0KLQkvKiBNYXBUYXJnZXQgKi8KLQkvKiAgICAgIEdMX01BUDFfQ09MT1JfNCAqLwotCS8qICAgICAgR0xfTUFQMV9JTkRFWCAqLwotCS8qICAgICAgR0xfTUFQMV9OT1JNQUwgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xICovCi0JLyogICAgICBHTF9NQVAxX1RFWFRVUkVfQ09PUkRfMiAqLwotCS8qICAgICAgR0xfTUFQMV9URVhUVVJFX0NPT1JEXzMgKi8KLQkvKiAgICAgIEdMX01BUDFfVEVYVFVSRV9DT09SRF80ICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF8zICovCi0JLyogICAgICBHTF9NQVAxX1ZFUlRFWF80ICovCi0JLyogICAgICBHTF9NQVAyX0NPTE9SXzQgKi8KLQkvKiAgICAgIEdMX01BUDJfSU5ERVggKi8KLQkvKiAgICAgIEdMX01BUDJfTk9STUFMICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMSAqLwotCS8qICAgICAgR0xfTUFQMl9URVhUVVJFX0NPT1JEXzIgKi8KLQkvKiAgICAgIEdMX01BUDJfVEVYVFVSRV9DT09SRF8zICovCi0JLyogICAgICBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNCAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfMyAqLwotCS8qICAgICAgR0xfTUFQMl9WRVJURVhfNCAqLwotCi0JLyogTWF0ZXJpYWxGYWNlICovCi0JLyogICAgICBHTF9GUk9OVCAqLwotCS8qICAgICAgR0xfQkFDSyAqLwotCS8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLQotCS8qIE1hdGVyaWFsUGFyYW1ldGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRU1JU1NJT04gPSAweDE2MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hJTklORVNTID0gMHgxNjAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgPSAweDE2MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVhFUyA9IDB4MTYwMzsKLQkvKiAgICAgIEdMX0FNQklFTlQgKi8KLQkvKiAgICAgIEdMX0RJRkZVU0UgKi8KLQkvKiAgICAgIEdMX1NQRUNVTEFSICovCi0KLQkvKiBNYXRyaXhNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXID0gMHgxNzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT04gPSAweDE3MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRSA9IDB4MTcwMjsKLQotCS8qIE1lc2hNb2RlMSAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQotCS8qIE1lc2hNb2RlMiAqLwotCS8qICAgICAgR0xfUE9JTlQgKi8KLQkvKiAgICAgIEdMX0xJTkUgKi8KLQkvKiAgICAgIEdMX0ZJTEwgKi8KLQotCS8qIE5vcm1hbFBvaW50ZXJUeXBlICovCi0JLyogICAgICBHTF9CWVRFICovCi0JLyogICAgICBHTF9TSE9SVCAqLwotCS8qICAgICAgR0xfSU5UICovCi0JLyogICAgICBHTF9GTE9BVCAqLwotCS8qICAgICAgR0xfRE9VQkxFICovCi0KLQkvKiBQaXhlbENvcHlUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1IgPSAweDE4MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEggPSAweDE4MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTCA9IDB4MTgwMjsKLQotCS8qIFBpeGVsRm9ybWF0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVggPSAweDE5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWCA9IDB4MTkwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQgPSAweDE5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEID0gMHgxOTAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUVOID0gMHgxOTA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMVUUgPSAweDE5MDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEEgPSAweDE5MDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCID0gMHgxOTA3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEgPSAweDE5MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFID0gMHgxOTA5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRV9BTFBIQSA9IDB4MTkwQTsKLQotCS8qIFBpeGVsTWFwICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19JICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfU19UT19TICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfSV9UT19BICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfUl9UT19SICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfR19UT19HICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQl9UT19CICovCi0JLyogICAgICBHTF9QSVhFTF9NQVBfQV9UT19BICovCi0KLQkvKiBQaXhlbFN0b3JlICovCi0JLyogICAgICBHTF9VTlBBQ0tfU1dBUF9CWVRFUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfVU5QQUNLX1JPV19MRU5HVEggKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1JPV1MgKi8KLQkvKiAgICAgIEdMX1VOUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfVU5QQUNLX0FMSUdOTUVOVCAqLwotCS8qICAgICAgR0xfUEFDS19TV0FQX0JZVEVTICovCi0JLyogICAgICBHTF9QQUNLX0xTQl9GSVJTVCAqLwotCS8qICAgICAgR0xfUEFDS19ST1dfTEVOR1RIICovCi0JLyogICAgICBHTF9QQUNLX1NLSVBfUk9XUyAqLwotCS8qICAgICAgR0xfUEFDS19TS0lQX1BJWEVMUyAqLwotCS8qICAgICAgR0xfUEFDS19BTElHTk1FTlQgKi8KLQotCS8qIFBpeGVsVHJhbnNmZXIgKi8KLQkvKiAgICAgIEdMX01BUF9DT0xPUiAqLwotCS8qICAgICAgR0xfTUFQX1NURU5DSUwgKi8KLQkvKiAgICAgIEdMX0lOREVYX1NISUZUICovCi0JLyogICAgICBHTF9JTkRFWF9PRkZTRVQgKi8KLQkvKiAgICAgIEdMX1JFRF9TQ0FMRSAqLwotCS8qICAgICAgR0xfUkVEX0JJQVMgKi8KLQkvKiAgICAgIEdMX0dSRUVOX1NDQUxFICovCi0JLyogICAgICBHTF9HUkVFTl9CSUFTICovCi0JLyogICAgICBHTF9CTFVFX1NDQUxFICovCi0JLyogICAgICBHTF9CTFVFX0JJQVMgKi8KLQkvKiAgICAgIEdMX0FMUEhBX1NDQUxFICovCi0JLyogICAgICBHTF9BTFBIQV9CSUFTICovCi0JLyogICAgICBHTF9ERVBUSF9TQ0FMRSAqLwotCS8qICAgICAgR0xfREVQVEhfQklBUyAqLwotCi0JLyogUGl4ZWxUeXBlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQklUTUFQID0gMHgxQTAwOwotCS8qICAgICAgR0xfQllURSAqLwotCS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX1VOU0lHTkVEX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQotCS8qIFBvbHlnb25Nb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlQgPSAweDFCMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORSA9IDB4MUIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSUxMID0gMHgxQjAyOwotCi0JLyogUmVhZEJ1ZmZlck1vZGUgKi8KLQkvKiAgICAgIEdMX0ZST05UX0xFRlQgKi8KLQkvKiAgICAgIEdMX0ZST05UX1JJR0hUICovCi0JLyogICAgICBHTF9CQUNLX0xFRlQgKi8KLQkvKiAgICAgIEdMX0JBQ0tfUklHSFQgKi8KLQkvKiAgICAgIEdMX0ZST05UICovCi0JLyogICAgICBHTF9CQUNLICovCi0JLyogICAgICBHTF9MRUZUICovCi0JLyogICAgICBHTF9SSUdIVCAqLwotCS8qICAgICAgR0xfQVVYMCAqLwotCS8qICAgICAgR0xfQVVYMSAqLwotCS8qICAgICAgR0xfQVVYMiAqLwotCS8qICAgICAgR0xfQVVYMyAqLwotCi0JLyogUmVuZGVyaW5nTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUiA9IDB4MUMwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GRUVEQkFDSyA9IDB4MUMwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TRUxFQ1QgPSAweDFDMDI7Ci0KLQkvKiBTaGFkaW5nTW9kZWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTEFUID0gMHgxRDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USCA9IDB4MUQwMTsKLQotCS8qIFN0ZW5jaWxGdW5jdGlvbiAqLwotCS8qICAgICAgR0xfTkVWRVIgKi8KLQkvKiAgICAgIEdMX0xFU1MgKi8KLQkvKiAgICAgIEdMX0VRVUFMICovCi0JLyogICAgICBHTF9MRVFVQUwgKi8KLQkvKiAgICAgIEdMX0dSRUFURVIgKi8KLQkvKiAgICAgIEdMX05PVEVRVUFMICovCi0JLyogICAgICBHTF9HRVFVQUwgKi8KLQkvKiAgICAgIEdMX0FMV0FZUyAqLwotCi0JLyogU3RlbmNpbE9wICovCi0JLyogICAgICBHTF9aRVJPICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfS0VFUCA9IDB4MUUwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBMQUNFID0gMHgxRTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1IgPSAweDFFMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUiA9IDB4MUUwMzsKLQkvKiAgICAgIEdMX0lOVkVSVCAqLwotCi0JLyogU3RyaW5nTmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFTkRPUiA9IDB4MUYwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJFUiA9IDB4MUYwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJTSU9OID0gMHgxRjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYVEVOU0lPTlMgPSAweDFGMDM7Ci0KLQkvKiBUZXh0dXJlQ29vcmROYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUyA9IDB4MjAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UID0gMHgyMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IgPSAweDIwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUSA9IDB4MjAwMzsKLQotCS8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KLQkvKiAgICAgIEdMX1NIT1JUICovCi0JLyogICAgICBHTF9JTlQgKi8KLQkvKiAgICAgIEdMX0ZMT0FUICovCi0JLyogICAgICBHTF9ET1VCTEUgKi8KLQotCS8qIFRleHR1cmVFbnZNb2RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9EVUxBVEUgPSAweDIxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDQUwgPSAweDIxMDE7Ci0JLyogICAgICBHTF9CTEVORCAqLwotCS8qICAgICAgR0xfUkVQTEFDRSAqLwotCi0JLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgPSAweDIyMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlZfQ09MT1IgPSAweDIyMDE7Ci0KLQkvKiBUZXh0dXJlRW52VGFyZ2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlYgPSAweDIzMDA7Ci0KLQkvKiBUZXh0dXJlR2VuTW9kZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9MSU5FQVIgPSAweDI0MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX0xJTkVBUiA9IDB4MjQwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUEhFUkVfTUFQID0gMHgyNDAyOwotCi0JLyogVGV4dHVyZUdlblBhcmFtZXRlciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgPSAweDI1MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT0JKRUNUX1BMQU5FID0gMHgyNTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VZRV9QTEFORSA9IDB4MjUwMjsKLQotCS8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUID0gMHgyNjAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUiA9IDB4MjYwMTsKLQotCS8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KLQkvKiAgICAgIEdMX05FQVJFU1QgKi8KLQkvKiAgICAgIEdMX0xJTkVBUiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgPSAweDI3MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUID0gMHgyNzAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMzsKLQotCS8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQUdfRklMVEVSID0gMHgyODAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiA9IDB4MjgwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfUyA9IDB4MjgwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfVCA9IDB4MjgwMzsKLQkvKiAgICAgIEdMX1RFWFRVUkVfQk9SREVSX0NPTE9SICovCi0JLyogICAgICBHTF9URVhUVVJFX1BSSU9SSVRZICovCi0KLQkvKiBUZXh0dXJlVGFyZ2V0ICovCi0JLyogICAgICBHTF9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9URVhUVVJFXzJEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzFEICovCi0JLyogICAgICBHTF9QUk9YWV9URVhUVVJFXzJEICovCi0KLQkvKiBUZXh0dXJlV3JhcE1vZGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTEFNUCA9IDB4MjkwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVBFQVQgPSAweDI5MDE7Ci0KLQkvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLwotCS8qICAgICAgR0xfU0hPUlQgKi8KLQkvKiAgICAgIEdMX0lOVCAqLwotCS8qICAgICAgR0xfRkxPQVQgKi8KLQkvKiAgICAgIEdMX0RPVUJMRSAqLwotCi0JLyogQ2xpZW50QXR0cmliTWFzayAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9QSVhFTF9TVE9SRV9CSVQgPSAweDAwMDAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9WRVJURVhfQVJSQVlfQklUID0gMHgwMDAwMDAwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElFTlRfQUxMX0FUVFJJQl9CSVRTID0gMHhmZmZmZmZmZjsKLQotCS8qIHBvbHlnb25fb2Zmc2V0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SID0gMHg4MDM4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTID0gMHgyQTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1BPSU5UID0gMHgyQTAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0xJTkUgPSAweDJBMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCA9IDB4ODAzNzsKLQotCS8qIHRleHR1cmUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQTQgPSAweDgwM0I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEE4ID0gMHg4MDNDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBMTIgPSAweDgwM0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEExNiA9IDB4ODAzRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0U0ID0gMHg4MDNGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTggPSAweDgwNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTIgPSAweDgwNDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTYgPSAweDgwNDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNF9BTFBIQTQgPSAweDgwNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFNl9BTFBIQTIgPSAweDgwNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFOF9BTFBIQTggPSAweDgwNDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTJfQUxQSEE0ID0gMHg4MDQ2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRTEyX0FMUEhBMTIgPSAweDgwNDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFMTZfQUxQSEExNiA9IDB4ODA0ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFkgPSAweDgwNDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5URU5TSVRZNCA9IDB4ODA0QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRFTlNJVFk4ID0gMHg4MDRCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTEyID0gMHg4MDRDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVEVOU0lUWTE2ID0gMHg4MDREOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1IzX0czX0IyID0gMHgyQTEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjQgPSAweDgwNEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNSA9IDB4ODA1MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I4ID0gMHg4MDUxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEwID0gMHg4MDUyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjEyID0gMHg4MDUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjE2ID0gMHg4MDU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEyID0gMHg4MDU1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE0ID0gMHg4MDU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjVfQTEgPSAweDgwNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTggPSAweDgwNTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCMTBfQTIgPSAweDgwNTk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQTEyID0gMHg4MDVBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkExNiA9IDB4ODA1QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFRF9TSVpFID0gMHg4MDVDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfR1JFRU5fU0laRSA9IDB4ODA1RDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JMVUVfU0laRSA9IDB4ODA1RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0FMUEhBX1NJWkUgPSAweDgwNUY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRSA9IDB4ODA2MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFID0gMHg4MDYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST1hZX1RFWFRVUkVfMUQgPSAweDgwNjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPWFlfVEVYVFVSRV8yRCA9IDB4ODA2NDsKLQotCS8qIHRleHR1cmVfb2JqZWN0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9QUklPUklUWSA9IDB4ODA2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1JFU0lERU5UID0gMHg4MDY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQklORElOR18xRCA9IDB4ODA2ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgPSAweDgwNjk7Ci0KLQkvKiB2ZXJ0ZXhfYXJyYXkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVkgPSAweDgwNzQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZID0gMHg4MDc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZID0gMHg4MDc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZID0gMHg4MDc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFID0gMHg4MDdBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9UWVBFID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgPSAweDgwN0M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEUgPSAweDgwN0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERSA9IDB4ODA3RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFID0gMHg4MDgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1RZUEUgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFID0gMHg4MDgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1RZUEUgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFID0gMHg4MDg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgPSAweDgwODk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgPSAweDgwOEE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERSA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiA9IDB4ODA4RjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSID0gMHg4MDkwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOREVYX0FSUkFZX1BPSU5URVIgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSID0gMHg4MDkyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VER0VfRkxBR19BUlJBWV9QT0lOVEVSID0gMHg4MDkzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1YyRiA9IDB4MkEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WM0YgPSAweDJBMjE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WMkYgPSAweDJBMjI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzRVQl9WM0YgPSAweDJBMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQzNGX1YzRiA9IDB4MkEyNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OM0ZfVjNGID0gMHgyQTI1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0M0Rl9OM0ZfVjNGID0gMHgyQTI2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1QyRl9WM0YgPSAweDJBMjc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDRGX1Y0RiA9IDB4MkEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UMkZfQzRVQl9WM0YgPSAweDJBMjk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0MzRl9WM0YgPSAweDJBMkE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX04zRl9WM0YgPSAweDJBMkI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVDJGX0M0Rl9OM0ZfVjNGID0gMHgyQTJDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1Q0Rl9DNEZfTjNGX1Y0RiA9IDB4MkEyRDsKLQotCS8qIEV4dGVuc2lvbnMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfdmVydGV4X2FycmF5ID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFRfYmdyYSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhUX3BhbGV0dGVkX3RleHR1cmUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zd2FwX2hpbnQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9kcmF3X3JhbmdlX2VsZW1lbnRzID0gMTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XSU5fcGhvbmdfc2hhZGluZyAgICAgICAgICAgICAgPSAxOwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dJTl9zcGVjdWxhcl9mb2cgICAgICAgICAgICAgICA9IDE7Ci0KLQkvKiBFWFRfdmVydGV4X2FycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX0VYVCA9IDB4ODA3NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfRVhUID0gMHg4MDc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX0VYVCA9IDB4ODA3NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9FWFQgPSAweDgwNzc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9FWFQgPSAweDgwNzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCA9IDB4ODA3OTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgPSAweDgwN0E7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwN0Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1RZUEVfRVhUID0gMHg4MDdFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREVfRVhUID0gMHg4MDdGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRV9FWFQgPSAweDgwODE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgPSAweDgwODI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4MzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgPSAweDgwODU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkRFWF9BUlJBWV9DT1VOVF9FWFQgPSAweDgwODc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCA9IDB4ODA4ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUID0gMHg4MDg5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0NPVU5UX0VYVCA9IDB4ODA4QjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCA9IDB4ODA4QzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfQ09VTlRfRVhUID0gMHg4MDhEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA4RTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOEY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSX0VYVCA9IDB4ODA5MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgPSAweDgwOTM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9VQkxFX0VYVCA9IEdMX0RPVUJMRTsKLQotCS8qIEVYVF9iZ3JhICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkdSX0VYVCA9IDB4ODBFMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CR1JBX0VYVCA9IDB4ODBFMTsKLQotCS8qIEVYVF9wYWxldHRlZF90ZXh0dXJlICovCi0KLQkvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBHTF9DT0xPUl9UQUJMRV8qX1NHSSBlbnVtZXJhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfRk9STUFUX0VYVCA9IDB4ODBEODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9UQUJMRV9XSURUSF9FWFQgPSAweDgwRDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfRVhUID0gMHg4MERBOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0dSRUVOX1NJWkVfRVhUID0gMHg4MERCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9FWFQgPSAweDgwREM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9FWFQgPSAweDgwREQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfVEFCTEVfTFVNSU5BTkNFX1NJWkVfRVhUID0gMHg4MERFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX0VYVCA9IDB4ODBERjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYMV9FWFQgPSAweDgwRTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgyX0VYVCA9IDB4ODBFMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9JTkRFWDRfRVhUID0gMHg4MEU0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0lOREVYOF9FWFQgPSAweDgwRTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxMl9FWFQgPSAweDgwRTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfSU5ERVgxNl9FWFQgPSAweDgwRTc7Ci0KLQkvKiBXSU5fZHJhd19yYW5nZV9lbGVtZW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9FTEVNRU5UU19WRVJUSUNFU19XSU4gPSAweDgwRTg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVNfV0lOID0gMHg4MEU5OwotCi0JLyogV0lOX3Bob25nX3NoYWRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QSE9OR19XSU4gPSAweDgwRUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEhPTkdfSElOVF9XSU4gPSAweDgwRUI7Ci0KLQkvKiBXSU5fc3BlY3VsYXJfZm9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX1NQRUNVTEFSX1RFWFRVUkVfV0lOID0gMHg4MEVDOwotCi0JLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBPcGVuR0wgdjEuMCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xPR0lDX09QID0gR0xfSU5ERVhfTE9HSUNfT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT01QT05FTlRTID0gR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQWNjdW0gKGludCBvcCwgZmxvYXQgdmFsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xBbHBoYUZ1bmMgKGludCBmdW5jLCBmbG9hdCByZWYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gZ2xBcmVUZXh0dXJlc1Jlc2lkZW50IChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGJvb2xlYW5bXSByZXNpZGVuY2VzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQXJyYXlFbGVtZW50IChpbnQgaW5kZXgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xCZWdpbiAoaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFbmQgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpbmRUZXh0dXJlIChpbnQgdGFyZ2V0LCBpbnQgdGV4dHVyZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJpdG1hcCAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCB4b3JpZywgZmxvYXQgeW9yaWcsIGZsb2F0IHhtb3ZlLCBmbG9hdCB5bW92ZSwgYnl0ZVtdIGJpdG1hcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEJsZW5kRnVuYyAoaW50IHNmYWN0b3IsIGludCBkZmFjdG9yKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3QgKGludCBsaXN0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2FsbExpc3RzIChpbnQgbiwgaW50IHR5cGUsIGJ5dGVbXSBsaXN0cyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENhbGxMaXN0cyAoaW50IG4sIGludCB0eXBlLCBjaGFyW10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDYWxsTGlzdHMgKGludCBuLCBpbnQgdHlwZSwgaW50W10gbGlzdHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhciAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGVhckFjY3VtIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyQ29sb3IgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJEZXB0aCAoZG91YmxlIGRlcHRoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ2xlYXJJbmRleCAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENsZWFyU3RlbmNpbCAoaW50IHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDbGlwUGxhbmUgKGludCBwbGFuZSwgZG91YmxlW10gZXF1YXRpb24pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNiIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZCAoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM2YgKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNpIChpbnQgcmVkLCBpbnQgZ3JlZW4sIGludCBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzcyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3ViIChieXRlIHJlZCwgYnl0ZSBncmVlbiwgYnl0ZSBibHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjN1cyAoc2hvcnQgcmVkLCBzaG9ydCBncmVlbiwgc2hvcnQgYmx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRkIChkb3VibGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmIChmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNGkgKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUsIGludCBhbHBoYSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yNHMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWIgKGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGJ5dGUgYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1aSAoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSwgaW50IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXMgKHNob3J0IHJlZCwgc2hvcnQgZ3JlZW4sIHNob3J0IGJsdWUsIHNob3J0IGFscGhhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjNzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3IzdWJ2IChieXRlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvbG9yM3VzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0aXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvcjR1YnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3I0dXN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hc2sgKGJvb2xlYW4gcmVkLCBib29sZWFuIGdyZWVuLCBib29sZWFuIGJsdWUsIGJvb2xlYW4gYWxwaGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvck1hdGVyaWFsIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclBvaW50ZXIgKGludCBzaXplLCBpbnQgdHlwZSwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29sb3JUYWJsZUVYVCAoaW50IHRhcmdldCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBkYXRhKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb2xvclN1YlRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGZvcm1hdCwgaW50IHR5cGUsIGludFtdIGRhdGEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5UGl4ZWxzIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHR5cGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4SW1hZ2UxRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgaW50ZXJuYWxGb3JtYXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgYm9yZGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ29weVRleEltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IGludGVybmFsRm9ybWF0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJvcmRlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbENvcHlUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCk7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsQ3VsbEZhY2UgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVsZXRlTGlzdHMgKGludCBsaXN0LCBpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhGdW5jIChpbnQgZnVuYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERlcHRoTWFzayAoYm9vbGVhbiBmbGFnKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGVwdGhSYW5nZSAoZG91YmxlIHpuZWFyLCBkb3VibGUgemZhcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdBcnJheXMgKGludCBtb2RlLCBpbnQgZmlyc3QsIGludCBjb3VudCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbERyYXdCdWZmZXIgKGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRHJhd0VsZW1lbnRzIChpbnQgbW9kZSwgaW50IGNvdW50LCBpbnQgdHlwZSwgaW50W10gaW5kaWNlcyk7IC8qIE1VTFRJUExFUyBUWVBFUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEcmF3UGl4ZWxzIChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRWRnZUZsYWcgKGJvb2xlYW4gZmxhZyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVkZ2VGbGFndiAoYm9vbGVhbltdIGZsYWcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFZGdlRmxhZ1BvaW50ZXIgKGludCBzdHJpZGUsIGJvb2xlYW5bXSBwb2ludGVyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRW5hYmxlIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRGlzYWJsZSAoaW50IGNhcCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlIChpbnQgYXJyYXkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKGludCBhcnJheSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFkIChkb3VibGUgdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDFmIChmbG9hdCB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMmQgKGRvdWJsZSB1LCBkb3VibGUgdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxDb29yZDJmIChmbG9hdCB1LCBmbG9hdCB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWR2IChkb3VibGVbXSB1KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbENvb3JkMWZ2IChmbG9hdFtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZHYgKGRvdWJsZVtdIHUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsQ29vcmQyZnYgKGZsb2F0W10gdSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEV2YWxNZXNoMSAoaW50IG1vZGUsIGludCBpMSwgaW50IGkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbE1lc2gyIChpbnQgbW9kZSwgaW50IGkxLCBpbnQgaTIsIGludCBqMSwgaW50IGoyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRXZhbFBvaW50MSAoaW50IGkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xFdmFsUG9pbnQyIChpbnQgaSwgaW50IGopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGZWVkYmFja0J1ZmZlciAoaW50IHNpemUsIGludCB0eXBlLCBmbG9hdFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZpbmlzaCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRmx1c2ggKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2YgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xGb2dpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZvZ2Z2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRm9naXYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsRnJvbnRGYWNlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEZydXN0dW0gKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3AsIGRvdWJsZSB6bmVhciwgZG91YmxlIHpmYXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbEdlbkxpc3RzIChpbnQgcmFuZ2UpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZW5UZXh0dXJlcyAoaW50IG4sIGludFtdIHRleHR1cmVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Qm9vbGVhbnYgKGludCBwbmFtZSwgYm9vbGVhbltdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldERvdWJsZXYgKGludCBwbmFtZSwgZG91YmxlW10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0RmxvYXR2IChpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0SW50ZWdlcnYgKGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q2xpcFBsYW5lIChpbnQgcGxhbmUsIGRvdWJsZVtdIGVxdWF0aW9uKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlRVhUIChpbnQgdGFyZ2V0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gZGF0YSk7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2RVhUIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRFcnJvciAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRmdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldE1hcGR2IChpbnQgdGFnZXJ0LCBpbnQgcXVlcnksIGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBmdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXBpdiAoaW50IHRhZ2VydCwgaW50IHF1ZXJ5LCBpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0TWF0ZXJpYWxmdiAoaW50IGZhY2UsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRNYXRlcmlhbGl2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcGZ2IChpbnQgbWFwLCBmbG9hdFtdIHZhbHVlcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFBpeGVsTWFwdWl2IChpbnQgbWFwLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQaXhlbE1hcHVzdiAoaW50IG1hcCwgc2hvcnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRQb2ludGVydiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCS8qIFRFU1QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0UG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xHZXRTdHJpbmcgKGludCBuYW1lKTsKLQkvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleEVudmZ2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4RW52aXYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsR2V0VGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhJbWFnZSAoaW50IHRhcmdldCwgaW50IGxldmVsLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleExldmVsUGFyYW1ldGVyaXYgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEdldFRleFBhcmFtZXRlcml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEhpbnQgKGludCB0YXJnZXQsIGludCBtb2RlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhkIChkb3VibGUgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4ZiAoZmxvYXQgYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4aSAoaW50IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleHMgKHNob3J0IGMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleGR2IChkb3VibGVbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhmdiAoZmxvYXRbXSBjKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5kZXhpdiAoaW50W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4c3YgKHNob3J0W10gYyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEluZGV4TWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbmRleFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsKLQkvKiBNVUxUSVBMRVMgVFlQRVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsSW5pdE5hbWVzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xJbnRlcmxlYXZlZEFycmF5cyAoaW50IGZvcm1hdCwgaW50IHN0cmlkZSwgaW50W10gcG9pbnRlcik7Ci0JLyogQ0hFQ0sgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNFbmFibGVkIChpbnQgY2FwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsSXNMaXN0IChpbnQgbGlzdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbElzVGV4dHVyZSAoaW50IHRleHR1cmUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0aSAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0ZnYgKGludCBsaWdodCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodGZ2IChpbnQgbGlnaHQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRpdiAoaW50IGxpZ2h0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGlnaHRNb2RlbGYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMaWdodE1vZGVsZnYgKGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpZ2h0TW9kZWxpdiAoaW50IHBuYW1lLCBpbnRbXSBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpbmVTdGlwcGxlIChpbnQgZmFjdG9yLCBzaG9ydCBwYXR0ZXJuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTGluZVdpZHRoIChmbG9hdCB3aWR0aCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExpc3RCYXNlIChpbnQgYmFzZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbExvYWRJZGVudGl0eSAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE1hdHJpeGQgKGRvdWJsZVtdIG0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xMb2FkTWF0cml4ZiAoZmxvYXRbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9hZE5hbWUgKGludCBuYW1lKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTG9naWNPcCAoaW50IG9wY29kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE1hcDFkIChpbnQgdGFyZ2V0LCBkb3VibGUgdTEsIGRvdWJsZSB1MiwgaW50IHN0cmlkZSwgaW50IG9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAxZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgc3RyaWRlLCBpbnQgb3JkZXIsIGZsb2F0W10gcG9pbnRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwMmQgKGludCB0YXJnZXQsIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZG91YmxlIHYxLCBkb3VibGUgdjIsIGludCB2c3RyaWRlLCBpbnQgdm9yZGVyLCBkb3VibGVbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXAyZiAoaW50IHRhcmdldCwgZmxvYXQgdTEsIGZsb2F0IHUyLCBpbnQgdXN0cmlkZSwgaW50IHVvcmRlciwgZmxvYXQgdjEsIGZsb2F0IHYyLCBpbnQgdnN0cmlkZSwgaW50IHZvcmRlciwgZmxvYXRbXSBwb2ludHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWQgKGludCB1biwgZG91YmxlIHUxLCBkb3VibGUgdTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXBHcmlkMWYgKGludCB1biwgZmxvYXQgdTEsIGZsb2F0IHUyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJkIChpbnQgdW4sIGRvdWJsZSB1MSwgZG91YmxlIHUyLCBpbnQgdm0sIGRvdWJsZSB2MSwgZG91YmxlIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWFwR3JpZDJmIChpbnQgdW4sIGZsb2F0IHUxLCBmbG9hdCB1MiwgaW50IHZtLCBmbG9hdCB2MSwgZmxvYXQgdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGYgKGludCBmYWNlLCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpIChpbnQgZmFjZSwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRlcmlhbGZ2IChpbnQgZmFjZSwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTWF0ZXJpYWxpdiAoaW50IGZhY2UsIGludCBwbmFtZSwgaW50W10gcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xNYXRyaXhNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE11bHRNYXRyaXhkIChkb3VibGVbXSBtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTXVsdE1hdHJpeGYgKGZsb2F0W10gbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5ld0xpc3QgKGludCBsaXN0LCBpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbEVuZExpc3QgKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNiIChieXRlIG54LCBieXRlIG55LCBieXRlIG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2QgKGRvdWJsZSBueCwgZG91YmxlIG55LCBkb3VibGUgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzZiAoZmxvYXQgbngsIGZsb2F0IG55LCBmbG9hdCBueik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbDNpIChpbnQgbngsIGludCBueSwgaW50IG56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM3MgKHNob3J0IG54LCBzaG9ydCBueSwgc2hvcnQgbnopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzYnYgKGJ5dGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsTm9ybWFsM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xOb3JtYWwzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE5vcm1hbFBvaW50ZXIgKGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbE9ydGhvIChkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLCBkb3VibGUgdG9wLCBkb3VibGUgem5lYXIsIGRvdWJsZSB6ZmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGFzc1Rocm91Z2ggKGZsb2F0IHRva2VuKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXBmdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIGZsb2F0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxNYXB1aXYgKGludCBtYXAsIGludCBtYXBzaXplLCBpbnRbXSB2YWx1ZXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbE1hcHVzdiAoaW50IG1hcCwgaW50IG1hcHNpemUsIHNob3J0W10gdmFsdWVzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUGl4ZWxTdG9yZWYgKGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFN0b3JlaSAoaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQaXhlbFRyYW5zZmVyZiAoaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsVHJhbnNmZXJpIChpbnQgcG5hbWUsIGludCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBpeGVsWm9vbSAoZmxvYXQgeGZhY3RvciwgZmxvYXQgeWZhY3Rvcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvaW50U2l6ZSAoZmxvYXQgc2l6ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvbHlnb25Nb2RlIChpbnQgZmFjZSwgaW50IG1vZGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb2x5Z29uT2Zmc2V0IChmbG9hdCBmYWN0b3IsIGZsb2F0IHVuaXRzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9seWdvblN0aXBwbGUgKGJ5dGVbXSBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHJpb3JpdGl6ZVRleHR1cmVzIChpbnQgbiwgaW50W10gdGV4dHVyZXMsIGZsb2F0W10gcHJpb3JpdGllcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFB1c2hBdHRyaWIgKGludCBtYXNrKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wQXR0cmliICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoQ2xpZW50QXR0cmliIChpbnQgbWFzayk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFBvcENsaWVudEF0dHJpYiAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUHVzaE1hdHJpeCAoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUG9wTWF0cml4ICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQdXNoTmFtZSAoaW50IG5hbWUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xQb3BOYW1lICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZCAoZG91YmxlIHgsIGRvdWJsZSB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMmYgKGZsb2F0IHgsIGZsb2F0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyaSAoaW50IHgsIGludCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zMnMgKHNob3J0IHgsIHNob3J0IHkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczNmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2kgKGludCB4LCBpbnQgeSwgaW50IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzcyAoc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGkgKGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHMgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHosIHNob3J0IHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczJzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zM2Z2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3MzaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSYXN0ZXJQb3Mzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJhc3RlclBvczRmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmFzdGVyUG9zNHN2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWFkQnVmZmVyIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlYWRQaXhlbHMgKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIFRZUEVTIEFSUkFZICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RkIChkb3VibGUgeDEsIGRvdWJsZSB5MSwgZG91YmxlIHgyLCBkb3VibGUgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZiAoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aSAoaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdHMgKHNob3J0IHgxLCBzaG9ydCB5MSwgc2hvcnQgeDIsIHNob3J0IHkyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsUmVjdGR2IChkb3VibGVbXSB2MSwgZG91YmxlW10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0ZnYgKGZsb2F0W10gdjEsIGZsb2F0W10gdjIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xSZWN0aXYgKGludFtdIHYxLCBpbnRbXSB2Mik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJlY3RzdiAoc2hvcnRbXSB2LCBzaG9ydFtdIHYyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xSZW5kZXJNb2RlIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWQgKGRvdWJsZSBhbmdsZSwgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFJvdGF0ZWYgKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVkIChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2NhbGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsU2Npc3NvciAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludFtdIGJ1ZmZlcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFNlbGVjdEJ1ZmZlciAoaW50IHNpemUsIGludCBidWZmZXIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTaGFkZU1vZGVsIChpbnQgbW9kZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFN0ZW5jaWxGdW5jIChpbnQgZnVuYywgaW50IHJlZiwgaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsTWFzayAoaW50IG1hc2spOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xTdGVuY2lsT3AgKGludCBmYWlsLCBpbnQgemZhaWwsIGludCB6cGFzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWQgKGRvdWJsZSBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZiAoZmxvYXQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWkgKGludCBzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxcyAoc2hvcnQgcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmQgKGRvdWJsZSBzLCBkb3VibGUgdCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmYgKGZsb2F0IHMsIGZsb2F0IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJpIChpbnQgcywgaW50IHQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDJzIChzaG9ydCBzLCBzaG9ydCB0KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZCAoZG91YmxlIHMsIGRvdWJsZSB0LCBkb3VibGUgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2YgKGZsb2F0IHMsIGZsb2F0IHQsIGZsb2F0IHIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhDb29yZDNpIChpbnQgcywgaW50IHQsIGludCByKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzcyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgcik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGQgKGRvdWJsZSBzLCBkb3VibGUgdCwgZG91YmxlIHIsIGRvdWJsZSBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZiAoZmxvYXQgcywgZmxvYXQgdCwgZmxvYXQgciwgZmxvYXQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGkgKGludCBzLCBpbnQgdCwgaW50IHIsIGludCBxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0cyAoc2hvcnQgcywgc2hvcnQgdCwgc2hvcnQgciwgc2hvcnQgcSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMWl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQxc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkMml2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2R2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkM2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQzc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkNGl2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4Q29vcmQ0c3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleENvb3JkUG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLypNVUxUSVBMRVMgQVJSQVlTIC0gQ0hFQ0sgTVNESywgQ09VTlQgUEFSQU0gTUlTU0lORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmIChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGZsb2F0IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4RW52aSAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhFbnZmdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEVudml2IChpbnQgdGFyZ2V0LCBpbnQgcG5hbWUsIGludFtdIHBhcmFtcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleEdlbmQgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGUgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mIChpbnQgY29vcmQsIGludCBwbmFtZSwgZmxvYXQgcGFyYW0pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5pIChpbnQgY29vcmQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuZHYgKGludCBjb29yZCwgaW50IHBuYW1lLCBkb3VibGVbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhHZW5mdiAoaW50IGNvb3JkLCBpbnQgcG5hbWUsIGZsb2F0W10gcGFyYW1zKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4R2VuaXYgKGludCBjb29yZCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50W10gcGl4ZWxzKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhJbWFnZTJEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCBpbnRlcm5hbEZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYm9yZGVyLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIHBpeGVscyk7IC8qIE1VTFRJUExFUyBBUlJBWVMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdCBwYXJhbSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFBhcmFtZXRlcmkgKGludCB0YXJnZXQsIGludCBwbmFtZSwgaW50IHBhcmFtKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVGV4UGFyYW1ldGVyZnYgKGludCB0YXJnZXQsIGludCBwbmFtZSwgZmxvYXRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoaW50IHRhcmdldCwgaW50IHBuYW1lLCBpbnRbXSBwYXJhbXMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUZXhTdWJJbWFnZTFEIChpbnQgdGFyZ2V0LCBpbnQgbGV2ZWwsIGludCB4b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRleFN1YkltYWdlMkQgKGludCB0YXJnZXQsIGludCBsZXZlbCwgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIGludCB0eXBlLCBpbnRbXSBwaXhlbHMpOyAvKiBNVUxUSVBMRVMgQVJSQVlTICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFRyYW5zbGF0ZWQgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xUcmFuc2xhdGVmIChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmQgKGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJmIChmbG9hdCB4LCBmbG9hdCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmkgKGludCB4LCBpbnQgeSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDJzIChzaG9ydCB4LCBzaG9ydCB5KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2QgKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgzZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNpIChpbnQgeCwgaW50IHksIGludCB6KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3MgKHNob3J0IHgsIHNob3J0IHksIHNob3J0IHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZCAoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZiAoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpIChpbnQgeCwgaW50IHksIGludCB6LCBpbnQgdyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzIChzaG9ydCB4LCBzaG9ydCB5LCBzaG9ydCB6LCBzaG9ydCB3KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmR2IChkb3VibGVbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4MmZ2IChmbG9hdFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyaXYgKGludFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXgyc3YgKHNob3J0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNkdiAoZG91YmxlW10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDNmdiAoZmxvYXRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M2l2IChpbnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4M3N2IChzaG9ydFtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZHYgKGRvdWJsZVtdIHYpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWZXJ0ZXg0ZnYgKGZsb2F0W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRpdiAoaW50W10gdik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFZlcnRleDRzdiAoc2hvcnRbXSB2KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsVmVydGV4UG9pbnRlciAoaW50IHNpemUsIGludCB0eXBlLCBpbnQgc3RyaWRlLCBpbnRbXSBwb2ludGVyKTsgLyogTVVMVElQTEVTIEFSUkFZUyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xWaWV3cG9ydCAoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9vcGVuZ2wvR0xVLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMxZTMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL29wZW5nbC9HTFUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmdsOwotCi0KLXB1YmxpYyBjbGFzcyBHTFUgewotCi0JLyogVmVyc2lvbiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJTSU9OXzFfMSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1ZFUlNJT05fMV8yID0gMTsKLQkKLQkvKiBFcnJvcnM6IChyZXR1cm4gdmFsdWUgMCA9IG5vIGVycm9yKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlZBTElEX0VOVU0gPSAxMDA5MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOVkFMSURfVkFMVUUgPSAxMDA5MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVF9PRl9NRU1PUlkgPSAxMDA5MDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOQ09NUEFUSUJMRV9HTF9WRVJTSU9OID0gMTAwOTAzOwotCQotCS8qIFN0cmluZ05hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVkVSU0lPTiA9IDEwMDgwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURU5TSU9OUyA9IDEwMDgwMTsKLQkKLQkKLQkvKioqKiAgICAgICAgICAgUXVhZHJpYyBjb25zdGFudHMgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIFF1YWRyaWNOb3JtYWwgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU01PT1RIID0gMTAwMDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9GTEFUID0gMTAwMDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OT05FID0gMTAwMDAyOwotCQotCS8qIFF1YWRyaWNEcmF3U3R5bGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUE9JTlQgPSAxMDAwMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0xJTkUgPSAxMDAwMTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0ZJTEwgPSAxMDAwMTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1NJTEhPVUVUVEUgPSAxMDAwMTM7Ci0JCi0JLyogUXVhZHJpY09yaWVudGF0aW9uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVFNJREUgPSAxMDAwMjA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0lOU0lERSA9IDEwMDAyMTsKLQkKLQkvKiBDYWxsYmFjayB0eXBlczogKi8KLQkvKiAgICAgIEdMVV9FUlJPUiAgICAgICAgICAgICAgIDEwMDEwMyAqLwotCQotCQotCS8qKioqICAgICAgICAgICBUZXNzZWxhdGlvbiBjb25zdGFudHMgICAgICAgICAgICoqKiovCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgR0xVX1RFU1NfTUFYX0NPT1JEID0gMS4wZTE1MDsKLQkKLQkvKiBUZXNzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX1JVTEUgPSAxMDAxNDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQk9VTkRBUllfT05MWSA9IDEwMDE0MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19UT0xFUkFOQ0UgPSAxMDAxNDI7Ci0JCi0JLyogVGVzc1dpbmRpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX09ERCA9IDEwMDEzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05PTlpFUk8gPSAxMDAxMzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfV0lORElOR19QT1NJVElWRSA9IDEwMDEzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19XSU5ESU5HX05FR0FUSVZFID0gMTAwMTMzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1dJTkRJTkdfQUJTX0dFUV9UV08gPSAxMDAxMzQ7Ci0JCi0JLyogVGVzc0NhbGxiYWNrICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQkVHSU4gPSAxMDAxMDA7ICAvKiB2b2lkIChDQUxMQkFDSyopKEdMZW51bSAgICB0eXBlKSAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19WRVJURVggPSAxMDAxMDE7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQgICAgICAqZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FTkQgPSAxMDAxMDI7ICAvKiB2b2lkIChDQUxMQkFDSyopKHZvaWQpICAgICAgICAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUiA9IDEwMDEwMzsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xlbnVtICAgIGVycm5vKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBRyA9IDEwMDEwNDsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xib29sZWFuIGJvdW5kYXJ5RWRnZSkgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09NQklORSA9IDEwMDEwNTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0KSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19CRUdJTl9EQVRBID0gMTAwMTA2OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgdHlwZSwgIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX1ZFUlRFWF9EQVRBID0gMTAwMTA3OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKmRhdGEsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VORF9EQVRBID0gMTAwMTA4OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKSh2b2lkICAgICAgKnBvbHlnb25fZGF0YSkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUl9EQVRBID0gMTAwMTA5OyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGVudW0gICAgZXJybm8sIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VER0VfRkxBR19EQVRBID0gMTAwMTEwOyAgLyogdm9pZCAoQ0FMTEJBQ0sqKShHTGJvb2xlYW4gYm91bmRhcnlFZGdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0NPTUJJTkVfREFUQSA9IDEwMDExMTsgIC8qIHZvaWQgKENBTExCQUNLKikoR0xkb3VibGUgIGNvb3Jkc1szXSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKmRhdGFbNF0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCAgIHdlaWdodFs0XSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgKipkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqcG9seWdvbl9kYXRhKSAqLwotCQotCS8qIFRlc3NFcnJvciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SMSA9IDEwMDE1MTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjIgPSAxMDAxNTI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1IzID0gMTAwMTUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNCA9IDEwMDE1NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjUgPSAxMDAxNTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfRVJST1I2ID0gMTAwMTU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX0VSUk9SNyA9IDEwMDE1NzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19FUlJPUjggPSAxMDAxNTg7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfTUlTU0lOR19CRUdJTl9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfQkVHSU5fQ09OVE9VUiA9IEdMVV9URVNTX0VSUk9SMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVEVTU19NSVNTSU5HX0VORF9QT0xZR09OID0gR0xVX1RFU1NfRVJST1IzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX01JU1NJTkdfRU5EX0NPTlRPVVIgPSBHTFVfVEVTU19FUlJPUjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1RFU1NfQ09PUkRfVE9PX0xBUkdFID0gR0xVX1RFU1NfRVJST1I1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9URVNTX05FRURfQ09NQklORV9DQUxMQkFDSyA9IEdMVV9URVNTX0VSUk9SNjsKLQkKLQkvKioqKiAgICAgICAgICAgTlVSQlMgY29uc3RhbnRzICAgICAgICAgICAgICAgICAqKioqLwotCQotCS8qIE51cmJzUHJvcGVydHkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQVVUT19MT0FEX01BVFJJWCA9IDEwMDIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ1VMTElORyA9IDEwMDIwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfU0FNUExJTkdfVE9MRVJBTkNFID0gMTAwMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9ESVNQTEFZX01PREUgPSAxMDAyMDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfVE9MRVJBTkNFID0gMTAwMjAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9TQU1QTElOR19NRVRIT0QgPSAxMDAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VfU1RFUCA9IDEwMDIwNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfVl9TVEVQID0gMTAwMjA3OwotCQotCS8qIE51cmJzU2FtcGxpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfUEFUSF9MRU5HVEggPSAxMDAyMTU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1BBUkFNRVRSSUNfRVJST1IgPSAxMDAyMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0RPTUFJTl9ESVNUQU5DRSA9IDEwMDIxNzsKLQkKLQkKLQkvKiBOdXJic1RyaW0gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTUFQMV9UUklNXzIgPSAxMDAyMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX01BUDFfVFJJTV8zID0gMTAwMjExOwotCQotCS8qIE51cmJzRGlzcGxheSAqLwotCS8qICAgICAgR0xVX0ZJTEwgICAgICAgICAgICAgICAgMTAwMDEyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX09VVExJTkVfUE9MWUdPTiA9IDEwMDI0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfT1VUTElORV9QQVRDSCA9IDEwMDI0MTsKLQkKLQkvKiBOdXJic0NhbGxiYWNrICovCi0JLyogICAgICBHTFVfRVJST1IgICAgICAgICAgICAgICAxMDAxMDMgKi8KLQkKLQkvKiBOdXJic0Vycm9ycyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEgPSAxMDAyNTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SMiA9IDEwMDI1MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1IzID0gMTAwMjUzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjQgPSAxMDAyNTQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SNSA9IDEwMDI1NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I2ID0gMTAwMjU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjcgPSAxMDAyNTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX05VUkJTX0VSUk9SOCA9IDEwMDI1ODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfTlVSQlNfRVJST1I5ID0gMTAwMjU5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEwID0gMTAwMjYwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjExID0gMTAwMjYxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEyID0gMTAwMjYyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjEzID0gMTAwMjYzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE0ID0gMTAwMjY0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE1ID0gMTAwMjY1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE2ID0gMTAwMjY2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE3ID0gMTAwMjY3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE4ID0gMTAwMjY4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjE5ID0gMTAwMjY5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIwID0gMTAwMjcwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIxID0gMTAwMjcxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIyID0gMTAwMjcyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjIzID0gMTAwMjczOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI0ID0gMTAwMjc0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI1ID0gMTAwMjc1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI2ID0gMTAwMjc2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI3ID0gMTAwMjc3OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI4ID0gMTAwMjc4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjI5ID0gMTAwMjc5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMwID0gMTAwMjgwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMxID0gMTAwMjgxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMyID0gMTAwMjgyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjMzID0gMTAwMjgzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM0ID0gMTAwMjg0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM1ID0gMTAwMjg1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM2ID0gMTAwMjg2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9OVVJCU19FUlJPUjM3ID0gMTAwMjg3OwotCQotCS8qIENvbnRvdXJzIHR5cGVzIC0tIG9ic29sZXRlISAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9DVyA9IDEwMDEyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfQ0NXID0gMTAwMTIxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9JTlRFUklPUiA9IDEwMDEyMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVhURVJJT1IgPSAxMDAxMjM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX1VOS05PV04gPSAxMDAxMjQ7Ci0JCi0JLyogTmFtZXMgd2l0aG91dCAiVEVTU18iIHByZWZpeCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9CRUdJTiA9IEdMVV9URVNTX0JFR0lOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMVV9WRVJURVggPSBHTFVfVEVTU19WRVJURVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xVX0VORCA9IEdMVV9URVNTX0VORDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRVJST1IgPSBHTFVfVEVTU19FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFVfRURHRV9GTEFHID0gR0xVX1RFU1NfRURHRV9GTEFHOwotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5DdXJ2ZSAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kQ3VydmUgKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUJlZ2luUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RW5kUG9seWdvbiAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1QmVnaW5TdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVFbmRTdXJmYWNlIChpbnQgbm9iaik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVCZWdpblRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUVuZFRyaW0gKGludCBub2JqKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQxRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgaW50IGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1QnVpbGQyRE1pcG1hcHMgKGludCB0YXJnZXQsIGludCBjb21wb25lbmV0cywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpOyAvKiBNVUxUSVBMRVMgVFlQRVMgQVJSQVkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUN5bGluZGVyIChpbnQgcW9iaiwgZG91YmxlIGJhc2VSYWRpdXMsIGRvdWJsZSB0b3BSYWRpdXMsIGRvdWJsZSBoZWlnaHQsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlTnVyYnNSZW5kZXJlciAoaW50IG5vYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlUXVhZHJpYyAoaW50IHFvYmopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGVsZXRlVGVzcyAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1RGlzayAoaW50IHFvYmosIGRvdWJsZSBpbm5lclJhZGl1cywgZG91YmxlIG91dGVyUmFkaXVzLCBpbnQgc2xpY2VzLCBpbnQgbG9vcHMpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVFcnJvclN0cmluZyAoaW50IGVyckNvZGUpOyAgLyogU0hPVUxEIFJFVFVSTiBBIFNUUklORyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1R2V0TnVyYnNQcm9wZXJ0eSAoaW50IG5vYmosIGludCBwcm9wZXJ0eSwgZmxvYXRbXSB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdUdldFN0cmluZyAoaW50IG5hbWUpOyAvKiBTSE9VTEQgUkVUVVJOIEEgU1RSSU5HICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVHZXRUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGRvdWJsZVtdIHZhbHVlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdUxvYWRTYW1wbGluZ01hdHJpY2VzIChpbnQgbm9iaiwgZmxvYXRbXSBtb2RlbE1hdHJpeCwgZmxvYXRbXSBwcm9qTWF0cml4LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVMb29rQXQgKGRvdWJsZSBleWV4LCBkb3VibGUgZXlleSwgZG91YmxlIGV5ZXosIGRvdWJsZSBjZW50ZXJ4LCBkb3VibGUgY2VudGVyeSwgZG91YmxlIGNlbnRlcnosIGRvdWJsZSB1cHgsIGRvdWJsZSB1cHksIGRvdWJsZSB1cHopOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdOdXJic1JlbmRlcmVyICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdRdWFkcmljICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbHVOZXdUZXNzICgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TmV4dENvbnRvdXIgKGludCB0ZXNzLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic0NhbGxiYWNrIChpbnQgbm9iaiwgaW50IHdoaWNoLCBpbnQgZm4pOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1TnVyYnNDdXJ2ZSAoaW50IG5vYmosIGludCBua25vdHMsIGZsb2F0W10ga25vdCwgaW50IHN0cmlkZSwgZmxvYXRbXSBjdGxhcnJheSwgaW50IG9yZGVyLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1Byb3BlcnR5IChpbnQgbm9iaiwgaW50IHByb3BlcnR5LCBmbG9hdCB2YWx1ZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVOdXJic1N1cmZhY2UgKGludCBub2JqLCBpbnQgc2tub3RfY291bnQsIGZsb2F0W10gc2tub3QsIGludCB0a25vdF9jb3VudCwgZmxvYXRbXSB0a25vdCwgaW50IHNfc3RyaWRlLCBpbnQgdF9zdHJpZGUsIGZsb2F0W10gY3RsYXJyYXksIGludCBzb3JkZXIsIGludCB0b3JkZXIsIGludCB0eXBlKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdU9ydGhvMkQgKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sIGRvdWJsZSB0b3ApOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGFydGlhbERpc2sgKGludCBxb2JqLCBkb3VibGUgaW5uZXJSYWRpdXMsIGRvdWJsZSBvdXRlclJhZGl1cywgaW50IHNsaWNlcywgaW50IGxvb3BzLCBkb3VibGUgc3RhcnRBbmdsZSwgZG91YmxlIHN3ZWVwQW5nbGUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1UGVyc3BlY3RpdmUgKGRvdWJsZSBmb3Z5LCBkb3VibGUgYXNwZWN0LCBkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFyKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVBpY2tNYXRyaXggKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0LCBpbnRbXSB2aWV3cG9ydCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVByb2plY3QgKGRvdWJsZSBvYmp4LCBkb3VibGUgb2JqeSwgZG91YmxlIG9ianosZG91YmxlW10gbW9kZWxNYXRyaXgsIGRvdWJsZVtdIHByb2pNYXRyaXgsIGludFtdIHZpZXdwb3J0LCBkb3VibGVbXSB3aW54LCBkb3VibGVbXSB3aW55LCBkb3VibGVbXSB3aW56KTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVB3bEN1cnZlIChpbnQgbm9iaiwgaW50IGNvdW50LCBmbG9hdFtdIGFycmF5LCBpbnQgc3RyaWRlLCBpbnQgdHlwZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljQ2FsbGJhY2sgKGludCBxb2JqLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljRHJhd1N0eWxlIChpbnQgcW9iaiwgaW50IGRyYXdTdHlsZSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljTm9ybWFscyAoaW50IHFvYmosIGludCBub3JtYWxzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVF1YWRyaWNPcmllbnRhdGlvbiAoaW50IHFvYmosIGludCBvcmllbnRhdGlvbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVRdWFkcmljVGV4dHVyZSAoaW50IHFvYmosIGJvb2xlYW4gdGV4dHVyZUNvb3Jkcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsdVNjYWxlSW1hZ2UgKGludCBmb3JtYXQsIGludCB3aWR0aGluLCBpbnQgaGVpZ2h0aW4sIGludCB0eXBlaW4sIGludCBkYXRhaW4sIGludCB3aWR0aG91dCwgaW50IGhlaWdodG91dCwgaW50IHR5cGVvdXQsIGludCBkYXRhb3V0KTsgLypNVUxUSVBMRVMgVFlQRVMgQVJSQVlTKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVNwaGVyZSAoaW50IHFvYmosIGRvdWJsZSByYWRpdXMsIGludCBzbGljZXMsIGludCBzdGFja3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0JlZ2luQ29udG91ciAoaW50IHRlc3MpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2x1VGVzc0VuZENvbnRvdXIgKGludCB0ZXNzKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NCZWdpblBvbHlnb24gKGludCB0ZXNzLCBpbnQgcG9seWdvbl9kYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NFbmRQb2x5Z29uIChpbnQgdGVzcyk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzQ2FsbGJhY2sgKGludCB0ZXNzLCBpbnQgd2hpY2gsIGludCBmbik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzTm9ybWFsIChpbnQgdGVzcywgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbHVUZXNzUHJvcGVydHkgKGludCB0ZXNzLCBpbnQgcHJvcGVydHksIGRvdWJsZSB2YWx1ZSk7IC8qIENIRUNLIE1TRE4sIFZBTFVFJ1MgVFlQRSBJUyBET1VCTEUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsdVRlc3NWZXJ0ZXggKGludCB0ZXNzLCBkb3VibGVbXSBjb29yZHMsIGludCBkYXRhKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2x1VW5Qcm9qZWN0IChkb3VibGUgd2lueCwgZG91YmxlIHdpbnksIGRvdWJsZSB3aW56LCBkb3VibGVbXSBtb2RlbE1hdHJpeCwgZG91YmxlW10gcHJvak1hdHJpeCwgaW50W10gdmlld3BvcnQsIGRvdWJsZVtdIG9iangsIGRvdWJsZVtdIG9ianksIGRvdWJsZVtdIG9ianopOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmMTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbDsKLQotLyoqCi0gKiBUaGUgR0xEYXRhIGNsYXNzIGlzIGEgZGV2aWNlLWluZGVwZW5kZW50IGRlc2NyaXB0aW9uCi0gKiBvZiB0aGUgcGl4ZWwgZm9ybWF0IGF0dHJpYnV0ZXMgb2YgYSBHTCBkcmF3YWJsZS4KLSAqCi0gKiBAc2VlIEdMQ2FudmFzCi0gKi8KLQotcHVibGljIGNsYXNzIEdMRGF0YSB7Ci0JLyoqCi0JICogU3BlY2lmaWVzIGEgZG91YmxlLWJ1ZmZlcmVkIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dAotCSAqIGNyZWF0aW9uLCBvbmx5IGRvdWJsZS1idWZmZXJlZCBmb3JtYXRzIGFyZSBjb25zaWRlcmVkCi0JICogd2hlbiBzZXQgdG8gdHJ1ZS4gCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG91YmxlQnVmZmVyOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGEgc3RlcmVvIHN1cmZhY2UuICBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwKLQkgKiBvbmx5IHN0ZXJlbyBmb3JtYXRzIGFyZSBjb25zaWRlcmVkIHdoZW4gc2V0IHRvIHRydWUuIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHN0ZXJlbzsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIHJlZCBjaGFubmVsLgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgcmVkU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGdyZWVuIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGJsdWUgY2hhbm5lbC4KLQkgKiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlIG1pbmltdW0KLQkgKiByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBibHVlU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGNvbG9yIGJ1ZmZlcidzIGFscGhhIGNoYW5uZWwuCi0JICogRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZSBtaW5pbXVtCi0JICogcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFscGhhU2l6ZTsKLQotCS8qKgotCSAqIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIGRlcHRoIGJ1ZmZlci4gIER1cmluZyBjb250ZXh0Ci0JICogY3JlYXRpb24sIHRoZSBzbWFsbGVzdCBkZXB0aCBidWZmZXIgb2YgYXQgbGVhc3QgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3Igbm8gZGVwdGgKLQkgKiBidWZmZXIuCi0JICovCi0JcHVibGljIGludCBkZXB0aFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgZGVzaXJlZCBudW1iZXIgb2Ygc3RlbmNpbCBiaXRwbGFuZXMuICBEdXJpbmcKLQkgKiBjb250ZXh0IGNyZWF0aW9uLCB0aGUgc21hbGxlc3Qgc3RlbmNpbCBidWZmZXIgb2YgYXQKLQkgKiBsZWFzdCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHByZWZlcnJlZCwgb3IgemVybyBmb3IKLQkgKiBubyBzdGVuY2lsIGJ1ZmZlci4KLQkgKi8KLQlwdWJsaWMgaW50IHN0ZW5jaWxTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIHJlZAotCSAqIGNoYW5uZWwuIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUKLQkgKiBtaW5pbXVtIHJlcXVpcmVkIHJlZCBiaXRzLgotCSAqLwotCXB1YmxpYyBpbnQgYWNjdW1SZWRTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGdyZWVuCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgZ3JlZW4gYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtR3JlZW5TaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGJsdWUKLQkgKiBjaGFubmVsLiBEdXJpbmcgY29udGV4dCBjcmVhdGlvbiwgdGhpcyBzcGVjaWZpZXMgdGhlCi0JICogbWluaW11bSByZXF1aXJlZCBibHVlIGJpdHMuCi0JICovCi0JcHVibGljIGludCBhY2N1bUJsdWVTaXplOwotCi0JLyoqCi0JICogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgYWNjdW11bGF0aW9uIGJ1ZmZlcidzIGFscGhhCi0JICogY2hhbm5lbC4gRHVyaW5nIGNvbnRleHQgY3JlYXRpb24sIHRoaXMgc3BlY2lmaWVzIHRoZQotCSAqIG1pbmltdW0gcmVxdWlyZWQgYWxwaGEgYml0cy4KLQkgKi8KLQlwdWJsaWMgaW50IGFjY3VtQWxwaGFTaXplOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHVzZWQgYnkgdGhpcyBjb250ZXh0LgotCSAqIER1cmluZyBjb250ZXh0IGNyZWF0aW9uLCB0aGlzIHNwZWNpZmllcyB0aGUgbWluaW11bQotCSAqIG51bWJlciBvZiBtdWx0aXNhbXBsZSBidWZmZXJzIHJlcXVlc3RlZC4KLQkgKi8KLQlwdWJsaWMgaW50IHNhbXBsZUJ1ZmZlcnM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgYWNjZXB0ZWQgaW4gdGhlIG11bHRpc2FtcGxlIGJ1ZmZlci4KLQkgKiBEdXJpbmcgY3JlYXRpb24sIHBpeGVsIGZvcm1hdHMgd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mCi0JICogc2FtcGxlcyB0aGF0IG1lZXRzIG9yIGV4Y2VlZHMgdGhlIHNwZWNpZmllZCBtaW5pbXVtIG51bWJlcgotCSAqIGFyZSBwcmVmZXJyZWQuCi0JICovCi0JcHVibGljIGludCBzYW1wbGVzOwotCQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZQotICogZGVzY3JpcHRpb24gb2YgdGhlIHJlY2VpdmVyLgotICoKLSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEKLSAqLwotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gKGRvdWJsZUJ1ZmZlciA/ICJkb3VibGVCdWZmZXIsIiA6ICIiKSArCi0JCShzdGVyZW8gPyAic3RlcmVvLCIgOiAiIikgKwotCQkicjoiICsgcmVkU2l6ZSArICIgZzoiICsgZ3JlZW5TaXplICsgIiBiOiIgKyBibHVlU2l6ZSArICIgYToiICsgYWxwaGFTaXplICsgIiwiICsKLQkJImRlcHRoOiIgKyBkZXB0aFNpemUgKyAiLHN0ZW5jaWw6IiArIHN0ZW5jaWxTaXplICsKLQkJIixhY2N1bSByOiIgKyBhY2N1bVJlZFNpemUgKyAiZzoiICsgYWNjdW1HcmVlblNpemUgKyAiYjoiICsgYWNjdW1CbHVlU2l6ZSArICJhOiIgKyBhY2N1bUFscGhhU2l6ZSArCi0JCSIsc2FtcGxlQnVmZmVyczoiICsgc2FtcGxlQnVmZmVycyArICIsc2FtcGxlczoiICsgc2FtcGxlczsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvSW1hZ2VEYXRhVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDY5MDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9jb21tb24vb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9JbWFnZURhdGFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLQotCi1wdWJsaWMgY2xhc3MgSW1hZ2VEYXRhVXRpbCB7Ci0JLyoqCi0JICogQWxwaGEgbW9kZSwgdmFsdWVzIDAgLSAyNTUgc3BlY2lmeSBnbG9iYWwgYWxwaGEgbGV2ZWwKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUFMUEhBX09QQVFVRSA9IDI1NSwgICAgICAgICAgIC8vIEZ1bGx5IG9wYXF1ZSAoaWdub3JlcyBhbnkgYWxwaGEgZGF0YSkKLQkJQUxQSEFfVFJBTlNQQVJFTlQgPSAwLCAgICAgICAgLy8gRnVsbHkgdHJhbnNwYXJlbnQgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JCUFMUEhBX0NIQU5ORUxfU09VUkNFID0gLTIsICAgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGVtYmVkZGVkIGluIHNvdXJjZURhdGEKLQkJQUxQSEFfTUFTS19VTlBBQ0tFRCA9IC0zLCAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBieXRlcyBpbiBhbHBoYURhdGEgKG5vbi16ZXJvIGlzIG9wYXF1ZSkKLQkJQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQkJQUxQSEFfTUFTS19JTkRFWCA9IC01LCAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIHBhbGV0dGUgaW5kaWNlcyB0cmFuc3BhcmVudCBpZiBpbiBhbHBoYURhdGEgYXJyYXkKLQkJQUxQSEFfTUFTS19SR0IgPSAtNjsgICAgICAgICAgLy8gQ29uc2lkZXIgc291cmNlIFJHQnMgdHJhbnNwYXJlbnQgaWYgaW4gUkdCODg4IGZvcm1hdCBhbHBoYURhdGEgYXJyYXkKLQkJCi0JLyoqCi0JICogRGF0YSB0eXBlcyAoaW50ZXJuYWwpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JCS8vIGRpcmVjdCAvIHRydWUgY29sb3IgZm9ybWF0cyB3aXRoIGFyYml0cmFyeSBtYXNrcyAmIHNoaWZ0cwotCQlUWVBFX0dFTkVSSUNfOCA9IDAsCi0JCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCQlUWVBFX0dFTkVSSUNfMTZfTFNCID0gMiwKLQkJVFlQRV9HRU5FUklDXzI0ID0gMywKLQkJVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JCVRZUEVfR0VORVJJQ18zMl9MU0IgPSA1LAotCQkvLyBwYWxldHRlIGluZGV4ZWQgY29sb3IgZm9ybWF0cwotCQlUWVBFX0lOREVYXzggPSA2LAotCQlUWVBFX0lOREVYXzQgPSA3LAotCQlUWVBFX0lOREVYXzIgPSA4LAotCQlUWVBFX0lOREVYXzFfTVNCID0gOSwKLQkJVFlQRV9JTkRFWF8xX0xTQiA9IDEwOwotCQkKLQkvKioKLQkgKiBCeXRlIGFuZCBiaXQgb3JkZXIgY29uc3RhbnRzLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgTFNCX0ZJUlNUID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IE1TQl9GSVJTVCA9IDE7Ci0JCi0JLyoqCi0JICogQmxpdCBvcGVyYXRpb24gYml0cyB0byBiZSBPUidlZCB0b2dldGhlciB0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIG9wZXJhdGlvbi4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50Ci0JCUJMSVRfU1JDID0gMSwgICAgIC8vIGNvcHkgc291cmNlIGRpcmVjdGx5LCBlbHNlIGFwcGxpZXMgbG9naWMgb3BlcmF0aW9ucwotCQlCTElUX0FMUEhBID0gMiwgICAvLyBlbmFibGUgYWxwaGEgYmxlbmRpbmcKLQkJQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQkJCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJsaXRzIGEgZGlyZWN0IHBhbGV0dGUgaW1hZ2UgaW50byBhIGRpcmVjdCBwYWxldHRlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGU6IFdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGVwdGgsIG9yZGVyIGFuZCBtYXNrcwotCSAqIGFyZSBwYWlyd2lzZSBlcXVhbCBhbmQgdGhlIGJsaXR0ZXIgb3BlcmF0aW9uIGlzIEJMSVRfU1JDLAotCSAqIHRoZSBtYXNrcyBhcmUgaWdub3JlZC4gIEhlbmNlIHdoZW4gbm90IGNoYW5naW5nIHRoZSBpbWFnZQotCSAqIGRhdGEgZm9ybWF0LCAwIG1heSBiZSBzcGVjaWZpZWQgZm9yIHRoZSBtYXNrcy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG9wIHRoZSBibGl0dGVyIG9wZXJhdGlvbjogYSBjb21iaW5hdGlvbiBvZiBCTElUX3h4eCBmbGFncwotCSAqICAgICAgICAoc2VlIEJMSVRfeHh4IGNvbnN0YW50cykKLQkgKiBAcGFyYW0gc3JjRGF0YSB0aGUgc291cmNlIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIHNyY0RlcHRoIHRoZSBzb3VyY2UgZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIHNyY1N0cmlkZSB0aGUgc291cmNlIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBzcmNPcmRlciB0aGUgc291cmNlIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIHNyY0RlcHRoIGlzIG5vdCAxNiBvciAzMgotCSAqIEBwYXJhbSBzcmNYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY0hlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gc3JjUmVkTWFzayB0aGUgc291cmNlIHJlZCBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gc3JjR3JlZW5NYXNrIHRoZSBzb3VyY2UgZ3JlZW4gY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0JsdWVNYXNrIHRoZSBzb3VyY2UgYmx1ZSBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gYWxwaGFNb2RlIHRoZSBhbHBoYSBibGVuZGluZyBvciBtYXNrIG1vZGUsIG1heSBiZQotCSAqICAgICAgICBhbiBpbnRlZ2VyIDAtMjU1IGZvciBnbG9iYWwgYWxwaGE7IGlnbm9yZWQgaWYgQkxJVF9BTFBIQQotCSAqICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBibGl0dGVyIG9wZXJhdGlvbnMKLQkgKiAgICAgICAgKHNlZSBBTFBIQV9NT0RFX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIGFscGhhRGF0YSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBkYXRhLCB2YXJpZXMgZGVwZW5kaW5nCi0JICogICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBhbHBoYU1vZGUgYW5kIHNvbWV0aW1lcyBpZ25vcmVkCi0JICogQHBhcmFtIGFscGhhU3RyaWRlIHRoZSBhbHBoYSBkYXRhIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBhbHBoYVggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGFscGhhWSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgYWxwaGEgYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdERhdGEgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbWFnZSBkYXRhCi0JICogQHBhcmFtIGRlc3REZXB0aCB0aGUgZGVzdGluYXRpb24gZGVwdGg6IG9uZSBvZiA4LCAxNiwgMjQsIDMyCi0JICogQHBhcmFtIGRlc3RTdHJpZGUgdGhlIGRlc3RpbmF0aW9uIG51bWJlciBvZiBieXRlcyBwZXIgbGluZQotCSAqIEBwYXJhbSBkZXN0T3JkZXIgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgb3JkZXJpbmc6IG9uZSBvZiBNU0JfRklSU1Qgb3IgTFNCX0ZJUlNUOwotCSAqICAgICAgICBpZ25vcmVkIGlmIGRlc3REZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gZGVzdFggdGhlIHRvcC1sZWZ0IHgtY29vcmQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RZIHRoZSB0b3AtbGVmdCB5LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0SGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3RSZWRNYXNrIHRoZSBkZXN0aW5hdGlvbiByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGRlc3RHcmVlbk1hc2sgdGhlIGRlc3RpbmF0aW9uIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0Qmx1ZU1hc2sgdGhlIGRlc3RpbmF0aW9uIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGZsaXBYIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzCi0JICogQHBhcmFtIGZsaXBZIGlmIHRydWUgdGhlIHJlc3VsdGluZyBpbWFnZSBpcyBmbGlwcGVkIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMKLQkgKi8KLQlzdGF0aWMgdm9pZCBibGl0KGludCBvcCwKLQkJYnl0ZVtdIHNyY0RhdGEsIGludCBzcmNEZXB0aCwgaW50IHNyY1N0cmlkZSwgaW50IHNyY09yZGVyLAotCQlpbnQgc3JjWCwgaW50IHNyY1ksIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKLQkJaW50IHNyY1JlZE1hc2ssIGludCBzcmNHcmVlbk1hc2ssIGludCBzcmNCbHVlTWFzaywKLQkJaW50IGFscGhhTW9kZSwgYnl0ZVtdIGFscGhhRGF0YSwgaW50IGFscGhhU3RyaWRlLCBpbnQgYWxwaGFYLCBpbnQgYWxwaGFZLAotCQlieXRlW10gZGVzdERhdGEsIGludCBkZXN0RGVwdGgsIGludCBkZXN0U3RyaWRlLCBpbnQgZGVzdE9yZGVyLAotCQlpbnQgZGVzdFgsIGludCBkZXN0WSwgaW50IGRlc3RXaWR0aCwgaW50IGRlc3RIZWlnaHQsCi0JCWludCBkZXN0UmVkTWFzaywgaW50IGRlc3RHcmVlbk1hc2ssIGludCBkZXN0Qmx1ZU1hc2ssCi0JCWJvb2xlYW4gZmxpcFgsIGJvb2xlYW4gZmxpcFkpIHsKLQkJaWYgKChkZXN0V2lkdGggPD0gMCkgfHwgKGRlc3RIZWlnaHQgPD0gMCkgfHwgKGFscGhhTW9kZSA9PSBBTFBIQV9UUkFOU1BBUkVOVCkpIHJldHVybjsKLQotCQkvLyB0aGVzZSBzaG91bGQgYmUgc3VwcGxpZWQgYXMgcGFyYW1zIGxhdGVyCi0JCWZpbmFsIGludCBzcmNBbHBoYU1hc2sgPSAwLCBkZXN0QWxwaGFNYXNrID0gMDsKLQotCQkvKioqIFByZXBhcmUgc2NhbGluZyBkYXRhICoqKi8KLQkJZmluYWwgaW50IGR3bTEgPSBkZXN0V2lkdGggLSAxOwotCQlmaW5hbCBpbnQgc2Z4aSA9IChkd20xICE9IDApID8gKGludCkoKCgobG9uZylzcmNXaWR0aCA8PCAxNikgLSAxKSAvIGR3bTEpIDogMDsKLQkJZmluYWwgaW50IGRobTEgPSBkZXN0SGVpZ2h0IC0gMTsKLQkJZmluYWwgaW50IHNmeWkgPSAoZGhtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjSGVpZ2h0IDw8IDE2KSAtIDEpIC8gZGhtMSkgOiAwOwotCi0JCS8qKiogUHJlcGFyZSBzb3VyY2UtcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IHNicHAsIHN0eXBlOwotCQlzd2l0Y2ggKHNyY0RlcHRoKSB7Ci0JCQljYXNlIDg6Ci0JCQkJc2JwcCA9IDE7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfODsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTY6Ci0JCQkJc2JwcCA9IDI7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlzYnBwID0gMzsKLQkJCQlzdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJc2JwcCA9IDQ7Ci0JCQkJc3R5cGUgPSAoc3JjT3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc291cmNlIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IHNwciA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYICogc2JwcDsKLQotCQkvKioqIFByZXBhcmUgZGVzdGluYXRpb24tcmVsYXRlZCBkYXRhICoqKi8KLQkJZmluYWwgaW50IGRicHAsIGR0eXBlOwotCQlzd2l0Y2ggKGRlc3REZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCWRicHAgPSAxOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCWRicHAgPSAyOwotCQkJCWR0eXBlID0gKGRlc3RPcmRlciA9PSBNU0JfRklSU1QpID8gVFlQRV9HRU5FUklDXzE2X01TQiA6IFRZUEVfR0VORVJJQ18xNl9MU0I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI0OgotCQkJCWRicHAgPSAzOwotCQkJCWR0eXBlID0gVFlQRV9HRU5FUklDXzI0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjoKLQkJCQlkYnBwID0gNDsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18zMl9NU0IgOiBUWVBFX0dFTkVSSUNfMzJfTFNCOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzdGluYXRpb24gdHlwZSIpOwotCQkJCXJldHVybjsKLQkJfQkJCQotCQlpbnQgZHByID0gKChmbGlwWSkgPyBkZXN0WSArIGRobTEgOiBkZXN0WSkgKiBkZXN0U3RyaWRlICsgKChmbGlwWCkgPyBkZXN0WCArIGR3bTEgOiBkZXN0WCkgKiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeGkgPSAoZmxpcFgpID8gLWRicHAgOiBkYnBwOwotCQlmaW5hbCBpbnQgZHByeWkgPSAoZmxpcFkpID8gLWRlc3RTdHJpZGUgOiBkZXN0U3RyaWRlOwotCi0JCS8qKiogUHJlcGFyZSBzcGVjaWFsIHByb2Nlc3NpbmcgZGF0YSAqKiovCi0JCWludCBhcHI7Ci0JCWlmICgob3AgJiBCTElUX0FMUEhBKSAhPSAwKSB7Ci0JCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCWNhc2UgQUxQSEFfTUFTS19VTlBBQ0tFRDoKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYXByID0gYWxwaGFZICogYWxwaGFTdHJpZGUgKyBhbHBoYVg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxQSEFfTUFTS19QQUNLRUQ6Ci0JCQkJCWlmIChhbHBoYURhdGEgPT0gbnVsbCkgYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCQkJYWxwaGFTdHJpZGUgPDw9IDM7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfSU5ERVg6Ci0JCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhbHBoYSB0eXBlIik7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFscGhhTW9kZSA9IChhbHBoYU1vZGUgPDwgMTYpIC8gMjU1OyAvLyBwcmVzY2FsZQotCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCWFwciA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWxwaGFNb2RlID0gMHgxMDAwMDsKLQkJCWFwciA9IDA7Ci0JCX0KLQotCQkvKioqIEJsaXQgKioqLwotCQlpbnQgZHAgPSBkcHI7Ci0JCWludCBzcCA9IHNwcjsKLQkJaWYgKChhbHBoYU1vZGUgPT0gMHgxMDAwMCkgJiYgKHN0eXBlID09IGR0eXBlKSAmJgotCQkJKHNyY1JlZE1hc2sgPT0gZGVzdFJlZE1hc2spICYmIChzcmNHcmVlbk1hc2sgPT0gZGVzdEdyZWVuTWFzaykgJiYKLQkJCShzcmNCbHVlTWFzayA9PSBkZXN0Qmx1ZU1hc2spICYmIChzcmNBbHBoYU1hc2sgPT0gZGVzdEFscGhhTWFzaykpIHsKLQkJCS8qKiogRmFzdCBibGl0IChzdHJhaWdodCBjb3B5KSAqKiovCi0JCQlzd2l0Y2ggKHNicHApIHsKLQkJCQljYXNlIDE6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7CQkJCQkKLQkJCQljYXNlIDI6Ci0JCQkJCWZvciAoaW50IGR5ID0gZGVzdEhlaWdodCwgc2Z5ID0gc2Z5aTsgZHkgPiAwOyAtLWR5LCBzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsIHNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwgZHAgPSBkcHIgKz0gZHByeWkpIHsKLQkJCQkJCWZvciAoaW50IGR4ID0gZGVzdFdpZHRoLCBzZnggPSBzZnhpOyBkeCA+IDA7IC0tZHgsIGRwICs9IGRwcnhpLCBzZnggPSAoc2Z4ICYgMHhmZmZmKSArIHNmeGkpIHsKLQkJCQkJCQlkZXN0RGF0YVtkcF0gPSBzcmNEYXRhW3NwXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gc3JjRGF0YVtzcCArIDFdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gc3JjRGF0YVtzcCArIDJdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSBzcmNEYXRhW3NwICsgM107Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvKioqIENvbXByZWhlbnNpdmUgYmxpdCAoYXBwbHkgdHJhbnNmb3JtYXRpb25zKSAqKiovCi0JCWZpbmFsIGludCBzcmNSZWRTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNSZWRNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY1JlZHMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY1JlZE1hc2ssIHNyY1JlZFNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNHcmVlblNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0dyZWVuTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNHcmVlbnMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0dyZWVuTWFzaywgc3JjR3JlZW5TaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0JsdWVNYXNrKTsKLQkJZmluYWwgYnl0ZVtdIHNyY0JsdWVzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNCbHVlTWFzaywgc3JjQmx1ZVNoaWZ0KV07Ci0JCWZpbmFsIGludCBzcmNBbHBoYVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KHNyY0FscGhhTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNBbHBoYXMgPSBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKHNyY0FscGhhTWFzaywgc3JjQWxwaGFTaGlmdCldOwotCi0JCWZpbmFsIGludCBkZXN0UmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdFJlZE1hc2spOwotCQlmaW5hbCBpbnQgZGVzdFJlZFdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RSZWRNYXNrLCBkZXN0UmVkU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdFJlZHMgPSBBTllfVE9fRUlHSFRbZGVzdFJlZFdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RSZWRQcmVTaGlmdCA9IDggLSBkZXN0UmVkV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0R3JlZW5NYXNrKTsKLQkJZmluYWwgaW50IGRlc3RHcmVlbldpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RHcmVlbk1hc2ssIGRlc3RHcmVlblNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RHcmVlbnMgPSBBTllfVE9fRUlHSFRbZGVzdEdyZWVuV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuUHJlU2hpZnQgPSA4IC0gZGVzdEdyZWVuV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RCbHVlTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RCbHVlTWFzaywgZGVzdEJsdWVTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0Qmx1ZXMgPSBBTllfVE9fRUlHSFRbZGVzdEJsdWVXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0Qmx1ZVByZVNoaWZ0ID0gOCAtIGRlc3RCbHVlV2lkdGg7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0QWxwaGFNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVdpZHRoID0gZ2V0Q2hhbm5lbFdpZHRoKGRlc3RBbHBoYU1hc2ssIGRlc3RBbHBoYVNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RBbHBoYXMgPSBBTllfVE9fRUlHSFRbZGVzdEFscGhhV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhUHJlU2hpZnQgPSA4IC0gZGVzdEFscGhhV2lkdGg7Ci0KLQkJaW50IGFwID0gYXByLCBhbHBoYSA9IGFscGhhTW9kZTsKLQkJaW50IHIgPSAwLCBnID0gMCwgYiA9IDAsIGEgPSAwOwotCQlpbnQgcnEgPSAwLCBncSA9IDAsIGJxID0gMCwgYXEgPSAwOwotCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwKLQkJCQlzcCA9IHNwciArPSAoc2Z5ID4+PiAxNikgKiBzcmNTdHJpZGUsCi0JCQkJYXAgPSBhcHIgKz0gKHNmeSA+Pj4gMTYpICogYWxwaGFTdHJpZGUsCi0JCQkJc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLAotCQkJCWRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LAotCQkJCQlkcCArPSBkcHJ4aSwKLQkJCQkJc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJLyoqKiBSRUFEIE5FWFQgUElYRUwgKioqLwotCQkJCXN3aXRjaCAoc3R5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSBzcmNEYXRhW3NwXSAmIDB4ZmY7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNik7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpIDw8IDgpIHwgKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChzcmNEYXRhW3NwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogNDsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX0xTQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3AgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkoc3JjRGF0YVtzcF0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQotCQkJCS8qKiogRE8gU1BFQ0lBTCBQUk9DRVNTSU5HIElGIFJFUVVJUkVEICoqKi8KLQkJCQlzd2l0Y2ggKGFscGhhTW9kZSkgewotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU0VQQVJBVEU6Ci0JCQkJCQlhbHBoYSA9ICgoYWxwaGFEYXRhW2FwXSAmIDB4ZmYpIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWFwICs9IChzZnggPj4gMTYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgQUxQSEFfQ0hBTk5FTF9TT1VSQ0U6Ci0JCQkJCQlhbHBoYSA9IChhIDw8IDE2KSAvIDI1NTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJCQlhbHBoYSA9IChhbHBoYURhdGFbYXBdICE9IDApID8gMHgxMDAwMCA6IDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwkJCQkJCQotCQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwID4+IDNdIDw8ICgoYXAgJiA3KSArIDkpKSAmIDB4MTAwMDA7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX01BU0tfUkdCOgotCQkJCQkJYWxwaGEgPSAweDEwMDAwOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpICs9IDMpIHsKLQkJCQkJCQlpZiAoKHIgPT0gYWxwaGFEYXRhW2ldKSAmJiAoZyA9PSBhbHBoYURhdGFbaSArIDFdKSAmJiAoYiA9PSBhbHBoYURhdGFbaSArIDJdKSkgewotCQkJCQkJCQlhbHBoYSA9IDB4MDAwMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhbHBoYSAhPSAweDEwMDAwKSB7Ci0JCQkJCWlmIChhbHBoYSA9PSAweDAwMDApIGNvbnRpbnVlOwotCQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ184OiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSBkZXN0RGF0YVtkcF0gJiAweGZmOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcCArIDFdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSA8PCA4KSB8IChkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKChkZXN0RGF0YVtkcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDFdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgM10gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoICgoZGVzdERhdGFbZHAgKyAzXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcF0gJiAweGZmKTsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLy8gUGVyZm9ybSBhbHBoYSBibGVuZGluZwotCQkJCQlhID0gYXEgKyAoKGEgLSBhcSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCXIgPSBycSArICgociAtIHJxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJZyA9IGdxICsgKChnIC0gZ3EpICogYWxwaGEgPj4gMTYpOwotCQkJCQliID0gYnEgKyAoKGIgLSBicSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJfQotCi0JCQkJLyoqKiBXUklURSBORVhUIFBJWEVMICoqKi8KLQkJCQlmaW5hbCBpbnQgZGF0YSA9IAotCQkJCQkociA+Pj4gZGVzdFJlZFByZVNoaWZ0IDw8IGRlc3RSZWRTaGlmdCkgfAotCQkJCQkoZyA+Pj4gZGVzdEdyZWVuUHJlU2hpZnQgPDwgZGVzdEdyZWVuU2hpZnQpIHwKLQkJCQkJKGIgPj4+IGRlc3RCbHVlUHJlU2hpZnQgPDwgZGVzdEJsdWVTaGlmdCkgfAotCQkJCQkoYSA+Pj4gZGVzdEFscGhhUHJlU2hpZnQgPDwgZGVzdEFscGhhU2hpZnQpOwotCQkJCXN3aXRjaCAoZHR5cGUpIHsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIGRhdGE7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18yNDogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgPj4+IDI0KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDE2KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMl0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSAmIDB4ZmYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgc2hpZnQgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQkJaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCQltYXNrID4+Pj0gMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHJlcXVpcmVkIGNoYW5uZWwgd2lkdGggKGRlcHRoKSBmcm9tIGEgbWFzay4KLQkgKi8KLQlzdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJbWFzayA+Pj49IHNoaWZ0OwotCQlmb3IgKGkgPSBzaGlmdDsgKChtYXNrICYgMSkgIT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGkgLSBzaGlmdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0KLQkJSW1hZ2VEYXRhVXRpbC5ibGl0ICgKLQkJCTEsCi0JCQlzb3VyY2UuZGF0YSwKLQkJCXNvdXJjZS5kZXB0aCwKLQkJCXNvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkoc291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJc291cmNlLndpZHRoLAotCQkJc291cmNlLmhlaWdodCwKLQkJCXNvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQlzb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCTI1NSwKLQkJCW51bGwsCi0JCQkwLAotCQkJMCwKLQkJCTAsCi0JCQluZXdTb3VyY2UuZGF0YSwKLQkJCW5ld1NvdXJjZS5kZXB0aCwKLQkJCW5ld1NvdXJjZS5ieXRlc1BlckxpbmUsCi0JCQkobmV3U291cmNlLmRlcHRoICE9IDE2KSA/IE1TQl9GSVJTVCA6IExTQl9GSVJTVCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLndpZHRoLAotCQkJbmV3U291cmNlLmhlaWdodCwKLQkJCW5ld1NvdXJjZS5wYWxldHRlLnJlZE1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ncmVlbk1hc2ssCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5ibHVlTWFzaywKLQkJCWZhbHNlLAotCQkJdHJ1ZSk7Ci0KLQkJcmV0dXJuIG5ld1NvdXJjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2NvbW1vbi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NjdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvY29tbW9uL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIExpYnJhcnkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbG9hZExpYnJhcnkgKFN0cmluZyBuYW1lKSB7Ci0JU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtICgpOwkKLQl0cnkgewotCQlTdHJpbmcgbmV3TmFtZSA9IG5hbWUgKyAnLScgKyBwbGF0Zm9ybTsKLQkJU3lzdGVtLmxvYWRMaWJyYXJ5IChuZXdOYW1lKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKFVuc2F0aXNmaWVkTGlua0Vycm9yIGUxKSB7CQkKLQkJdGhyb3cgZTE7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzI2ZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotaWYgWyAiJHtPU30iID0gIiIgXTsgdGhlbgotCU9TPWB1bmFtZSAtc2AKLWZpCi0KLWNhc2UgJE9TIGluCi0JIkxpbnV4IikKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCBHVEsgdmVyc2lvbiBvZiBTV1QgT3BlbkdMIgotCQk7OwotCSopCi0JCWVjaG8gIioqKiBVbmtub3duIE9TIDwke09TfT4iCi0JCTs7Ci1lc2FjCi0KLWV4cG9ydCBKQVZBX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJHsxKyIkQCJ9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjE1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLSNpbmNsdWRlICJnbHhfc3RhdHMuaCIKLQotI2RlZmluZSBHTFhfTkFUSVZFKGZ1bmMpIEphdmFfb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29wZW5nbF9ndGtfR0xYXyMjZnVuYwotCi0jaWZuZGVmIE5PX2dsWENob29zZVZpc3VhbAotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYyA9IDA7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWENob29zZVZpc3VhbF9GVU5DKTsKLQlpZiAoYXJnMikgaWYgKChscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCXJjID0gKGppbnQpZ2xYQ2hvb3NlVmlzdWFsKGFyZzAsIGFyZzEsIGxwYXJnMik7Ci1mYWlsOgotCWlmIChhcmcyICYmIGxwYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENvcHlDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYQ29weUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLQlnbFhDb3B5Q29udGV4dChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhDb3B5Q29udGV4dF9GVU5DKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWENyZWF0ZUNvbnRleHQKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxLCBqaW50IGFyZzIsIGpib29sZWFuIGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSBnZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsICZfYXJnMSkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWENyZWF0ZUNvbnRleHQoYXJnMCwgbHBhcmcxLCBhcmcyLCBhcmczKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlQ29udGV4dF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhDcmVhdGVHTFhQaXhtYXAKLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgR0xYX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhDcmVhdGVHTFhQaXhtYXBfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamludClnbFhDcmVhdGVHTFhQaXhtYXAoYXJnMCwgbHBhcmcxLCBhcmcyKTsKLWZhaWw6Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWERlc3Ryb3lDb250ZXh0Ci1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYRGVzdHJveUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotCWdsWERlc3Ryb3lDb250ZXh0KGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWERlc3Ryb3lDb250ZXh0X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYRGVzdHJveUdMWFBpeG1hcAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWERlc3Ryb3lHTFhQaXhtYXBfRlVOQyk7Ci0JZ2xYRGVzdHJveUdMWFBpeG1hcChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYR2V0Q2xpZW50U3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q2xpZW50U3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDbGllbnRTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDbGllbnRTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldENvbmZpZwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldENvbmZpZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqaW50QXJyYXkgYXJnMykKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMz1OVUxMOwotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDb25maWdfRlVOQyk7Ci0JaWYgKGFyZzEpIGlmICgobHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzMpIGlmICgobHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqaW50KWdsWEdldENvbmZpZyhhcmcwLCBscGFyZzEsIGFyZzIsIGxwYXJnMyk7Ci1mYWlsOgotCWlmIChhcmczICYmIGxwYXJnMykgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzMsIGxwYXJnMywgMCk7Ci0JaWYgKGFyZzEgJiYgbHBhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYR2V0Q29uZmlnX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnRDb250ZXh0Ci1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50Q29udGV4dCgpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWEdldEN1cnJlbnRDb250ZXh0X0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWEdldEN1cnJlbnREcmF3YWJsZQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmMgPSAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYSXNEaXJlY3QKLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYSXNEaXJlY3QpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyYyA9IChqYm9vbGVhbilnbFhJc0RpcmVjdChhcmcwLCBhcmcxKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhJc0RpcmVjdF9GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhNYWtlQ3VycmVudAotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgR0xYX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYTWFrZUN1cnJlbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYTWFrZUN1cnJlbnRfRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbl9GVU5DKTsKLQlpZiAoYXJnMSkgaWYgKChscGFyZzEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcxLCBOVUxMKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCWlmIChhcmcyKSBpZiAoKGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JcmMgPSAoamJvb2xlYW4pZ2xYUXVlcnlFeHRlbnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25fRlVOQyk7Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCWppbnQgcmMgPSAwOwotCUdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoYXJnMCwgYXJnMSk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFF1ZXJ5U2VydmVyU3RyaW5nCi1KTklFWFBPUlQgamludCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlqaW50IHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdfRlVOQyk7Ci0JcmMgPSAoamludClnbFhRdWVyeVNlcnZlclN0cmluZyhhcmcwLCBhcmcxLCBhcmcyKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DKTsKLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhRdWVyeVZlcnNpb24KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYUXVlcnlWZXJzaW9uKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludEFycmF5IGFyZzEsIGppbnRBcnJheSBhcmcyKQotewotCWppbnQgKmxwYXJnMT1OVUxMOwotCWppbnQgKmxwYXJnMj1OVUxMOwotCWpib29sZWFuIHJjID0gMDsKLQlHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCWlmIChhcmcxKSBpZiAoKGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JaWYgKGFyZzIpIGlmICgobHBhcmcyID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgTlVMTCkpID09IE5VTEwpIGdvdG8gZmFpbDsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeVZlcnNpb24oYXJnMCwgbHBhcmcxLCBscGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMiAmJiBscGFyZzIpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBscGFyZzIsIDApOwotCWlmIChhcmcxICYmIGxwYXJnMSkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIGxwYXJnMSwgMCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYUXVlcnlWZXJzaW9uX0ZVTkMpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE5PX2dsWFN3YXBCdWZmZXJzCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotCWdsWFN3YXBCdWZmZXJzKGFyZzAsIGFyZzEpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFN3YXBCdWZmZXJzX0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYVXNlWEZvbnQKLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgR0xYX05BVElWRShnbFhVc2VYRm9udCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotCUdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGdsWFVzZVhGb250X0ZVTkMpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgTk9fZ2xYV2FpdEdMCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRHTF9GVU5DKTsKLQlnbFhXYWl0R0woKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBnbFhXYWl0R0xfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19nbFhXYWl0WAotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBHTFhfTkFUSVZFKGdsWFdhaXRYKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIGdsWFdhaXRYX0ZVTkMpOwotCWdsWFdhaXRYKCk7Ci0JR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZ2xYV2FpdFhfRlVOQyk7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBOT19tZW1tb3ZlCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEdMWF9OQVRJVkUobWVtbW92ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0JR0xYX05BVElWRV9FTlRFUihlbnYsIHRoYXQsIG1lbW1vdmVfRlVOQyk7Ci0JaWYgKGFyZzApIGlmICgobHBhcmcwID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCAmX2FyZzApKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JbWVtbW92ZShscGFyZzAsIGFyZzEsIGFyZzIpOwotZmFpbDoKLQlpZiAoYXJnMCAmJiBscGFyZzApIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMCwgbHBhcmcwKTsKLQlHTFhfTkFUSVZFX0VYSVQoZW52LCB0aGF0LCBtZW1tb3ZlX0ZVTkMpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyOWVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotI2luY2x1ZGUgPEdML2dseC5oPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTFkMTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0YXRzLmgiCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLQotaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50ID0gMjE7Ci1pbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50WzIxXTsKLWNoYXIgKiBHTFhfbmF0aXZlRnVuY3Rpb25OYW1lc1tdID0gewotCSJnbFhDaG9vc2VWaXN1YWwiLAotCSJnbFhDb3B5Q29udGV4dCIsCi0JImdsWENyZWF0ZUNvbnRleHQiLAotCSJnbFhDcmVhdGVHTFhQaXhtYXAiLAotCSJnbFhEZXN0cm95Q29udGV4dCIsCi0JImdsWERlc3Ryb3lHTFhQaXhtYXAiLAotCSJnbFhHZXRDbGllbnRTdHJpbmciLAotCSJnbFhHZXRDb25maWciLAotCSJnbFhHZXRDdXJyZW50Q29udGV4dCIsCi0JImdsWEdldEN1cnJlbnREcmF3YWJsZSIsCi0JImdsWElzRGlyZWN0IiwKLQkiZ2xYTWFrZUN1cnJlbnQiLAotCSJnbFhRdWVyeUV4dGVuc2lvbiIsCi0JImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyIsCi0JImdsWFF1ZXJ5U2VydmVyU3RyaW5nIiwKLQkiZ2xYUXVlcnlWZXJzaW9uIiwKLQkiZ2xYU3dhcEJ1ZmZlcnMiLAotCSJnbFhVc2VYRm9udCIsCi0JImdsWFdhaXRHTCIsCi0JImdsWFdhaXRYIiwKLQkibWVtbW92ZSIsCi19OwotCi0jZGVmaW5lIFNUQVRTX05BVElWRShmdW5jKSBKYXZhX29yZ19lY2xpcHNlX3N3dF90b29sc19pbnRlcm5hbF9OYXRpdmVTdGF0c18jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBTVEFUU19OQVRJVkUoR0xYXzFHZXRGdW5jdGlvbkNvdW50KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JcmV0dXJuIEdMWF9uYXRpdmVGdW5jdGlvbkNvdW50OwotfQotCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIFNUQVRTX05BVElWRShHTFhfMUdldEZ1bmN0aW9uTmFtZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGluZGV4KQotewotCXJldHVybiAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW2luZGV4XSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgU1RBVFNfTkFUSVZFKEdMWF8xR2V0RnVuY3Rpb25DYWxsQ291bnQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBpbmRleCkKLXsKLQlyZXR1cm4gR0xYX25hdGl2ZUZ1bmN0aW9uQ2FsbENvdW50W2luZGV4XTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0YXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzE2OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdGF0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBOQVRJVkVfU1RBVFMKLWV4dGVybiBpbnQgR0xYX25hdGl2ZUZ1bmN0aW9uQ291bnQ7Ci1leHRlcm4gaW50IEdMWF9uYXRpdmVGdW5jdGlvbkNhbGxDb3VudFtdOwotZXh0ZXJuIGNoYXIqIEdMWF9uYXRpdmVGdW5jdGlvbk5hbWVzW107Ci0jZGVmaW5lIEdMWF9OQVRJVkVfRU5URVIoZW52LCB0aGF0LCBmdW5jKSBHTFhfbmF0aXZlRnVuY3Rpb25DYWxsQ291bnRbZnVuY10rKzsKLSNkZWZpbmUgR0xYX05BVElWRV9FWElUKGVudiwgdGhhdCwgZnVuYykgCi0jZWxzZQotI2RlZmluZSBHTFhfTkFUSVZFX0VOVEVSKGVudiwgdGhhdCwgZnVuYykgCi0jZGVmaW5lIEdMWF9OQVRJVkVfRVhJVChlbnYsIHRoYXQsIGZ1bmMpIAotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0JZ2xYQ2hvb3NlVmlzdWFsX0ZVTkMsCi0JZ2xYQ29weUNvbnRleHRfRlVOQywKLQlnbFhDcmVhdGVDb250ZXh0X0ZVTkMsCi0JZ2xYQ3JlYXRlR0xYUGl4bWFwX0ZVTkMsCi0JZ2xYRGVzdHJveUNvbnRleHRfRlVOQywKLQlnbFhEZXN0cm95R0xYUGl4bWFwX0ZVTkMsCi0JZ2xYR2V0Q2xpZW50U3RyaW5nX0ZVTkMsCi0JZ2xYR2V0Q29uZmlnX0ZVTkMsCi0JZ2xYR2V0Q3VycmVudENvbnRleHRfRlVOQywKLQlnbFhHZXRDdXJyZW50RHJhd2FibGVfRlVOQywKLQlnbFhJc0RpcmVjdF9GVU5DLAotCWdsWE1ha2VDdXJyZW50X0ZVTkMsCi0JZ2xYUXVlcnlFeHRlbnNpb25fRlVOQywKLQlnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmdfRlVOQywKLQlnbFhRdWVyeVNlcnZlclN0cmluZ19GVU5DLAotCWdsWFF1ZXJ5VmVyc2lvbl9GVU5DLAotCWdsWFN3YXBCdWZmZXJzX0ZVTkMsCi0JZ2xYVXNlWEZvbnRfRlVOQywKLQlnbFhXYWl0R0xfRlVOQywKLQlnbFhXYWl0WF9GVU5DLAotCW1lbW1vdmVfRlVOQywKLX0gR0xYX0ZVTkNTOwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3M2MxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL2xpYnJhcnkvZ2x4X3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAiZ2x4X3N0cnVjdHMuaCIKLQotI2lmbmRlZiBOT19YVmlzdWFsSW5mbwotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotCi1YVmlzdWFsSW5mb19GSURfQ0FDSEUgWFZpc3VhbEluZm9GYzsKLQotdm9pZCBjYWNoZVhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0KQotewotCWlmIChYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgcmV0dXJuOwotCVhWaXN1YWxJbmZvRmMuY2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCVhWaXN1YWxJbmZvRmMudmlzdWFsID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJ2aXN1YWxpZCIsICJJIik7Ci0JWFZpc3VhbEluZm9GYy5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmRlcHRoID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgWFZpc3VhbEluZm9GYy5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjY2xhc3MiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMucmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYVmlzdWFsSW5mb0ZjLmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuZ3JlZW5fbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJibHVlX21hc2siLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlYVmlzdWFsSW5mb0ZjLmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhWaXN1YWxJbmZvRmMuY2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCVhWaXN1YWxJbmZvRmMuY2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JaWYgKCFYVmlzdWFsSW5mb0ZjLmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGxwT2JqZWN0KTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCk7Ci0JbHBTdHJ1Y3QtPnZpc3VhbGlkID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmRlcHRoKTsKLQlscFN0cnVjdC0+Y2NsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmNjbGFzcyk7Ci0JbHBTdHJ1Y3QtPnJlZF9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmJsdWVfbWFzayk7Ci0JbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCWlmICghWFZpc3VhbEluZm9GYy5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoZW52LCBscE9iamVjdCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLnZpc3VhbGlkLCAoamludClscFN0cnVjdC0+dmlzdWFsaWQpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY2NsYXNzLCAoamludClscFN0cnVjdC0+Y2NsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMucmVkX21hc2ssIChqaW50KWxwU3RydWN0LT5yZWRfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBYVmlzdWFsSW5mb0ZjLmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuYmx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIFhWaXN1YWxJbmZvRmMuY29sb3JtYXBfc2l6ZSwgKGppbnQpbHBTdHJ1Y3QtPmNvbG9ybWFwX3NpemUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgWFZpc3VhbEluZm9GYy5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9nbHhfc3RydWN0cy5oIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGYwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L2dseF9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImdseC5oIgotCi0jaWZuZGVmIE5PX1hWaXN1YWxJbmZvCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QpOwotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLSNkZWZpbmUgWFZpc3VhbEluZm9fc2l6ZW9mKCkgc2l6ZW9mKFhWaXN1YWxJbmZvKQotI2Vsc2UKLSNkZWZpbmUgY2FjaGVYVmlzdWFsSW5mb0ZpZWxkcyhhLGIpCi0jZGVmaW5lIGdldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKSBOVUxMCi0jZGVmaW5lIHNldFhWaXN1YWxJbmZvRmllbGRzKGEsYixjKQotI2RlZmluZSBYVmlzdWFsSW5mb19zaXplb2YoKSAwCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L21ha2VfbGludXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmU5NTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9tYWtlX2xpbnV4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi1DQz1nY2MKLUxEPWdjYwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1XU19QUkVGSVggICA9IGd0awotR0xfUFJFRklYICAgPSBnbAotR0xfRExMICAgICAgPSBsaWIkKEdMX1BSRUZJWCktJChXU19QUkVGSVgpLnNvCi1HTF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1HTF9MSUIgICAgICA9IC1zaGFyZWQgLUwvdXNyL1gxMVI2L2xpYiAtbEdMIC1sR0xVIC1sbQotCi1DRkxBR1MgPSAtTzIgLVdhbGwgLUkuCi0KLWFsbDogbWFrZV9nbAotCi1tYWtlX2dsOiAkKEdMX0RMTCkKLQkkKExEKSAkKEdMX0xJQikgLW8gJChHTF9ETEwpICQoR0xfT0JKKQotCi0kKEdMX0RMTCk6ICQoR0xfT0JKKQotCSQoQ0MpICQoQ0ZMQUdTKSAtYyBnbHguYwotCi1jbGVhbjoKLQlybSAtZiAqLnNvICoubwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgInN3dC5oIgotI2luY2x1ZGUgInN0cnVjdHMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgWFZpc3VhbEluZm9fRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCB2aXN1YWwsIHZpc3VhbGlkLCBzY3JlZW4sIGRlcHRoLCBjY2xhc3MsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2ssIGNvbG9ybWFwX3NpemUsIGJpdHNfcGVyX3JnYjsKLX0gWFZpc3VhbEluZm9fRklEX0NBQ0hFOwotdHlwZWRlZiBYVmlzdWFsSW5mb19GSURfQ0FDSEUgKlBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci0KLVhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBYVmlzdWFsSW5mb0ZjOwotCi12b2lkIGNhY2hlWFZpc3VhbEluZm9GaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT52aXN1YWwgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbCIsICJJIik7Ci0JbHBDYWNoZS0+dmlzdWFsaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInZpc3VhbGlkIiwgIkkiKTsKLQlscENhY2hlLT5zY3JlZW4gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInNjcmVlbiIsICJJIik7Ci0JbHBDYWNoZS0+ZGVwdGggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImRlcHRoIiwgIkkiKTsKLQlscENhY2hlLT5jY2xhc3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNjbGFzcyIsICJJIik7Ci0JbHBDYWNoZS0+cmVkX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgInJlZF9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJncmVlbl9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5ibHVlX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJsdWVfbWFzayIsICJJIik7Ci0JbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY29sb3JtYXBfc2l6ZSIsICJJIik7Ci0JbHBDYWNoZS0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiaXRzX3Blcl9yZ2IiLCAiSSIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLVhWaXN1YWxJbmZvICpnZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+dmlzdWFsID0gKFZpc3VhbCAqKSgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsKTsKLQlscFN0cnVjdC0+dmlzdWFsaWQgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbGlkKTsKLQlscFN0cnVjdC0+c2NyZWVuID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4pOwotCWxwU3RydWN0LT5kZXB0aCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgpOwotCWxwU3RydWN0LT5jbGFzcyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y2NsYXNzKTsKLQlscFN0cnVjdC0+cmVkX21hc2sgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrKTsKLQlscFN0cnVjdC0+Z3JlZW5fbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzayk7Ci0JbHBTdHJ1Y3QtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrKTsKLQlscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y29sb3JtYXBfc2l6ZSk7Ci0JbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYiA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Yml0c19wZXJfcmdiKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCkKLXsKLQlQWFZpc3VhbEluZm9fRklEX0NBQ0hFIGxwQ2FjaGUgPSAmWFZpc3VhbEluZm9GYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwsIChqaW50KWxwU3RydWN0LT52aXN1YWwpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQsIChqaW50KWxwU3RydWN0LT52aXN1YWxpZCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5zY3JlZW4sIChqaW50KWxwU3RydWN0LT5zY3JlZW4pOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZGVwdGgsIChqaW50KWxwU3RydWN0LT5kZXB0aCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MsIChqaW50KWxwU3RydWN0LT5jbGFzcyk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5yZWRfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPnJlZF9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdyZWVuX21hc2ssIChqaW50KWxwU3RydWN0LT5ncmVlbl9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJsdWVfbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmJsdWVfbWFzayk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplLCAoamludClscFN0cnVjdC0+Y29sb3JtYXBfc2l6ZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IsIChqaW50KWxwU3RydWN0LT5iaXRzX3Blcl9yZ2IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9saWJyYXJ5L3N0cnVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9ndGsvb3JnL2VjbGlwc2Uvc3d0L2ludGVybmFsL29wZW5nbC9ndGsvR0xYLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1MDc5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9HTFguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9wZW5nbC5ndGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci0KLXB1YmxpYyBjbGFzcyBHTFggewotCQotc3RhdGljIHsKLQlMaWJyYXJ5LmxvYWRMaWJyYXJ5KCJnbCIpOwotfQotCi0vKgotKiogVmlzdWFsIENvbmZpZyBBdHRyaWJ1dGVzIChnbFhHZXRDb25maWcsIGdsWEdldEZCQ29uZmlnQXR0cmliKQotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9VU0VfR0wJCQkJPSAxOwkvKiBzdXBwb3J0IEdMWCByZW5kZXJpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CVUZGRVJfU0laRQkJCT0gMjsJLyogZGVwdGggb2YgdGhlIGNvbG9yIGJ1ZmZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0xFVkVMCQkJCT0gMzsJLyogbGV2ZWwgaW4gcGxhbmUgc3RhY2tpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBCQkJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJCT0gNTsJLyogZG91YmxlIGJ1ZmZlcmluZyBzdXBwb3J0ZWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVSRU8JCQkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQkJPSA3OwkvKiBudW1iZXIgb2YgYXV4IGJ1ZmZlcnMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRURfU0laRQkJCT0gODsJLyogbnVtYmVyIG9mIHJlZCBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0dSRUVOX1NJWkUJCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJCT0gMTA7CS8qIG51bWJlciBvZiBibHVlIGNvbXBvbmVudCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUxQSEFfU0laRQkJCT0gMTE7CS8qIG51bWJlciBvZiBhbHBoYSBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX1NJWkUJCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQkJPSAxMzsJLyogbnVtYmVyIG9mIHN0ZW5jaWwgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX1JFRF9TSVpFCQk9IDE0OwkvKiBudW1iZXIgb2YgcmVkIGFjY3VtIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9HUkVFTl9TSVpFCT0gMTU7CS8qIG51bWJlciBvZiBncmVlbiBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQkxVRV9TSVpFCQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJPSAweDIzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCT0gMHgyNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SRURfVkFMVUUJPSAweDI1OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCT0gMHgyNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCT0gMHgyNzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRQk9IDB4Mjg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRFJBV0FCTEVfVFlQRQkJPSAweDgwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUkVOREVSX1RZUEUJCQk9IDB4ODAxMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9YX1JFTkRFUkFCTEUJCT0gMHg4MDEyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkJPSAweDgwMTM7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfV0lEVEgJPSAweDgwMTY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTUFYX1BCVUZGRVJfSEVJR0hUCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwk9IDB4ODAxODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSUQJCQk9IDB4ODAwQjsKLQotLyoKLSoqIEVycm9yIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBTdWNjZXNzIGlzIGluZGljYXRlZCBieQotKiogYSB2YWx1ZSBvZiAwLgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfU0NSRUVOCQk9IDE7CS8qIHNjcmVlbiAjIGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9BVFRSSUJVVEUJPSAyOwkvKiBhdHRyaWJ1dGUgdG8gZ2V0IGlzIGJhZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PX0VYVEVOU0lPTgk9IDM7CS8qIG5vIGdseCBleHRlbnNpb24gb24gc2VydmVyICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZJU1VBTAkJPSA0OwkvKiB2aXN1YWwgIyBub3Qga25vd24gYnkgR0xYICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX0NPTlRFWFQJCT0gNTsJLyogcmV0dXJuZWQgb25seSBieSBpbXBvcnRfY29udGV4dCBFWFQ/ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1ZBTFVFCQk9IDY7CS8qIHJldHVybmVkIG9ubHkgYnkgZ2xYU3dhcEludGVydmFsU0dJPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9FTlVNCQk9IDc7CS8qIHVudXNlZD8gKi8KLQotLyogRkJDb25maWcgYXR0cmlidXRlIHZhbHVlcyAqLwotCi0vKgotKiogR2VuZXJpYyAiZG9uJ3QgY2FyZSIgdmFsdWUgZm9yIGdsWCBDaG9vc2VGQkNvbmZpZyBhdHRyaWJ1dGVzIChleGNlcHQKLSoqIEdMWF9MRVZFTCkKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRE9OVF9DQVJFCQkJPSAweEZGRkZGRkZGOwotCi0vKiBHTFhfUkVOREVSX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkFfQklUCQkJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTE9SX0lOREVYX0JJVAkJPSAweDAwMDAwMDAyOwotCi0vKiBHTFhfRFJBV0FCTEVfVFlQRSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QSVhNQVBfQklUCQkJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfQklUCQkJPSAweDAwMDAwMDA0OwotCi0vKiBHTFhfQ09ORklHX0NBVkVBVCBhdHRyaWJ1dGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORQkJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCT0gMHg4MDA5OwotCi0vKiBnbFhDcmVhdGVHTFhQYnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QUkVTRVJWRURfQ09OVEVOVFMJPSAweDgwMUI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTEFSR0VTVF9QQlVGRkVSCQk9IDB4ODAxQzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0hFSUdIVAkJPSAweDgwNDA7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfV0lEVEgJCT0gMHg4MDQxOwkvKiBOZXcgZm9yIEdMWCAxLjMgKi8KLQotLyogZ2xYUXVlcnlHTFhQQnVmZmVyIGF0dHJpYnV0ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9XSURUSAkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQk9IDB4ODAxRTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FVkVOVF9NQVNLCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCT0gMHg4MDE1OwotCi0vKiBnbFhRdWVyeUNvbnRleHQgYXR0cmlidXRlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZCQ09ORklHX0lECQkgIDB4ODAxMyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkgIDB4ODAxMSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NDUkVFTgkJCT0gMHg4MDBDOwotCi0vKiBnbFhTZWxlY3RFdmVudCBldmVudCBtYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0NMT0JCRVJfTUFTSwk9IDB4MDgwMDAwMDA7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZXZlbnRfdHlwZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9EQU1BR0VECQkJPSAweDgwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0FWRUQJCQk9IDB4ODAyMTsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBkcmF3X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfV0lORE9XCQkJPSAweDgwMjI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUgkJCT0gMHg4MDIzOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGJ1ZmZlcl9tYXNrIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9MRUZUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0ZST05UX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX1JJR0hUX0JVRkZFUl9CSVQJPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTX0JJVAkJPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RFUFRIX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQJCT0gMHgwMDAwMDA0MDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BQ0NVTV9CVUZGRVJfQklUCQk9IDB4MDAwMDAwODA7Ci0KLS8qCi0qKiBFeHRlbnNpb24gcmV0dXJuIHZhbHVlcyBmcm9tIGdsWEdldENvbmZpZy4gIFRoZXNlIGFyZSBhbHNvCi0qKiBhY2NlcHRlZCBhcyBwYXJhbWV0ZXIgdmFsdWVzIGZvciBnbFhDaG9vc2VWaXN1YWwuCi0qLwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRV9FWFQgPSAweDIyOwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEVfRVhUID0gMHgyMzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfRVhUID0gMHgyNDsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFX0VYVAk9IDB4MjU7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFX0VYVCA9IDB4MjY7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUVfRVhUCT0gMHgyNzsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUVfRVhUID0gMHgyODsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uICovCi0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdmlzdWFsX3R5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUlVFX0NPTE9SX0VYVAk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1JfRVhUCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUl9FWFQJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SX0VYVAk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFX0VYVAk9IDB4ODAwNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TVEFUSUNfR1JBWV9FWFQJPSAweDgwMDc7Ci0KLS8qIFByb3BlcnR5IHZhbHVlcyBmb3IgdHJhbnNwYXJlbnQgcGl4ZWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT05FX0VYVAkJPSAweDgwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkdCX0VYVAkJPSAweDgwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfRVhUCT0gMHg4MDA5OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF9yYXRpbmcgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfQ0FWRUFUX0VYVAkJPSAweDIwOyAgLyogdmlzdWFsX3JhdGluZyBleHRlbnNpb24gdHlwZSAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NMT1dfVklTVUFMX0VYVAkJPSAweDgwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9OX0NPTkZPUk1BTlRfVklTVUFMX0VYVAk9IDB4ODAwRDsKLQotLyoKLSoqIE5hbWVzIGZvciBhdHRyaWJ1dGVzIHRvIGdsWEdldENsaWVudFN0cmluZy4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVORE9SCQk9IDB4MTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OCQk9IDB4MjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRFTlNJT05TCT0gMHgzOwotCi0vKgotKiogTmFtZXMgZm9yIGF0dHJpYnV0ZXMgdG8gZ2xYUXVlcnlDb250ZXh0SW5mb0VYVC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0hBUkVfQ09OVEVYVF9FWFQgPSAweDgwMEE7CS8qIGlkIG9mIHNoYXJlIGNvbnRleHQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WSVNVQUxfSURfRVhUID0gMHg4MDBCOwkvKiBpZCBvZiBjb250ZXh0J3MgdmlzdWFsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU0NSRUVOX0VYVCA9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKgotKiBHTFggMS40IAotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVfQlVGRkVSUyA9IDEwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQU1QTEVTID0gMTAwMDAxOwotCi1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ2hvb3NlVmlzdWFsKGludCBkcHksIGludCBzY3JlZW4sIGludFtdIGF0dHJpYkxpc3QpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhDb3B5Q29udGV4dChpbnQgZHB5LCBpbnQgc3JjLCBpbnQgZHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9pbnRlcm5hbC9vcGVuZ2wvZ3RrL1hWaXN1YWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMzk2OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3QvaW50ZXJuYWwvb3BlbmdsL2d0ay9YVmlzdWFsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vcGVuZ2wuZ3RrOwotCi0gCi1wdWJsaWMgY2xhc3MgWFZpc3VhbEluZm8gewotCXB1YmxpYyBpbnQgdmlzdWFsOwotCXB1YmxpYyBpbnQgdmlzdWFsaWQ7Ci0JcHVibGljIGludCBzY3JlZW47Ci0JcHVibGljIGludCBkZXB0aDsKLQlwdWJsaWMgaW50IGNjbGFzczsKLQlwdWJsaWMgaW50IHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2s7Ci0JcHVibGljIGludCBjb2xvcm1hcF9zaXplOwotCXB1YmxpYyBpbnQgYml0c19wZXJfcmdiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNpemVvZiA9IDQwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL2d0ay9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ2FudmFzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzZjNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvZ3RrL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2w7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5ndGsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub3BlbmdsLmd0ay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotCi0vKioKLSAqIEdMQ2FudmFzIGlzIGEgd2lkZ2V0IGNhcGFibGUgb2YgZGlzcGxheWluZyBPcGVuR0wgY29udGVudC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgR0xDYW52YXMgZXh0ZW5kcyBDYW52YXMgewotCWludCAvKmxvbmcqLyB4ZGlzcGxheTsKLQlpbnQgLypsb25nKi8geGlkOwotCWludCAvKmxvbmcqLyBjb250ZXh0OwotCWludCAvKmxvbmcqLyBnbFdpbmRvdzsKLQlYVmlzdWFsSW5mbyB2aW5mbzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVRUUklCVVRFUyA9IDMyOwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsJCi0JaWYgKGRhdGEgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaW50IGdseEF0dHJpYiBbXSA9IG5ldyBpbnQgW01BWF9BVFRSSUJVVEVTXTsKLQlpbnQgcG9zID0gMDsKLQotCU9TLmd0a193aWRnZXRfcmVhbGl6ZSAoaGFuZGxlKTsKLQlpbnQgLypsb25nKi8gd2luZG93ID0gT1MuR1RLX1dJREdFVF9XSU5ET1cgKGhhbmRsZSk7Ci0JeGRpc3BsYXkgPSBPUy5nZGtfeDExX2RyYXdhYmxlX2dldF94ZGlzcGxheSAod2luZG93KTsKLQlpbnQgeHNjcmVlbiA9IE9TLlhEZWZhdWx0U2NyZWVuICh4ZGlzcGxheSk7Ci0KLQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfUkdCQTsKLQlpZiAoZGF0YS5kb3VibGVCdWZmZXIpIGdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFUkVPOwotCWlmIChkYXRhLnJlZFNpemUgPiAwKSB7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gR0xYLkdMWF9SRURfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnJlZFNpemU7Ci0JfQotCWlmIChkYXRhLmdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5ncmVlblNpemU7Ci0JfQotCWlmIChkYXRhLmJsdWVTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQkxVRV9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFscGhhU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FMUEhBX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hbHBoYVNpemU7Ci0JfQotCWlmIChkYXRhLmRlcHRoU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0RFUFRIX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5kZXB0aFNpemU7Ci0JfQotCWlmIChkYXRhLnN0ZW5jaWxTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU1RFTkNJTF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuc3RlbmNpbFNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtUmVkU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFOwotCQlnbHhBdHRyaWIgW3BvcysrXSA9IGRhdGEuYWNjdW1SZWRTaXplOwotCX0KLQlpZiAoZGF0YS5hY2N1bUdyZWVuU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkU7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5hY2N1bUdyZWVuU2l6ZTsKLQl9Ci0JaWYgKGRhdGEuYWNjdW1CbHVlU2l6ZSA+IDApIHsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBHTFguR0xYX0FDQ1VNX0JMVUVfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JfQotCWlmIChkYXRhLmFjY3VtQWxwaGFTaXplID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfQUNDVU1fQUxQSEFfU0laRTsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFX0JVRkZFUlM7Ci0JCWdseEF0dHJpYiBbcG9zKytdID0gZGF0YS5zYW1wbGVCdWZmZXJzOwotCX0KLQlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotCQlnbHhBdHRyaWIgW3BvcysrXSA9IEdMWC5HTFhfU0FNUExFUzsKLQkJZ2x4QXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZXM7Ci0JfQotCWdseEF0dHJpYiBbcG9zKytdID0gMDsKLQlpbnQgaW5mb1B0ciA9IEdMWC5nbFhDaG9vc2VWaXN1YWwgKHhkaXNwbGF5LCB4c2NyZWVuLCBnbHhBdHRyaWIpOwotCWlmIChpbmZvUHRyID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLQl2aW5mbyA9IG5ldyBYVmlzdWFsSW5mbyAoKTsKLQlHTFgubWVtbW92ZSAodmluZm8sIGluZm9QdHIsIFhWaXN1YWxJbmZvLnNpemVvZik7Ci0JT1MuWEZyZWUgKGluZm9QdHIpOwotCWludCAvKmxvbmcqLyBzY3JlZW4gPSBPUy5nZGtfc2NyZWVuX2dldF9kZWZhdWx0ICgpOwotCWludCAvKmxvbmcqLyBnZGt2aXN1YWwgPSBPUy5nZGtfeDExX3NjcmVlbl9sb29rdXBfdmlzdWFsIChzY3JlZW4sIHZpbmZvLnZpc3VhbGlkKTsKLQkvL2NvbnRleHQgPSBHTFguZ2xYQ3JlYXRlQ29udGV4dCAoeGRpc3BsYXksIGluZm8sIHNoYXJlID09IG51bGwgPyAwIDogc2hhcmUuY29udGV4dCwgdHJ1ZSk7Ci0JY29udGV4dCA9IEdMWC5nbFhDcmVhdGVDb250ZXh0ICh4ZGlzcGxheSwgdmluZm8sIDAsIHRydWUpOwotCWlmIChjb250ZXh0ID09IDApIFNXVC5lcnJvciAoU1dULkVSUk9SX05PX0hBTkRMRVMpOwotCUdka1dpbmRvd0F0dHIgYXR0cnMgPSBuZXcgR2RrV2luZG93QXR0ciAoKTsKLQlhdHRycy53aWR0aCA9IDE7Ci0JYXR0cnMuaGVpZ2h0ID0gMTsKLQlhdHRycy5ldmVudF9tYXNrID0gT1MuR0RLX0tFWV9QUkVTU19NQVNLIHwgT1MuR0RLX0tFWV9SRUxFQVNFX01BU0sgfAotCQlPUy5HREtfRk9DVVNfQ0hBTkdFX01BU0sgfCBPUy5HREtfUE9JTlRFUl9NT1RJT05fTUFTSyB8Ci0JCU9TLkdES19CVVRUT05fUFJFU1NfTUFTSyB8IE9TLkdES19CVVRUT05fUkVMRUFTRV9NQVNLIHwKLQkJT1MuR0RLX0VOVEVSX05PVElGWV9NQVNLIHwgT1MuR0RLX0xFQVZFX05PVElGWV9NQVNLIHwKLQkJT1MuR0RLX0VYUE9TVVJFX01BU0sgfCBPUy5HREtfVklTSUJJTElUWV9OT1RJRllfTUFTSzsKLQlhdHRycy53aW5kb3dfdHlwZSA9IE9TLkdES19XSU5ET1dfQ0hJTEQ7Ci0JYXR0cnMudmlzdWFsID0gZ2RrdmlzdWFsOwotCWdsV2luZG93ID0gT1MuZ2RrX3dpbmRvd19uZXcgKHdpbmRvdywgYXR0cnMsIE9TLkdES19XQV9WSVNVQUwpOwotCU9TLmdka193aW5kb3dfc2V0X3VzZXJfZGF0YSAoZ2xXaW5kb3csIGhhbmRsZSk7Ci0JeGlkID0gT1MuZ2RrX3gxMV9kcmF3YWJsZV9nZXRfeGlkIChnbFdpbmRvdyk7Ci0JT1MuZ2RrX3dpbmRvd19zaG93IChnbFdpbmRvdyk7Ci0KLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5QYWludDoKLQkJCQkvKioKLQkJCQkqIEJ1ZyBpbiBNRVNBLiAgTUVTQSBkb2VzIHNvbWUgbmFzdHkgc29ydCBvZiBwb2xsaW5nIHRvIHRyeQotCQkJCSogYW5kIGVuc3VyZSB0aGF0IHRoZWlyIGJ1ZmZlciBzaXplcyBtYXRjaCB0aGUgY3VycmVudCBYIHN0YXRlLgotCQkJCSogVGhpcyBzdGF0ZSBjYW4gYmUgdXBkYXRlZCB1c2luZyBnbFZpZXdwb3J0KCkuCi0JCQkJKiBGSVhNRTogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSBvZiBkb2luZyB0aGlzLgotCQkJCSovCi0JCQkJaW50IFtdIHZpZXdwb3J0ID0gbmV3IGludCBbNF07Ci0JCQkJR0wuZ2xHZXRJbnRlZ2VydiAoR0wuR0xfVklFV1BPUlQsIHZpZXdwb3J0KTsKLQkJCQlHTC5nbFZpZXdwb3J0ICh2aWV3cG9ydCBbMF0sdmlld3BvcnQgWzFdLHZpZXdwb3J0IFsyXSx2aWV3cG9ydCBbM10pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQkJCU9TLmdka193aW5kb3dfbW92ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55KTsKLQkJCQlPUy5nZGtfd2luZG93X3Jlc2l6ZSAoZ2xXaW5kb3csIGNsaWVudEFyZWEud2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkRpc3Bvc2U6Ci0JCQkJaWYgKGNvbnRleHQgIT0gMCkgewotCQkJCQlpZiAoR0xYLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGNvbnRleHQpIHsKLQkJCQkJCUdMWC5nbFhNYWtlQ3VycmVudCh4ZGlzcGxheSwgMCwgMCk7Ci0JCQkJCX0KLQkJCQkJR0xYLmdsWERlc3Ryb3lDb250ZXh0ICh4ZGlzcGxheSwgY29udGV4dCk7Ci0JCQkJCWNvbnRleHQgPSAwOwotCQkJCX0KLQkJCQlpZiAoZ2xXaW5kb3cgIT0gMCkgewotCQkJCQlPUy5nZGtfd2luZG93X2Rlc3Ryb3kgKGdsV2luZG93KTsKLQkJCQkJZ2xXaW5kb3cgPSAwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlhZGRMaXN0ZW5lciAoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlpbnQgW10gdmFsdWUgPSBuZXcgaW50IFsxXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfRE9VQkxFQlVGRkVSLCB2YWx1ZSk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU1RFUkVPLCB2YWx1ZSk7Ci0JZGF0YS5zdGVyZW8gPSB2YWx1ZSBbMF0gIT0gMDsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfUkVEX1NJWkUsIHZhbHVlKTsKLQlkYXRhLnJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmdyZWVuU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQkxVRV9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5ibHVlU2l6ZSA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfQUxQSEFfU0laRSwgdmFsdWUpOwotCWRhdGEuYWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9ERVBUSF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5kZXB0aFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX1NURU5DSUxfU0laRSwgdmFsdWUpOwotCWRhdGEuc3RlbmNpbFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX1JFRF9TSVpFLCB2YWx1ZSk7Ci0JZGF0YS5hY2N1bVJlZFNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0dSRUVOX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtR3JlZW5TaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9BQ0NVTV9CTFVFX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQmx1ZVNpemUgPSB2YWx1ZSBbMF07Ci0JR0xYLmdsWEdldENvbmZpZyAoeGRpc3BsYXksIHZpbmZvLCBHTFguR0xYX0FDQ1VNX0FMUEhBX1NJWkUsIHZhbHVlKTsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gdmFsdWUgWzBdOwotCUdMWC5nbFhHZXRDb25maWcgKHhkaXNwbGF5LCB2aW5mbywgR0xYLkdMWF9TQU1QTEVfQlVGRkVSUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlQnVmZmVycyA9IHZhbHVlIFswXTsKLQlHTFguZ2xYR2V0Q29uZmlnICh4ZGlzcGxheSwgdmluZm8sIEdMWC5HTFhfU0FNUExFUywgdmFsdWUpOwotCWRhdGEuc2FtcGxlcyA9IHZhbHVlIFswXTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIEdMWC5nbFhHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBjb250ZXh0OwotfQotCi0vKioKLSAqIFNldHMgdGhlIE9wZW5HTCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdMQ2FudmFzIHRvIGJlIHRoZQotICogY3VycmVudCBHTCBjb250ZXh0LgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChHTFguZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gY29udGV4dCkgcmV0dXJuOwotCUdMWC5nbFhNYWtlQ3VycmVudCAoeGRpc3BsYXksIHhpZCwgY29udGV4dCk7Ci19Ci0KLS8qKgotICogU3dhcHMgdGhlIGZyb250IGFuZCBiYWNrIGNvbG9yIGJ1ZmZlcnMuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc3dhcEJ1ZmZlcnMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMWC5nbFhTd2FwQnVmZmVycyAoeGRpc3BsYXksIHhpZCk7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9idWlsZC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmVjMTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2J1aWxkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyEvYmluL3NoCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBLZXZpbiBDb3JuZWxsIChSYXRpb25hbCBTb2Z0d2FyZSBDb3Jwb3JhdGlvbikKLSMgICAgIFRvbSBUcm9tZXkgKFJlZCBIYXQsIEluYy4pCi0jICAgICBTcmlkaGFyIEJpZGlnYWx1IChJQ1MpCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1jZCBgZGlybmFtZSAkMGAKLQotIyBEZXRlcm1pbmUgdGhlIG9wZXJhdGluZyBzeXN0ZW0gYmVpbmcgYnVpbHQKLW1ha2VmaWxlPSIiCi1PUz1gdW5hbWUgLXNgCi1NT0RFTD1gdW5hbWUgLW1gCi0KLWNhc2UgJE9TIGluCi0JIkFJWCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvYWl4ajkKLQkJTU9USUZfSE9NRT0vdXNyCi0JCUNERV9IT01FPS91c3IvZHQKLQkJbWFrZWZpbGU9Im1ha2VfYWl4Lm1hayIKLQkJZWNobyAiQnVpbGRpbmcgQUlYIHZlcnNpb24gb2YgU1dUIgotCQk7OwotCSJMaW51eCIpCi0JCUpBVkFfSE9NRT0vYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvSUJNSmF2YTItMTQxCi0JCU1PVElGX0hPTUU9L2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL21vdGlmMjEKLQkJUVRfSE9NRT0kUVRESVIKLQkJbWFrZWZpbGU9Im1ha2VfbGludXgubWFrIgotCQllY2hvICJCdWlsZGluZyBMaW51eCB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiU3VuT1MiKQotCQlKQVZBX0hPTUU9L3Vzci9qYXZhCi0JCU1PVElGX0hPTUU9L3Vzci9kdAotCQlDREVfSE9NRT0vdXNyL2R0Ci0JCVBBVEg9L29wdC9TVU5Xc3Byby9iaW46JFBBVEgKLQkJZXhwb3J0IFBBVEgJCQotCQltYWtlZmlsZT0ibWFrZV9zb2xhcmlzLm1hayIKLQkJZWNobyAiQnVpbGRpbmcgU29sYXJpcyB2ZXJzaW9uIG9mIFNXVCIKLQkJOzsKLQkiSFAtVVgiKQotCQlKQVZBX0hPTUU9L29wdC9qZGsxNDEwMQotCQlNT1RJRl9IT01FPS91c3IKLQkJQ0RFX0hPTUU9L3Vzci9kdAotCQljYXNlICRNT0RFTCBpbgotCQkJImlhNjQiKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfaWE2NC5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCBpYTY0IHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCQkqKQotCQkJCW1ha2VmaWxlPSJtYWtlX2hwdXhfUEFfUklTQy5tYWsiCi0JCQkJZWNobyAiQnVpbGRpbmcgSFBVWCByaXNjIHZlcnNpb24gb2YgU1dUIgotCQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQotCSopCi0JCWVjaG8gIlVua25vd24gT1MgLS0gYnVpbGQgYWJvcnRlZCIKLQkJOzsKLWVzYWMKLQotZXhwb3J0IEpBVkFfSE9NRSBNT1RJRl9IT01FIENERV9IT01FIFFUX0hPTUUKLQotbWFrZSAtZiAkbWFrZWZpbGUgJDEgJDIgJDMgJDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9nbHguYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhlMTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L2dseC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8R0wvZ2x4Lmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFhHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWENob29zZVZpc3VhbCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENob29zZVZpc3VhbFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqaW50KWdsWENob29zZVZpc3VhbCgoRGlzcGxheSAqKWFyZzAsIGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcyKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMiwgbHBhcmcyLCAwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYQ29weUNvbnRleHRcbiIpCi0KLQlnbFhDb3B5Q29udGV4dCgoRGlzcGxheSAqKWFyZzAsIChHTFhDb250ZXh0KWFyZzEsIChHTFhDb250ZXh0KWFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGpvYmplY3QgYXJnMSwgamludCBhcmcyLCBqYm9vbGVhbiBhcmczKQotewotCVhWaXN1YWxJbmZvIF9hcmcxLCAqbHBhcmcxPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoImdsWENyZWF0ZUNvbnRleHRcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlQ29udGV4dCgoRGlzcGxheSAqKWFyZzAsIGxwYXJnMSwgKEdMWENvbnRleHQpYXJnMiwgYXJnMyk7Ci0JaWYgKGFyZzEpIHNldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhDcmVhdGVHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMikKLXsKLQlYVmlzdWFsSW5mbyBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhDcmVhdGVHTFhQaXhtYXBcbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gZ2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpZ2xYQ3JlYXRlR0xYUGl4bWFwKChEaXNwbGF5ICopYXJnMCwgbHBhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMSkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcxLCBscGFyZzEpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWERlc3Ryb3lDb250ZXh0XG4iKQotCi0JZ2xYRGVzdHJveUNvbnRleHQoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWERlc3Ryb3lHTFhQaXhtYXApCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYRGVzdHJveUdMWFBpeG1hcFxuIikKLQotCWdsWERlc3Ryb3lHTFhQaXhtYXAoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldENsaWVudFN0cmluZykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhHZXRDbGllbnRTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q2xpZW50U3RyaW5nKChEaXNwbGF5ICopYXJnMCwgYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgWEdMX05BVElWRShnbFhHZXRDb25maWcpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqb2JqZWN0IGFyZzEsIGppbnQgYXJnMiwgamludEFycmF5IGFyZzMpCi17Ci0JWFZpc3VhbEluZm8gX2FyZzEsICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiZ2xYR2V0Q29uZmlnXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9IGdldFhWaXN1YWxJbmZvRmllbGRzKGVudiwgYXJnMSwgJl9hcmcxKTsKLQlpZiAoYXJnMykgbHBhcmczID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMywgTlVMTCk7Ci0JcmMgPSAoamludClnbFhHZXRDb25maWcoKERpc3BsYXkgKilhcmcwLCBscGFyZzEsIGFyZzIsIChpbnQgKilscGFyZzMpOwotCWlmIChhcmcxKSBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhlbnYsIGFyZzEsIGxwYXJnMSk7Ci0JaWYgKGFyZzMpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmczLCBscGFyZzMsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnRDb250ZXh0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYR2V0Q3VycmVudENvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYR2V0Q3VycmVudENvbnRleHQoKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWEdldEN1cnJlbnREcmF3YWJsZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWEdldEN1cnJlbnREcmF3YWJsZVxuIikKLQotCXJldHVybiAoamludClnbFhHZXRDdXJyZW50RHJhd2FibGUoKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhJc0RpcmVjdCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJnbFhJc0RpcmVjdFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pZ2xYSXNEaXJlY3QoKERpc3BsYXkgKilhcmcwLCAoR0xYQ29udGV4dClhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoImdsWE1ha2VDdXJyZW50XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbilnbFhNYWtlQ3VycmVudCgoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxLCAoR0xYQ29udGV4dClhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeUV4dGVuc2lvbikKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnRBcnJheSBhcmcxLCBqaW50QXJyYXkgYXJnMikKLXsKLQlqaW50ICpscGFyZzE9TlVMTDsKLQlqaW50ICpscGFyZzI9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uXG4iKQotCi0JaWYgKGFyZzEpIGxwYXJnMSA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzEsIE5VTEwpOwotCWlmIChhcmcyKSBscGFyZzIgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBhcmcyLCBOVUxMKTsKLQlyYyA9IChqYm9vbGVhbilnbFhRdWVyeUV4dGVuc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYUXVlcnlFeHRlbnNpb25zU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxKQotewotCURFQlVHX0NBTEwoImdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZ1xuIikKLQotCXJldHVybiAoamludClnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxKTsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFF1ZXJ5U2VydmVyU3RyaW5nKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYUXVlcnlTZXJ2ZXJTdHJpbmdcbiIpCi0KLQlyZXR1cm4gKGppbnQpZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoKERpc3BsYXkgKilhcmcwLCBhcmcxLCBhcmcyKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgWEdMX05BVElWRShnbFhRdWVyeVZlcnNpb24pCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50QXJyYXkgYXJnMSwgamludEFycmF5IGFyZzIpCi17Ci0JamludCAqbHBhcmcxPU5VTEw7Ci0JamludCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJnbFhRdWVyeVZlcnNpb25cbiIpCi0KLQlpZiAoYXJnMSkgbHBhcmcxID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgTlVMTCk7Ci0JaWYgKGFyZzIpIGxwYXJnMiA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIE5VTEwpOwotCXJjID0gKGpib29sZWFuKWdsWFF1ZXJ5VmVyc2lvbigoRGlzcGxheSAqKWFyZzAsIChpbnQgKilscGFyZzEsIChpbnQgKilscGFyZzIpOwotCWlmIChhcmcxKSAoKmVudiktPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnMSwgbHBhcmcxLCAwKTsKLQlpZiAoYXJnMikgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzIsIGxwYXJnMiwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYU3dhcEJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYU3dhcEJ1ZmZlcnNcbiIpCi0KLQlnbFhTd2FwQnVmZmVycygoRGlzcGxheSAqKWFyZzAsIChHTFhEcmF3YWJsZSlhcmcxKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKGdsWFVzZVhGb250KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMykKLXsKLQlERUJVR19DQUxMKCJnbFhVc2VYRm9udFxuIikKLQotCWdsWFVzZVhGb250KGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFhHTF9OQVRJVkUoZ2xYV2FpdEdMKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgiZ2xYV2FpdEdMXG4iKQotCi0JZ2xYV2FpdEdMKCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgWEdMX05BVElWRShnbFhXYWl0WCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0KQotewotCURFQlVHX0NBTEwoImdsWFdhaXRYXG4iKQotCi0JZ2xYV2FpdFgoKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBYR0xfTkFUSVZFKG1lbW1vdmVfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX21vdGlmX1hWaXN1YWxJbmZvXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCVhWaXN1YWxJbmZvIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJtZW1tb3ZlX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF9tb3RpZl9YVmlzdWFsSW5mb18ySUlcbiIpCi0KLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCW1lbW1vdmUoKHZvaWQgKilscGFyZzAsIChjb25zdCB2b2lkICopYXJnMSwgKHNpemVfdClhcmcyKTsKLQlpZiAoYXJnMCkgc2V0WFZpc3VhbEluZm9GaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9haXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGI3YjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfYWl4Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgRGVmaW5lIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIHZhcmlvdXMgcHJvZHVjdHMuCi0jICAgIEpBVkFfSE9NRSAgLSBUaGUgSkRLID4gMS4zCi1KQVZBX0hPTUUgICA9IC91c3IvamF2YTEzMQotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBzd3QKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ibm9lbnRyeSAtbGNfciAtbENfciAtbG0gLWJleHBhbGwgLWxNcm0gLWxYMTEgLWxYZXh0IC1saWNvbnYgLWxHTCAtbEdMVQotCi0jCi0jIFRoZSBmb2xsb3dpbmcgQ0ZMQUdTIGFyZSBmb3IgY29tcGlsaW5nIHRoZSBTV1QgT3BlbkdMIGxpYnJhcnkuCi0jCi1DRkxBR1MgPSAtTyAtcyBcCi0JLURBSVggXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLXEgbWJjcyAtcWxhbmdsdmw9ZXh0ZW5kZWQgLXFtYXhtZW09ODE5MiBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAkKFNXVF9MSUIpIC1vICQoU1dUX0RMTCkgJChTV1RfT0JKKQotCi1jbGVhbjoKLQlybSAtZiAqLm8gKi5zbyAqLmEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX2hwdXgubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFmYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfaHB1eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICA9IC9vcHQvamF2YTEuMwotCi0jIERlZmluZSB0aGUgdmFyaW91cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIG1hZGUuCi1TV1RfUFJFRklYICAgPSBnbAotV1NfUFJFRklYICAgID0gbW90aWYKLVNXVF9ETEwgICAgICA9IGxpYiQoU1dUX1BSRUZJWCktJChXU19QUkVGSVgpLnNsCi1TV1RfT0JKICAgICAgPSBzd3QubyBnbC5vIGdsdS5vIHN0cnVjdHMubyBnbHgubwotU1dUX0xJQiAgICAgID0gLUwvdXNyL2xpYiAtTC9vcHQvZ3JhcGhpY3MvT3BlbkdML2xpYiAtRyAtbEdMIC1sR0xVIC1sYyAtbGRsZCAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLiBJZiB0aGlzIGZsYWcgaXMgbm90Ci0jCi1DRkxBR1MgPSAtQWUgK3ogXAotCS1ETk9fWElORVJBTUFfRVhURU5TSU9OUyBcCi0JLURfSFBVWCAtRF9QT1NJWF9DX1NPVVJDRT0xOTk1MDZMIFwKLQktSS4vIFwKLQktSSQoSkFWQV9IT01FKS9pbmNsdWRlIC1JJChKQVZBX0hPTUUpL2luY2x1ZGUvaHAtdXggXAotCS1JL29wdC9ncmFwaGljcy9PcGVuR0wvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtYiAteiAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbCAqLm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9saWJyYXJ5L21ha2VfbGludXgubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTk1YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9saW51eC5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0jIERlZmluZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIGZvciB2YXJpb3VzIHByb2R1Y3RzLgotSkFWQV9IT01FICAgPSAvYmx1ZWJpcmQvdGVhbXN3dC9zd3QtYnVpbGRkaXIvaXZlL2JpbgotCi0KLSMgRGVmaW5lIHRoZSB2YXJpb3VzIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgbWFkZS4KLVNXVF9QUkVGSVggICA9IGdsCi1XU19QUkVGSVggICAgPSBtb3RpZgotU1dUX0RMTCAgICAgID0gbGliJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuc28KLVNXVF9PQkogICAgICA9IHN3dC5vIGdsLm8gZ2x1Lm8gc3RydWN0cy5vIGdseC5vCi1TV1RfTElCICAgICAgPSAtc2hhcmVkIC1ML3Vzci9YMTFSNi9saWIgLWxHTCAtbEdMVSAtbG0KLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS1JLi8gXAotCS1JJChKQVZBX0hPTUUpL2luY2x1ZGUKLQotYWxsOiBtYWtlX3N3dAotCi1tYWtlX3N3dDogJChTV1RfRExMKQotCi0kKFNXVF9ETEwpOiAkKFNXVF9PQkopCi0JbGQgLW8gJEAgJChTV1RfT0JKKSAkKFNXVF9MSUIpCi0KLWNsZWFuOgotCXJtIC1mICouc28gKi5vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvbWFrZV9zb2xhcmlzLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1MTBiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9tYWtlX3NvbGFyaXMubWFrCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIyBEZWZpbmUgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBmb3IgdmFyaW91cyBwcm9kdWN0cy4KLUpBVkFfSE9NRSAgID0gL2JsdWViaXJkL3RlYW1zd3Qvc3d0LWJ1aWxkZGlyL2l2ZS9iaW4KLQotIyBEZWZpbmUgdGhlIHZhcmlvdXMgc2hhcmVkIGxpYnJhcmllcyB0byBiZSBtYWRlLgotU1dUX1BSRUZJWCAgID0gZ2wKLVdTX1BSRUZJWCAgICA9IG1vdGlmCi1TV1RfRExMICAgICAgPSBsaWIkKFNXVF9QUkVGSVgpLSQoV1NfUFJFRklYKS5zbwotU1dUX09CSiAgICAgID0gc3d0Lm8gZ2wubyBnbHUubyBzdHJ1Y3RzLm8gZ2x4Lm8KLVNXVF9MSUIgICAgICA9IC1HIC1ML3Vzci9saWIgLWxtIC1sR0wgLWxHTFUKLQotIwotIyBUaGUgZm9sbG93aW5nIENGTEFHUyBhcmUgZm9yIGNvbXBpbGluZyB0aGUgU1dUIE9wZW5HTCBsaWJyYXJ5LgotIwotIyBOb3RlOgotIyAgIFRoZSBmbGFnIC14YXJjaD1nZW5lcmljIGVuc3VyZSB0aGUgY29tcGlsZWQgbW9kdWxlcyB3aWxsIGJlIHRhcmdldGVkCi0jICAgZm9yIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgotIwotQ0ZMQUdTID0gLU8gLXMgXAotCS14YXJjaD1nZW5lcmljIFwKLQktS1BJQyBcCi0JLUkuLyBcCi0JLUkkKEpBVkFfSE9NRSkvaW5jbHVkZQotCi1hbGw6IG1ha2Vfc3d0Ci0KLW1ha2Vfc3d0OiAkKFNXVF9ETEwpCi0KLSQoU1dUX0RMTCk6ICQoU1dUX09CSikKLQlsZCAtbyAkQCAkKFNXVF9PQkopICQoU1dUX0xJQikKLQotY2xlYW46Ci0Jcm0gLWYgKi5zbyAqLm8KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQyMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+Ci0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi10eXBlZGVmIHN0cnVjdCBYVmlzdWFsSW5mb19GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHZpc3VhbCwgdmlzdWFsaWQsIHNjcmVlbiwgZGVwdGgsIGNjbGFzcywgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzaywgY29sb3JtYXBfc2l6ZSwgYml0c19wZXJfcmdiOwotfSBYVmlzdWFsSW5mb19GSURfQ0FDSEU7Ci10eXBlZGVmIFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSAqUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRTsKLQotWFZpc3VhbEluZm9fRklEX0NBQ0hFIFhWaXN1YWxJbmZvRmM7Ci0KLXZvaWQgY2FjaGVYVmlzdWFsSW5mb0ZpZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSkKLXsKLQlpZiAobHBDYWNoZS0+Y2FjaGVkKSByZXR1cm47Ci0JbHBDYWNoZS0+Y2xhenogPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgbHBPYmplY3QpOwotCWxwQ2FjaGUtPnZpc3VhbCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsIiwgIkkiKTsKLQlscENhY2hlLT52aXN1YWxpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAidmlzdWFsaWQiLCAiSSIpOwotCWxwQ2FjaGUtPnNjcmVlbiA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAic2NyZWVuIiwgIkkiKTsKLQlscENhY2hlLT5kZXB0aCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZGVwdGgiLCAiSSIpOwotCWxwQ2FjaGUtPmNjbGFzcyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY2NsYXNzIiwgIkkiKTsKLQlscENhY2hlLT5yZWRfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAicmVkX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmdyZWVuX21hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdyZWVuX21hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmJsdWVfbWFzayA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiYmx1ZV9tYXNrIiwgIkkiKTsKLQlscENhY2hlLT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjb2xvcm1hcF9zaXplIiwgIkkiKTsKLQlscENhY2hlLT5iaXRzX3Blcl9yZ2IgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImJpdHNfcGVyX3JnYiIsICJJIik7Ci0JbHBDYWNoZS0+Y2FjaGVkID0gMTsKLX0KLQotWFZpc3VhbEluZm8gKmdldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpCi17Ci0JUFhWaXN1YWxJbmZvX0ZJRF9DQUNIRSBscENhY2hlID0gJlhWaXN1YWxJbmZvRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlWFZpc3VhbEluZm9GaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCWxwU3RydWN0LT52aXN1YWwgPSAoVmlzdWFsICopKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWwpOwotCWxwU3RydWN0LT52aXN1YWxpZCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+dmlzdWFsaWQpOwotCWxwU3RydWN0LT5zY3JlZW4gPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbik7Ci0JbHBTdHJ1Y3QtPmRlcHRoID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCk7Ci0JbHBTdHJ1Y3QtPmNsYXNzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jY2xhc3MpOwotCWxwU3RydWN0LT5yZWRfbWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+cmVkX21hc2spOwotCWxwU3RydWN0LT5ncmVlbl9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ncmVlbl9tYXNrKTsKLQlscFN0cnVjdC0+Ymx1ZV9tYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5ibHVlX21hc2spOwotCWxwU3RydWN0LT5jb2xvcm1hcF9zaXplID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jb2xvcm1hcF9zaXplKTsKLQlscFN0cnVjdC0+Yml0c19wZXJfcmdiID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5iaXRzX3Blcl9yZ2IpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRYVmlzdWFsSW5mb0ZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgWFZpc3VhbEluZm8gKmxwU3RydWN0KQotewotCVBYVmlzdWFsSW5mb19GSURfQ0FDSEUgbHBDYWNoZSA9ICZYVmlzdWFsSW5mb0ZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVhWaXN1YWxJbmZvRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnZpc3VhbCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbCk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT52aXN1YWxpZCwgKGppbnQpbHBTdHJ1Y3QtPnZpc3VhbGlkKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnNjcmVlbiwgKGppbnQpbHBTdHJ1Y3QtPnNjcmVlbik7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kZXB0aCwgKGppbnQpbHBTdHJ1Y3QtPmRlcHRoKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNjbGFzcywgKGppbnQpbHBTdHJ1Y3QtPmNsYXNzKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPnJlZF9tYXNrLCAoamludClscFN0cnVjdC0+cmVkX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z3JlZW5fbWFzaywgKGppbnQpbHBTdHJ1Y3QtPmdyZWVuX21hc2spOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Ymx1ZV9tYXNrLCAoamludClscFN0cnVjdC0+Ymx1ZV9tYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNvbG9ybWFwX3NpemUsIChqaW50KWxwU3RydWN0LT5jb2xvcm1hcF9zaXplKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJpdHNfcGVyX3JnYiwgKGppbnQpbHBTdHJ1Y3QtPmJpdHNfcGVyX3JnYik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmggYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvbGlicmFyeS9zdHJ1Y3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOThmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL2xpYnJhcnkvc3RydWN0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxYMTEvWC5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotCi1YVmlzdWFsSW5mbyAqZ2V0WFZpc3VhbEluZm9GaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFhWaXN1YWxJbmZvICpscFN0cnVjdCk7Ci12b2lkIHNldFhWaXN1YWxJbmZvRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBYVmlzdWFsSW5mbyAqbHBTdHJ1Y3QpOwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRmNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL0dMQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLm1vdGlmLio7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gYXJlIHVzZWQgdG8gZHJhdyBvbiBzd3QgPGNvZGU+RHJhd2FibGU8L2NvZGU+cyAKLSAqIHRocm91Z2ggaW52b2NhdGlvbnMgb2YgcHJvdmlkZWQgT3BlbkdMIGZ1bmN0aW9ucy4KLSAqIDxwPgotICogQXBwbGljYXRpb24gY29kZSBtdXN0IGV4cGxpY2l0bHkgaW52b2tlIHRoZSA8Y29kZT5HTENvbnRleHQuZGlzcG9zZSAoKTwvY29kZT4gCi0gKiBtZXRob2QgdG8gcmVsZWFzZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXNvdXJjZXMgbWFuYWdlZCBieSBlYWNoIGluc3RhbmNlCi0gKiB3aGVuIHRob3NlIGluc3RhbmNlcyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGlzIGlzIDxlbT5wYXJ0aWN1bGFybHk8L2VtPgotICogaW1wb3J0YW50IG9uIFdpbmRvd3M5NSBhbmQgV2luZG93czk4IHdoZXJlIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGhhcyBhIGxpbWl0ZWQKLSAqIG51bWJlciBvZiBkZXZpY2UgY29udGV4dHMgYXZhaWxhYmxlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgR0xDb250ZXh0IHsKLQlpbnQgaGFuZGxlOwotCWludCBnYzsKLQlHQ0RhdGEgZGF0YTsKLQlEcmF3YWJsZSBkcmF3YWJsZTsKLQlpbnQgc2VsZWN0QnVmZmVyUHRyID0gMDsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTVNCX0ZJUlNUID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2hpY2ggaGFzIGJlZW4KLQkgKiBjb25maWd1cmVkIHRvIGRyYXcgb24gdGhlIHNwZWNpZmllZCBkcmF3YWJsZS4KLQkgKiA8cD4KLQkgKiBZb3UgbXVzdCBkaXNwb3NlIHRoZSA8Y29kZT5HTENvbnRleHQ8L2NvZGU+IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiAKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGRyYXdhYmxlIHRoZSBkcmF3YWJsZSB0byBkcmF3IG9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotCSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGRyYXdhYmxlIGlzIG51bGw8L2xpPgotCSAqIDwvdWw+Ci0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX05PX0hBTkRMRVMgaWYgYSBoYW5kbGUgY291bGQgbm90IGJlIG9idGFpbmVkIGZvciBnYyBjcmVhdGlvbjwvbGk+Ci0JICogICAgPGxpPkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIIC0gaWYgdGhlIGN1cnJlbnQgZGlzcGxheSBkZXB0aCBpcyBub3Qgc3VwcG9ydGVkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBHTENvbnRleHQgKERyYXdhYmxlIGRyYXdhYmxlKSB7Ci0JCWlmIChkcmF3YWJsZSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQkJdGhpcy5kcmF3YWJsZSA9IGRyYXdhYmxlOwotCQl0aGlzLmRhdGEgPSBuZXcgR0NEYXRhICgpOwotCQlnYyA9IGRyYXdhYmxlLmludGVybmFsX25ld19HQyAoZGF0YSk7Ci0JCWlmIChnYyA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQkJaW50IHhEaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwotCQlpbnQgc2NyZWVuID0gT1MuWERlZmF1bHRTY3JlZW4gKHhEaXNwbGF5KTsKLQkJaW50IGRlcHRoID0gT1MuWERlZmF1bHREZXB0aE9mU2NyZWVuIChPUy5YRGVmYXVsdFNjcmVlbk9mRGlzcGxheSAoeERpc3BsYXkpKTsKLQkJaW50IGF0dHJpYiBbXSA9IHsKLQkJCVhHTC5HTFhfTEVWRUwsCi0JCQkwLAotCQkJWEdMLkdMWF9SR0JBLAotCQkJWEdMLkdMWF9ET1VCTEVCVUZGRVIsCi0vLwkJCVhHTC5HTFhfREVQVEhfU0laRSwKLS8vCQkJZGVwdGgsCi0JCQkwCi0JCX07Ci0JCWludCBpbmZvUHRyID0gWEdMLmdsWENob29zZVZpc3VhbCAoeERpc3BsYXksIHNjcmVlbiwgYXR0cmliKTsKLQkJaWYgKGluZm9QdHIgPT0gMCkgU1dULmVycm9yIChTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotCQlYVmlzdWFsSW5mbyBpbmZvID0gbmV3IFhWaXN1YWxJbmZvICgpOwotCQlYR0wubWVtbW92ZSAoaW5mbywgaW5mb1B0ciwgWFZpc3VhbEluZm8uc2l6ZW9mKTsKLQkJT1MuWEZyZWUgKGluZm9QdHIpOwotCQloYW5kbGUgPSBYR0wuZ2xYQ3JlYXRlQ29udGV4dCAoeERpc3BsYXksIGluZm8sIDAsIGZhbHNlKTsKLQkJaWYgKGhhbmRsZSA9PSAwKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGF0YSBjb252ZXJ0SW1hZ2VEYXRhIChJbWFnZURhdGEgc291cmNlKSB7Ci0JCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpOwotCQlJbWFnZURhdGEgbmV3U291cmNlID0gbmV3IEltYWdlRGF0YSAoc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAyNCwgcGFsZXR0ZSk7Ci0JCUltYWdlRGF0YVV0aWwuYmxpdCAoCi0JCQkxLAotCQkJc291cmNlLmRhdGEsCi0JCQlzb3VyY2UuZGVwdGgsCi0JCQlzb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKHNvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCXNvdXJjZS53aWR0aCwKLQkJCXNvdXJjZS5oZWlnaHQsCi0JCQlzb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJc291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJc291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQkyNTUsCi0JCQludWxsLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLmRhdGEsCi0JCQluZXdTb3VyY2UuZGVwdGgsCi0JCQluZXdTb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKG5ld1NvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCW5ld1NvdXJjZS53aWR0aCwKLQkJCW5ld1NvdXJjZS5oZWlnaHQsCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQlmYWxzZSwKLQkJCXRydWUpOwotCi0JCXJldHVybiBuZXdTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAotCSAqIHRoZSByZWNlaXZlci4gQXBwbGljYXRpb25zIG11c3QgZGlzcG9zZSBvZiBhbGwgPGNvZGU+R0xDb250ZXh0PC9jb2RlPnMKLQkgKiB0aGF0IHRoZXkgYWxsb2NhdGUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSAoKSB7Ci0JCWlmIChoYW5kbGUgPT0gMCkgcmV0dXJuOwotCQlpbnQgeERpc3BsYXkgPSBkYXRhLmRpc3BsYXk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSB7Ci0JCQlYR0wuZ2xYTWFrZUN1cnJlbnQgKHhEaXNwbGF5LCAwLCAwKTsKLQkJfQotCQlpZiAoc2VsZWN0QnVmZmVyUHRyICE9IDApIE9TLlh0RnJlZSAoc2VsZWN0QnVmZmVyUHRyKTsKLQkJWEdMLmdsWERlc3Ryb3lDb250ZXh0ICh4RGlzcGxheSwgaGFuZGxlKTsKLQkJaGFuZGxlID0gMDsKLQkJLy8gZHJhd2FibGUgbWF5IGJlIGRpc3Bvc2VkCi0JCXRyeSB7Ci0JCQlkcmF3YWJsZS5pbnRlcm5hbF9kaXNwb3NlX0dDIChnYywgZGF0YSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJZ2MgPSAwOwotCQlkYXRhLmRpc3BsYXkgPSBkYXRhLmRyYXdhYmxlID0gZGF0YS5jb2xvcm1hcCA9IDA7Ci0JCS8qZGF0YS5mb250TGlzdCA9Ki8gZGF0YS5jbGlwUmduID0gZGF0YS5yZW5kZXJUYWJsZSA9IDA7Ci0JCWRyYXdhYmxlID0gbnVsbDsKLQkJZGF0YS5kZXZpY2UgPSBudWxsOwotCQlkYXRhLmltYWdlID0gbnVsbDsKLQkJLy9kYXRhLmNvZGVQYWdlID0gbnVsbDsKLQkJZGF0YSA9IG51bGw7Ci0JfQotCi0JcHVibGljIGludFtdIGdldFNlbGVjdEJ1ZmZlciAoaW50IHNlbGVjdEJ1ZmZlclB0ciwgaW50W10gc2VsZWN0QnVmZmVyKSB7Ci0JCU9TLm1lbW1vdmUgKHNlbGVjdEJ1ZmZlciwgc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCXJldHVybiBzZWxlY3RCdWZmZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3RCdWZmZXJQdHIgKGludFtdIHNlbGVjdEJ1ZmZlcikgewotCQlpZiAoc2VsZWN0QnVmZmVyUHRyID09IDApIHsKLQkJCXNlbGVjdEJ1ZmZlclB0ciA9IE9TLlh0TWFsbG9jIChzZWxlY3RCdWZmZXIubGVuZ3RoICogNCk7Ci0JCX0KLQkJT1MubWVtbW92ZSAoc2VsZWN0QnVmZmVyUHRyLCBzZWxlY3RCdWZmZXIsIHNlbGVjdEJ1ZmZlci5sZW5ndGggKiA0KTsKLQkJcmV0dXJuIHNlbGVjdEJ1ZmZlclB0cjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyIGlzIHRoZSBjdXJyZW50Ci0JICogPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyB0aGUgY3VycmVudCA8Y29kZT5HTENvbnRleHQ8L2NvZGU+LAotCSAqIGZhbHNlIG90aGVyd2lzZQotCSAqIEBleGNlcHRpb24gU1dURXJyb3IgPHVsPgotCSAqICAgIDxsaT5FUlJPUl9HUkFQSElDX0RJU1BPU0VEIGlmIHRoZSByZWNlaXZlciBpcyBkaXNwb3NlZDwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgCVNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlyZXR1cm4gWEdMLmdsWEdldEN1cnJlbnRDb250ZXh0ICgpID09IGhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIDxjb2RlPkdMQ29udGV4dDwvY29kZT4gaGFzIGJlZW4KLQkgKiBkaXNwb3NlZC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBnZXRzIHRoZSBkaXNwb3NlIHN0YXRlIGZvciB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKiBXaGVuIGEgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBoYXMgYmVlbiBkaXNwb3NlZCwgaXQgaXMgYW4gZXJyb3IgdG8KLQkgKiBpbnZva2UgYW55IG90aGVyIG1ldGhvZCB1c2luZyB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+R0xDb250ZXh0PC9jb2RlPiBpcyBkaXNwb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCAoKSB7Ci0JCXJldHVybiBoYW5kbGUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGJpdG1hcCBmb250LgotCSAqIAotCSAqIEBwYXJhbSBmZGF0YQotCSAqIEBwYXJhbSBkZXZpY2UKLQkgKiBAcGFyYW0gYmFzZQotCSAqIEBwYXJhbSBmaXJzdAotCSAqIEBwYXJhbSBjb3VudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRCaXRtYXBGb250IChGb250RGF0YSBmZGF0YSwgRGV2aWNlIGRldmljZSwgaW50IGJhc2UsIGludCBzdGFydEluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCS8qIFRlbXBvcmFyeSBjb2RlLCBkdWUgc29tZSBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gVVRGLTggbG9hZEJpdG1hcEZvbnQgKCkKLQkJICogaXMgcmVzdHJpY3QgdG8gd29ya3Mgb25seSBmb3IgYXNjaWkuIAotCQkgKiBOb3RlOiBlbl9VUy5JU084ODU5LTEgYWxzbyBjb2RlIGJlIHVzZWQuCi0JCSAqLwotCQlmZGF0YS5zZXRMb2NhbGUgKCJDIik7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250IChkZXZpY2UsIGZkYXRhKTsKLQkJaW50IGZvbnRMaXN0ID0gZm9udC5oYW5kbGU7Ci0JCWludFtdIGJ1ZmZlciA9IG5ldyBpbnQgWzFdOwotCQlpZiAoIU9TLlhtRm9udExpc3RJbml0Rm9udENvbnRleHQgKGJ1ZmZlciwgZm9udExpc3QpKSByZXR1cm47Ci0JCWludCBjb250ZXh0ID0gYnVmZmVyIFswXTsKLQkJWEZvbnRTdHJ1Y3QgZm9udFN0cnVjdCA9IG5ldyBYRm9udFN0cnVjdCAoKTsKLQkJaW50IGZvbnRMaXN0RW50cnk7Ci0JCWludFtdIGZvbnRTdHJ1Y3RQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50W10gZm9udE5hbWVQdHIgPSBuZXcgaW50IFsxXTsKLQkJaW50IHhmb250ID0gMDsKLQkJLy8gZ28gdGhyb3VnaCBlYWNoIGVudHJ5IGluIHRoZSBmb250IGxpc3QKLQkJd2hpbGUgKChmb250TGlzdEVudHJ5ID0gT1MuWG1Gb250TGlzdE5leHRFbnRyeSAoY29udGV4dCkpICE9IDApIHsKLQkJCWludCBmb250UHRyID0gT1MuWG1Gb250TGlzdEVudHJ5R2V0Rm9udCAoZm9udExpc3RFbnRyeSwgYnVmZmVyKTsKLQkJCWlmIChidWZmZXIgWzBdID09IE9TLlhtRk9OVF9JU19GT05UKSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBzaW5nbGUgZm9udAotCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRQdHIsIDIwICogNCk7Ci0JCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRm9udExpc3QgY29udGFpbnMgYSBmb250U2V0Ci0JCQkJaW50IG5Gb250cyA9IE9TLlhGb250c09mRm9udFNldCAoZm9udFB0ciwgZm9udFN0cnVjdFB0ciwgZm9udE5hbWVQdHIpOwotCQkJCWludFtdIGZvbnRTdHJ1Y3RzID0gbmV3IGludCBbbkZvbnRzXTsKLQkJCQlPUy5tZW1tb3ZlIChmb250U3RydWN0cywgZm9udFN0cnVjdFB0ciBbMF0sIG5Gb250cyAqIDQpOwotCQkJCS8vIEdvIHRocm91Z2ggZWFjaCBmb250U3RydWN0IGluIHRoZSBmb250IHNldC4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5Gb250czsgaSsrKSB7Ci0JCQkJCU9TLm1lbW1vdmUgKGZvbnRTdHJ1Y3QsIGZvbnRTdHJ1Y3RzIFtpXSwgWEZvbnRTdHJ1Y3Quc2l6ZW9mKTsKLQkJCQkJeGZvbnQgPSBmb250U3RydWN0LmZpZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHhmb250ICE9IDApIHsKLQkJCVhHTC5nbFhVc2VYRm9udCAoeGZvbnQsIHN0YXJ0SW5kZXgsIGxlbmd0aCwgYmFzZSk7Ci0JCX0KLQkJZm9udC5kaXNwb3NlICgpOwotCQlPUy5YbUZvbnRMaXN0RnJlZUZvbnRDb250ZXh0IChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIG91dGxpbmUgZm9udC4KLQkgKiAKLQkgKiBAcGFyYW0gZmRhdGEKLQkgKiBAcGFyYW0gZGV2aWNlCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gZmlyc3QKLQkgKiBAcGFyYW0gY291bnQKLQkgKiBAcGFyYW0gZGV2aWF0aW9uCi0JICogQHBhcmFtIGV4dHJ1c2lvbgotCSAqIEBwYXJhbSBmb3JtYXQKLQkgKiBAcGFyYW0gbHBnbWYKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkT3V0bGluZUZvbnQgKEZvbnREYXRhIGZkYXRhLCBEZXZpY2UgZGV2aWNlLCBpbnQgYmFzZSwgaW50IGZpcnN0LAotCWludCBjb3VudCwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIEdMWVBITUVUUklDU0ZMT0FUW10gbHBnbWYpIHsKLQkJLy8gc3R1YgotCX0KLQotCS8qKgotCSAqIFJlc2l6ZXMgdGhlIHJlY2VpdmVyLgotCSAqIAotCSAqIEBwYXJhbSB4Ci0JICogQHBhcmFtIHkKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzaXplIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoaGVpZ2h0ID09IDApIGhlaWdodCA9IDE7Ci0JCUdMLmdsVmlld3BvcnQgKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX1BST0pFQ1RJT04pOwotCQlHTC5nbExvYWRJZGVudGl0eSAoKTsKLQkJR0xVLmdsdVBlcnNwZWN0aXZlICg0NS4wZiwgKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0LCAwLjFmLCAxMDAuMGYpOwotCQlHTC5nbE1hdHJpeE1vZGUgKEdMLkdMX01PREVMVklFVyk7Ci0JCUdMLmdsTG9hZElkZW50aXR5ICgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlY2VpdmVyIHRvIGJlIHRoZSBjdXJyZW50IDxjb2RlPkdMQ29udGV4dDwvY29kZT4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQgKCkgewotCQlpZiAoaXNEaXNwb3NlZCAoKSkgU1dULmVycm9yIChTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCk7Ci0JCWlmIChYR0wuZ2xYR2V0Q3VycmVudENvbnRleHQgKCkgPT0gaGFuZGxlKSByZXR1cm47Ci0JCVhHTC5nbFhNYWtlQ3VycmVudCAoZGF0YS5kaXNwbGF5LCBkYXRhLmRyYXdhYmxlLCBoYW5kbGUpOwotCX0KLQotCS8qKgotCSAqIFN3YXBzIHRoZSByZWNlaXZlcidzIGJ1ZmZlcnMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBTV1RFcnJvciA8dWw+Ci0JICogICAgPGxpPkVSUk9SX0dSQVBISUNfRElTUE9TRUQgaWYgdGhlIHJlY2VpdmVyIGlzIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQkJaWYgKGlzRGlzcG9zZWQgKCkpIFNXVC5lcnJvciAoU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQpOwotCQlYR0wuZ2xYU3dhcEJ1ZmZlcnMgKGRhdGEuZGlzcGxheSwgZGF0YS5kcmF3YWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL21vdGlmL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvbW90aWYvWEdMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhM2U1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YR0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuTGlicmFyeTsKLQotcHVibGljIGNsYXNzIFhHTCB7Ci0JCi1zdGF0aWMgewotCUxpYnJhcnkubG9hZExpYnJhcnkoImdsIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9WRVJTSU9OXzFfMSA9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTl8xXzIgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFUlNJT05fMV8zID0gMTsKLQotLyoKLSoqIFZpc3VhbCBDb25maWcgQXR0cmlidXRlcyAoZ2xYR2V0Q29uZmlnLCBnbFhHZXRGQkNvbmZpZ0F0dHJpYikKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVVNFX0dMCQk9IDE7CS8qIHN1cHBvcnQgR0xYIHJlbmRlcmluZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JVRkZFUl9TSVpFCQk9IDI7CS8qIGRlcHRoIG9mIHRoZSBjb2xvciBidWZmZXIgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MRVZFTAkJPSAzOwkvKiBsZXZlbCBpbiBwbGFuZSBzdGFja2luZyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JHQkEJCT0gNDsJLyogdHJ1ZSBpZiBSR0JBIG1vZGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ET1VCTEVCVUZGRVIJPSA1OwkvKiBkb3VibGUgYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURVJFTwkJPSA2OwkvKiBzdGVyZW8gYnVmZmVyaW5nIHN1cHBvcnRlZCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FVWF9CVUZGRVJTCQk9IDc7CS8qIG51bWJlciBvZiBhdXggYnVmZmVycyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFRF9TSVpFCQk9IDg7CS8qIG51bWJlciBvZiByZWQgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkVFTl9TSVpFCQk9IDk7CS8qIG51bWJlciBvZiBncmVlbiBjb21wb25lbnQgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JMVUVfU0laRQkJPSAxMDsJLyogbnVtYmVyIG9mIGJsdWUgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BTFBIQV9TSVpFCQk9IDExOwkvKiBudW1iZXIgb2YgYWxwaGEgY29tcG9uZW50IGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9TSVpFCQk9IDEyOwkvKiBudW1iZXIgb2YgZGVwdGggYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NURU5DSUxfU0laRQk9IDEzOwkvKiBudW1iZXIgb2Ygc3RlbmNpbCBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fUkVEX1NJWkUJPSAxNDsJLyogbnVtYmVyIG9mIHJlZCBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fR1JFRU5fU0laRQk9IDE1OwkvKiBudW1iZXIgb2YgZ3JlZW4gYWNjdW0gYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FDQ1VNX0JMVUVfU0laRQk9IDE2OwkvKiBudW1iZXIgb2YgYmx1ZSBhY2N1bSBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQUxQSEFfU0laRQk9IDE3OwkvKiBudW1iZXIgb2YgYWxwaGEgYWNjdW0gYml0cyAqLwotLyoKLSoqIEZCQ29uZmlnLXNwZWNpZmljIGF0dHJpYnV0ZXMKLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9WSVNVQUxfVFlQRQkJPSAweDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0NPTkZJR19DQVZFQVQJCT0gMHgyMDsJLyogTGlrZSB2aXN1YWxfaW5mbyBWSVNVQUxfQ0FWRUFUX0VYVCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1RZUEUJCT0gMHgyMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRQk9IDB4MjQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCT0gMHgyNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRQk9IDB4MjY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQk9IDB4Mjc7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJBTlNQQVJFTlRfQUxQSEFfVkFMVUUJPSAweDI4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RSQVdBQkxFX1RZUEUJCT0gMHg4MDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1JFTkRFUl9UWVBFCQkJPSAweDgwMTE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfWF9SRU5ERVJBQkxFCQk9IDB4ODAxMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJCT0gMHg4MDEzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1dJRFRICQk9IDB4ODAxNjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQJCT0gMHg4MDE3OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX01BWF9QQlVGRkVSX1BJWEVMUwkJPSAweDgwMTg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0lECQkJPSAweDgwMEI7Ci0KLS8qCi0qKiBFcnJvciByZXR1cm4gdmFsdWVzIGZyb20gZ2xYR2V0Q29uZmlnLiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkKLSoqIGEgdmFsdWUgb2YgMC4KLSovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFEX1NDUkVFTgkJPSAxOwkvKiBzY3JlZW4gIyBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfQVRUUklCVVRFCT0gMjsJLyogYXR0cmlidXRlIHRvIGdldCBpcyBiYWQgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9OT19FWFRFTlNJT04JPSAzOwkvKiBubyBnbHggZXh0ZW5zaW9uIG9uIHNlcnZlciAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WSVNVQUwJCT0gNDsJLyogdmlzdWFsICMgbm90IGtub3duIGJ5IEdMWCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9DT05URVhUCQk9IDU7CS8qIHJldHVybmVkIG9ubHkgYnkgaW1wb3J0X2NvbnRleHQgRVhUPyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0JBRF9WQUxVRQkJPSA2OwkvKiByZXR1cm5lZCBvbmx5IGJ5IGdsWFN3YXBJbnRlcnZhbFNHST8gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQURfRU5VTQkJPSA3OwkvKiB1bnVzZWQ/ICovCi0KLS8qIEZCQ29uZmlnIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLQotLyoKLSoqIEdlbmVyaWMgImRvbid0IGNhcmUiIHZhbHVlIGZvciBnbFggQ2hvb3NlRkJDb25maWcgYXR0cmlidXRlcyAoZXhjZXB0Ci0qKiBHTFhfTEVWRUwpCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0RPTlRfQ0FSRQkJCT0gMHhGRkZGRkZGRjsKLQotLyogR0xYX1JFTkRFUl9UWVBFIGJpdHMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX0JJVAkJCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9CSVQJCT0gMHgwMDAwMDAwMjsKLQotLyogR0xYX0RSQVdBQkxFX1RZUEUgYml0cyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPV19CSVQJCQk9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUElYTUFQX0JJVAkJCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QQlVGRkVSX0JJVAkJCT0gMHgwMDAwMDAwNDsKLQotLyogR0xYX0NPTkZJR19DQVZFQVQgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQk9IDB4ODAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX0NPTkZJRwkJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRwk9IDB4ODAwRDsKLQotLyogR0xYX1hfVklTVUFMX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSVUVfQ09MT1IJCQk9IDB4ODAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ESVJFQ1RfQ09MT1IJCT0gMHg4MDAzOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BTRVVET19DT0xPUgkJPSAweDgwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0NPTE9SCQk9IDB4ODAwNTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9HUkFZX1NDQUxFCQkJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVkJCQk9IDB4ODAwNzsKLQotLyogR0xYX1RSQU5TUEFSRU5UX1RZUEUgYXR0cmlidXRlIHZhbHVlcyAqLwotLyogcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTkUJCQkgICAweDgwMDAgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9SR0IJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYCQk9IDB4ODAwOTsKLQotLyogZ2xYQ3JlYXRlR0xYUGJ1ZmZlciBhdHRyaWJ1dGVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUFJFU0VSVkVEX0NPTlRFTlRTCQk9IDB4ODAxQjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9MQVJHRVNUX1BCVUZGRVIJCT0gMHg4MDFDOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVJfSEVJR0hUCQk9IDB4ODA0MDsJLyogTmV3IGZvciBHTFggMS4zICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9XSURUSAkJPSAweDgwNDE7CS8qIE5ldyBmb3IgR0xYIDEuMyAqLwotCi0vKiBnbFhRdWVyeUdMWFBCdWZmZXIgYXR0cmlidXRlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJRFRICQkJPSAweDgwMUQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfSEVJR0hUCQkJPSAweDgwMUU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVZFTlRfTUFTSwkJCT0gMHg4MDFGOwotCi0vKiBnbFhDcmVhdGVOZXdDb250ZXh0IHJlbmRlcl90eXBlIGF0dHJpYnV0ZSB2YWx1ZXMgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SR0JBX1RZUEUJCQk9IDB4ODAxNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9DT0xPUl9JTkRFWF9UWVBFCQk9IDB4ODAxNTsKLQotLyogZ2xYUXVlcnlDb250ZXh0IGF0dHJpYnV0ZXMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GQkNPTkZJR19JRAkJICAweDgwMTMgKi8KLS8qIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9SRU5ERVJfVFlQRQkJICAweDgwMTEgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU4JCQk9IDB4ODAwQzsKLQotLyogZ2xYU2VsZWN0RXZlbnQgZXZlbnQgbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfUEJVRkZFUl9DTE9CQkVSX01BU0sJPSAweDA4MDAwMDAwOwotCi0vKiBHTFhQYnVmZmVyQ2xvYmJlckV2ZW50IGV2ZW50X3R5cGUgdmFsdWVzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfREFNQUdFRAkJCT0gMHg4MDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NBVkVECQkJPSAweDgwMjE7Ci0KLS8qIEdMWFBidWZmZXJDbG9iYmVyRXZlbnQgZHJhd190eXBlIHZhbHVlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1dJTkRPVwkJCT0gMHg4MDIyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1BCVUZGRVIJCQk9IDB4ODAyMzsKLQotLyogR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBidWZmZXJfbWFzayBiaXRzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRlJPTlRfTEVGVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwMjsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9CQUNLX0xFRlRfQlVGRkVSX0JJVAk9IDB4MDAwMDAwMDQ7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQkFDS19SSUdIVF9CVUZGRVJfQklUCT0gMHgwMDAwMDAwODsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9BVVhfQlVGRkVSU19CSVQJCT0gMHgwMDAwMDAxMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9ERVBUSF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RFTkNJTF9CVUZGRVJfQklUCQk9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfQUNDVU1fQlVGRkVSX0JJVAkJPSAweDAwMDAwMDgwOwotCi0vKgotKiogRXh0ZW5zaW9uIHJldHVybiB2YWx1ZXMgZnJvbSBnbFhHZXRDb25maWcuICBUaGVzZSBhcmUgYWxzbwotKiogYWNjZXB0ZWQgYXMgcGFyYW1ldGVyIHZhbHVlcyBmb3IgZ2xYQ2hvb3NlVmlzdWFsLgotKi8KLQotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1hfVklTVUFMX1RZUEVfRVhUCT0gMHgyMjsJLyogdmlzdWFsX2luZm8gZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9UWVBFX0VYVCA9IDB4MjM7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFX0VYVCA9IDB4MjQ7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRV9FWFQJPSAweDI1OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRV9FWFQgPSAweDI2OwkvKiB2aXN1YWxfaW5mbyBleHRlbnNpb24gKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFX0VYVAk9IDB4Mjc7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFX0VYVCA9IDB4Mjg7CS8qIHZpc3VhbF9pbmZvIGV4dGVuc2lvbiAqLwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHZpc3VhbF90eXBlICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVFJVRV9DT0xPUl9FWFQJPSAweDgwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRElSRUNUX0NPTE9SX0VYVAk9IDB4ODAwMzsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9QU0VVRE9fQ09MT1JfRVhUCT0gMHg4MDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1NUQVRJQ19DT0xPUl9FWFQJPSAweDgwMDU7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfR1JBWV9TQ0FMRV9FWFQJPSAweDgwMDY7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfU1RBVElDX0dSQVlfRVhUCT0gMHg4MDA3OwotCi0vKiBQcm9wZXJ0eSB2YWx1ZXMgZm9yIHRyYW5zcGFyZW50IHBpeGVsICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfTk9ORV9FWFQJCT0gMHg4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX1JHQl9FWFQJCT0gMHg4MDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1RSQU5TUEFSRU5UX0lOREVYX0VYVAk9IDB4ODAwOTsKLQotLyogUHJvcGVydHkgdmFsdWVzIGZvciB2aXN1YWxfcmF0aW5nICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVklTVUFMX0NBVkVBVF9FWFQJCT0gMHgyMDsgIC8qIHZpc3VhbF9yYXRpbmcgZXh0ZW5zaW9uIHR5cGUgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TTE9XX1ZJU1VBTF9FWFQJCT0gMHg4MDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX05PTl9DT05GT1JNQU5UX1ZJU1VBTF9FWFQJPSAweDgwMEQ7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhHZXRDbGllbnRTdHJpbmcuCi0qLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZFTkRPUgkJPSAweDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfVkVSU0lPTgkJPSAweDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhURU5TSU9OUwkJPSAweDM7Ci0KLS8qCi0qKiBOYW1lcyBmb3IgYXR0cmlidXRlcyB0byBnbFhRdWVyeUNvbnRleHRJbmZvRVhULgotKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TSEFSRV9DT05URVhUX0VYVAk9IDB4ODAwQTsJLyogaWQgb2Ygc2hhcmUgY29udGV4dCAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX1ZJU1VBTF9JRF9FWFQJPSAweDgwMEI7CS8qIGlkIG9mIGNvbnRleHQncyB2aXN1YWwgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9TQ1JFRU5fRVhUCQk9IDB4ODAwQzsJLyogc2NyZWVuIG51bWJlciAqLwotCi0vKiBHTFggRXh0ZW5zaW9uIFN0cmluZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMWF9FWFRfaW1wb3J0X2NvbnRleHQJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0VYVF92aXN1YWxfaW5mbwk9IDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcJPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzID0gMTsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWENob29zZVZpc3VhbChpbnQgZHB5LCBpbnQgc2NyZWVuLCBpbnRbXSBhdHRyaWJMaXN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYQ29weUNvbnRleHQoaW50IGRweSwgaW50IHNyYywgaW50IGRzdCwgaW50IG1hc2spOwotLy9wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBpbnQgdmlzLCBpbnQgc2hhcmVMaXN0LCBib29sZWFuIGRpcmVjdCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYQ3JlYXRlQ29udGV4dChpbnQgZHB5LCBYVmlzdWFsSW5mbyB2aXMsIGludCBzaGFyZUxpc3QsIGJvb2xlYW4gZGlyZWN0KTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBnbFhDcmVhdGVHTFhQaXhtYXAoaW50IGRweSwgWFZpc3VhbEluZm8gdmlzLCBpbnQgcGl4bWFwKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgZ2xYRGVzdHJveUNvbnRleHQoaW50IGRweSwgaW50IGN0eCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWERlc3Ryb3lHTFhQaXhtYXAoaW50IGRweSwgaW50IHBpeCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q29uZmlnKGludCBkcHksIFhWaXN1YWxJbmZvIHZpcywgaW50IGF0dHJpYiwgaW50W10gdmFsdWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYR2V0Q3VycmVudERyYXdhYmxlKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWElzRGlyZWN0KGludCBkcHksIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhNYWtlQ3VycmVudChpbnQgZHB5LCBpbnQgZHJhd2FibGUsIGludCBjdHgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBnbFhRdWVyeUV4dGVuc2lvbihpbnQgZHB5LCBpbnRbXSBlcnJvckJhc2UsIGludFtdIGV2ZW50QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGdsWFF1ZXJ5VmVyc2lvbihpbnQgZHB5LCBpbnRbXSBtYWpvciwgaW50W10gbWlub3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhTd2FwQnVmZmVycyhpbnQgZHB5LCBpbnQgZHJhd2FibGUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhVc2VYRm9udChpbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSB2b2lkIGdsWFdhaXRHTCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgdm9pZCBnbFhXYWl0WCgpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWEdldENsaWVudFN0cmluZyhpbnQgZHB5LCBpbnQgbmFtZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcoaW50IGRweSwgaW50IHNjcmVlbiwgaW50IG5hbWUpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IGdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyhpbnQgZHB5LCBpbnQgc2NyZWVuKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIHZvaWQgbWVtbW92ZShYVmlzdWFsSW5mbyBkZXN0LCBpbnQgc3JjLCBpbnQgc2l6ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvbW90aWYvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9pbnRlcm5hbC9tb3RpZi9YVmlzdWFsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgwMzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9tb3RpZi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL21vdGlmL1hWaXN1YWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC5tb3RpZjsKLQotIAotcHVibGljIGNsYXNzIFhWaXN1YWxJbmZvIHsKLQlwdWJsaWMgaW50IHZpc3VhbDsKLQlwdWJsaWMgaW50IHZpc3VhbGlkOwotCXB1YmxpYyBpbnQgc2NyZWVuOwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0JcHVibGljIGludCBjY2xhc3M7Ci0JcHVibGljIGludCByZWRfbWFzaywgZ3JlZW5fbWFzaywgYmx1ZV9tYXNrOwotCXB1YmxpYyBpbnQgY29sb3JtYXBfc2l6ZTsKLQlwdWJsaWMgaW50IGJpdHNfcGVyX3JnYjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzMDNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgT3BlbkdMIEJpbmRpbmdzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWY4NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iJHdzJC9zd3QuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS5zd3Qub3BlbmdsIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0IiBleHBvcnQ9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2Q5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXJlbSAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotcmVtICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi1yZW0gIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotcmVtICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLXJlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLXJlbSAgCi1yZW0gIENvbnRyaWJ1dG9yczoKLXJlbSAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotQGVjaG8gb2ZmCi0KLUlGIE5PVCAiJUpBVkFfSE9NRSUiPT0iIiBHT1RPIE1BS0UKLQotcmVtICoqKioqCi1yZW0gSmF2YWgKLXJlbSAqKioqKgotc2V0IEpBVkFfSE9NRT1qOlx0ZWFtc3d0XHN3dC1idWlsZGRpclxpdmVcYmluCi1zZXQgcGF0aD0lSkFWQV9IT01FJTslcGF0aCUKLQotcmVtICoqKioqKioqCi1yZW0gTVNWQyA2LjAKLXJlbSAqKioqKioqKgotY2FsbCBrOlxkZXZccHJvZHVjdHNcbXN2YzYwXHZjOThcYmluXHZjdmFyczMyLmJhdAotCi1yZW0gKioqKioqIAotcmVtIE1TLVNESwotcmVtICoqKioqKgotc2V0IE1zc2RrPWo6XHRlYW1zd3Rcc3d0LWJ1aWxkZGlyXG1zc2RrCi1jYWxsICVtc3NkayVcc2V0ZW52LmJhdAotCi06TUFLRQotbm1ha2UgLWYgbWFrZV93aW4zMi5tYWsgJTEgJTIgJTMgJTQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L2dsdy5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzhlZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvZ2x3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luZ2RpLmg+Ci0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAic3d0LmgiCi0jaW5jbHVkZSAic3RydWN0cy5oIgotCi0jZGVmaW5lIFdHTF9OQVRJVkUoZnVuYykgSmF2YV9vcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX1dHTF8jI2Z1bmMKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKENob29zZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgam9iamVjdCBhcmcxKQotewotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBfYXJnMSwgKmxwYXJnMT1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJDaG9vc2VQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcxKSBscGFyZzEgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcxLCAmX2FyZzEpOwotCXJjID0gKGppbnQpQ2hvb3NlUGl4ZWxGb3JtYXQoKEhEQylhcmcwLCAoQ09OU1QgUElYRUxGT1JNQVRERVNDUklQVE9SICopbHBhcmcxKTsKLQlpZiAoYXJnMSkgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKGVudiwgYXJnMSwgbHBhcmcxKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRShEZXNjcmliZVBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGpvYmplY3QgYXJnMykKLXsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgX2FyZzMsICpscGFyZzM9TlVMTDsKLQlqaW50IHJjOwotCi0JREVCVUdfQ0FMTCgiRGVzY3JpYmVQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmczKSBscGFyZzMgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCAmX2FyZzMpOwotCXJjID0gKGppbnQpRGVzY3JpYmVQaXhlbEZvcm1hdCgoSERDKWFyZzAsIGFyZzEsIGFyZzIsIChMUFBJWEVMRk9STUFUREVTQ1JJUFRPUilscGFyZzMpOwotCWlmIChhcmczKSBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmczLCBscGFyZzMpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKEdldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJHZXRQaXhlbEZvcm1hdFxuIikKLQotCXJldHVybiAoamludClHZXRQaXhlbEZvcm1hdCgoSERDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFNldFBpeGVsRm9ybWF0KQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqb2JqZWN0IGFyZzIpCi17Ci0JUElYRUxGT1JNQVRERVNDUklQVE9SIF9hcmcyLCAqbHBhcmcyPU5VTEw7Ci0JamJvb2xlYW4gcmM7Ci0KLQlERUJVR19DQUxMKCJTZXRQaXhlbEZvcm1hdFxuIikKLQotCWlmIChhcmcyKSBscGFyZzIgPSBnZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoZW52LCBhcmcyLCAmX2FyZzIpOwotCXJjID0gKGpib29sZWFuKVNldFBpeGVsRm9ybWF0KChIREMpYXJnMCwgYXJnMSwgKENPTlNUIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqKWxwYXJnMik7Ci0JaWYgKGFyZzIpIHNldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzIsIGxwYXJnMik7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKFN3YXBCdWZmZXJzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCkKLXsKLQlERUJVR19DQUxMKCJTd2FwQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pU3dhcEJ1ZmZlcnMoKEhEQylhcmcwKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDb3B5Q29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCURFQlVHX0NBTEwoIndnbENvcHlDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xDb3B5Q29udGV4dCgoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEsIChVSU5UKWFyZzIpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsQ3JlYXRlQ29udGV4dCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzApCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlQ29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xDcmVhdGVDb250ZXh0KChIREMpYXJnMCk7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xDcmVhdGVMYXllckNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsQ3JlYXRlTGF5ZXJDb250ZXh0XG4iKQotCi0JcmV0dXJuIChqaW50KXdnbENyZWF0ZUxheWVyQ29udGV4dCgoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlbGV0ZUNvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwKQotewotCURFQlVHX0NBTEwoIndnbERlbGV0ZUNvbnRleHRcbiIpCi0KLQlyZXR1cm4gKGpib29sZWFuKXdnbERlbGV0ZUNvbnRleHQoKEhHTFJDKWFyZzApOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbERlc2NyaWJlTGF5ZXJQbGFuZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpvYmplY3QgYXJnNCkKLXsKLQlMQVlFUlBMQU5FREVTQ1JJUFRPUiBfYXJnNCwgKmxwYXJnND1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsRGVzY3JpYmVMYXllclBsYW5lXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9IGdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKGVudiwgYXJnNCwgJl9hcmc0KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xEZXNjcmliZUxheWVyUGxhbmUoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCAoTFBMQVlFUlBMQU5FREVTQ1JJUFRPUilscGFyZzQpOwotCWlmIChhcmc0KSBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhlbnYsIGFyZzQsIGxwYXJnNCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudENvbnRleHQpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCkKLXsKLQlERUJVR19DQUxMKCJ3Z2xHZXRDdXJyZW50Q29udGV4dFxuIikKLQotCXJldHVybiAoamludCl3Z2xHZXRDdXJyZW50Q29udGV4dCgpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0Q3VycmVudERDKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQpCi17Ci0JREVCVUdfQ0FMTCgid2dsR2V0Q3VycmVudERDXG4iKQotCi0JcmV0dXJuIChqaW50KXdnbEdldEN1cnJlbnREQygpOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMIFdHTF9OQVRJVkUod2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcykKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnRBcnJheSBhcmc0KQotewotCWppbnQgKmxwYXJnND1OVUxMOwotCWppbnQgcmM7Ci0KLQlERUJVR19DQUxMKCJ3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzXG4iKQotCi0JaWYgKGFyZzQpIGxwYXJnNCA9ICgqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIE5VTEwpOwotCXJjID0gKGppbnQpd2dsR2V0TGF5ZXJQYWxldHRlRW50cmllcygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChDT0xPUlJFRiAqKWxwYXJnNCk7Ci0JaWYgKGFyZzQpICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBhcmc0LCBscGFyZzQsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbEdldFByb2NBZGRyZXNzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGpieXRlQXJyYXkgYXJnMCkKLXsKLQlqYnl0ZSAqbHBhcmcwPU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbEdldFByb2NBZGRyZXNzXG4iKQotCi0JaWYgKGFyZzApIGxwYXJnMCA9ICgqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBOVUxMKTsKLQlyYyA9IChqaW50KXdnbEdldFByb2NBZGRyZXNzKChMUENTVFIpbHBhcmcwKTsKLQlpZiAoYXJnMCkgKCplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoZW52LCBhcmcwLCBscGFyZzAsIDApOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xNYWtlQ3VycmVudCkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSkKLXsKLQlERUJVR19DQUxMKCJ3Z2xNYWtlQ3VycmVudFxuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsTWFrZUN1cnJlbnQoKEhEQylhcmcwLCAoSEdMUkMpYXJnMSk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsUmVhbGl6ZUxheWVyUGFsZXR0ZSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamJvb2xlYW4gYXJnMikKLXsKLQlERUJVR19DQUxMKCJ3Z2xSZWFsaXplTGF5ZXJQYWxldHRlXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKChIREMpYXJnMCwgYXJnMSwgKEJPT0wpYXJnMik7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgV0dMX05BVElWRSh3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKQotCShKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludEFycmF5IGFyZzQpCi17Ci0JamludCAqbHBhcmc0PU5VTEw7Ci0JamludCByYzsKLQotCURFQlVHX0NBTEwoIndnbFNldExheWVyUGFsZXR0ZUVudHJpZXNcbiIpCi0KLQlpZiAoYXJnNCkgbHBhcmc0ID0gKCplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGVudiwgYXJnNCwgTlVMTCk7Ci0JcmMgPSAoamludCl3Z2xTZXRMYXllclBhbGV0dGVFbnRyaWVzKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKENPTlNUIENPTE9SUkVGICopbHBhcmc0KTsKLQlpZiAoYXJnNCkgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGFyZzQsIGxwYXJnNCwgMCk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFNoYXJlTGlzdHMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU2hhcmVMaXN0c1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU2hhcmVMaXN0cygoSEdMUkMpYXJnMCwgKEhHTFJDKWFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFN3YXBMYXllckJ1ZmZlcnMpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEpCi17Ci0JREVCVUdfQ0FMTCgid2dsU3dhcExheWVyQnVmZmVyc1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsU3dhcExheWVyQnVmZmVycygoSERDKWFyZzAsIGFyZzEpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRCaXRtYXBzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JREVCVUdfQ0FMTCgid2dsVXNlRm9udEJpdG1hcHNBXG4iKQotCi0JcmV0dXJuIChqYm9vbGVhbil3Z2xVc2VGb250Qml0bWFwc0EoKEhEQylhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgV0dMX05BVElWRSh3Z2xVc2VGb250Qml0bWFwc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczKQotewotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRCaXRtYXBzV1xuIikKLQotCXJldHVybiAoamJvb2xlYW4pd2dsVXNlRm9udEJpdG1hcHNXKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIFdHTF9OQVRJVkUod2dsVXNlRm9udE91dGxpbmVzQSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGpmbG9hdCBhcmc0LCBqZmxvYXQgYXJnNSwgamludCBhcmc2LCBqb2JqZWN0IGFyZzcpCi17Ci0vLwlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnNywgKmxwYXJnNz1OVUxMOwotCWpib29sZWFuIHJjOwotCi0JREVCVUdfQ0FMTCgid2dsVXNlRm9udE91dGxpbmVzQVxuIikKLQotLy8JaWYgKGFyZzcpIGxwYXJnNyA9IGdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKGVudiwgYXJnNywgJl9hcmc3KTsKLQlyYyA9IChqYm9vbGVhbil3Z2xVc2VGb250T3V0bGluZXNBKChIREMpYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgKEZMT0FUKWFyZzQsIChGTE9BVClhcmc1LCBhcmc2LCAoTFBHTFlQSE1FVFJJQ1NGTE9BVClhcmc3KTsKLS8vCWlmIChhcmc3KSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsIGxwYXJnNyk7Ci0JcmV0dXJuIHJjOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBXR0xfTkFUSVZFKHdnbFVzZUZvbnRPdXRsaW5lc1cpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqZmxvYXQgYXJnNCwgamZsb2F0IGFyZzUsIGppbnQgYXJnNiwgam9iamVjdCBhcmc3KQotewotLy8JR0xZUEhNRVRSSUNTRkxPQVQgX2FyZzcsICpscGFyZzc9TlVMTDsKLQlqYm9vbGVhbiByYzsKLQotCURFQlVHX0NBTEwoIndnbFVzZUZvbnRPdXRsaW5lc1dcbiIpCi0KLS8vCWlmIChhcmc3KSBscGFyZzcgPSBnZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzcsICZfYXJnNyk7Ci0JcmMgPSAoamJvb2xlYW4pd2dsVXNlRm9udE91dGxpbmVzVygoSERDKWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIChGTE9BVClhcmc0LCAoRkxPQVQpYXJnNSwgYXJnNiwgKExQR0xZUEhNRVRSSUNTRkxPQVQpYXJnNyk7Ci0vLwlpZiAoYXJnNykgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmc3LCBscGFyZzcpOwotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBXR0xfTkFUSVZFKE1vdmVNZW1vcnlXX19Mb3JnX2VjbGlwc2Vfc3d0X29wZW5nbF9pbnRlcm5hbF93aW4zMl9HTFlQSE1FVFJJQ1NGTE9BVF8ySUkpCi0JKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgam9iamVjdCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMikKLXsKLQlHTFlQSE1FVFJJQ1NGTE9BVCBfYXJnMCwgKmxwYXJnMD1OVUxMOwotCi0JREVCVUdfQ0FMTCgiTW92ZU1lbW9yeVdfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSVxuIikKLQlERUJVR19DSEVDS19OVUxMKGVudiwgYXJnMSkKLQkKLQlpZiAoYXJnMCkgbHBhcmcwID0gJl9hcmcwOwotCU1vdmVNZW1vcnkoKFBWT0lEKWxwYXJnMCwgKENPTlNUIFZPSUQgKilhcmcxLCBhcmcyKTsKLQlpZiAoYXJnMCkgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoZW52LCBhcmcwLCBscGFyZzApOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIFdHTF9OQVRJVkUoTW92ZU1lbW9yeUFfX0xvcmdfZWNsaXBzZV9zd3Rfb3BlbmdsX2ludGVybmFsX3dpbjMyX0dMWVBITUVUUklDU0ZMT0FUXzJJSSkKLQkoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqb2JqZWN0IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyKQotewotCUdMWVBITUVUUklDU0ZMT0FUIF9hcmcwLCAqbHBhcmcwPU5VTEw7Ci0KLQlERUJVR19DQUxMKCJNb3ZlTWVtb3J5QV9fTG9yZ19lY2xpcHNlX3N3dF9vcGVuZ2xfaW50ZXJuYWxfd2luMzJfR0xZUEhNRVRSSUNTRkxPQVRfMklJXG4iKQotCURFQlVHX0NIRUNLX05VTEwoZW52LCBhcmcxKQotCQotCWlmIChhcmcwKSBscGFyZzAgPSAmX2FyZzA7Ci0JTW92ZU1lbW9yeSgoUFZPSUQpbHBhcmcwLCAoQ09OU1QgVk9JRCAqKWFyZzEsIGFyZzIpOwotCWlmIChhcmcwKSBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhlbnYsIGFyZzAsIGxwYXJnMCk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvbWFrZV93aW4zMi5tYWsgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9tYWtlX3dpbjMyLm1haworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSMgYXNzdW1lcyBKQVZBX0hPTUUgaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBmcm9tIHdoaWNoIG5tYWtlIGlzIHJ1bgotCi1BUFBWRVI9NS4wCi0haW5jbHVkZSA8d2luMzIubWFrPgotCi1wZ21fdmVyX3N0cj0iU1dUICQobWFqX3ZlcikuJChtaW5fdmVyKSBmb3IgV2luZG93cyIKLXRpbWVzdGFtcF9zdHI9X19EQVRFX19cIiBcIl9fVElNRV9fXCIgKEVTVClcIgotY29weXJpZ2h0ID0gIkNvcHlyaWdodCAoQykgMTk5OSwgMjAwMyBJQk0gQ29ycC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIgotCi1TV1RfUFJFRklYPWdsCi1XU19QUkVGSVg9d2luMzIKLVNXVF9MSUIgICAgID0gJChTV1RfUFJFRklYKS0kKFdTX1BSRUZJWCkuZGxsCi0KLUxJTktfTElCUyA9IG9wZW5nbDMyLmxpYiBnbHUzMi5saWIgZ2RpMzIubGliCi0KLSMgbm90ZTogdGhvcm91Z2hseSB0ZXN0IGFsbCBleGFtcGxlcyBhZnRlciBjaGFuZ2luZyBhbnkgb3B0aW1pemF0aW9uIGZsYWdzCi1TV1RfQ0RFQlVHID0gIy1aaSAtT2RpCi1TV1RfTERFQlVHID0gIy9ERUJVRyAvREVCVUdUWVBFOmJvdGgKLUNGTEFHUyA9IC1jIC1XMyAtRzYgLUdEIC1PMSAkKFNXVF9DREVCVUcpIC1ub2xvZ28gLURfWDg2Xz0xIC1EX1dJTjMyIC1EX1dJTjk1IC1EX1dJTjMyX1dJTkRPV1M9MHgwNDAwIC1EX01UIC1NVCAtRFdJTjMyIC1EX1dJTjMyX0RDT00gL0kkKEpBVkFfSE9NRSlcaW5jbHVkZSAvSS4KLVJDRkxBR1MgPSAtRFNXVF9DT01NQV9WRVJTSU9OPSQoY29tbWFfdmVyKQotTEZMQUdTID0gL0lOQ1JFTUVOVEFMOk5PIC9QREI6Tk9ORSAvUkVMRUFTRSAvTk9MT0dPICQoU1dUX0xERUJVRykgLWVudHJ5Ol9EbGxNYWluQ1JUU3RhcnR1cEAxMiAtZGxsIC9CQVNFOjB4MTAwMDAwMDAgL2NvbW1lbnQ6JChwZ21fdmVyX3N0cikgL2NvbW1lbnQ6JChjb3B5cmlnaHQpIC9ETEwKLQotU1dUX09CSlMgPSBzd3Qub2JqIGdsLm9iaiBnbHUub2JqIGdsdy5vYmogc3RydWN0cy5vYmoKLQotYWxsOiAkKFNXVF9MSUIpCi0KLS5jLm9iajoKLQljbCAkKENGTEFHUykgJCouYwotCi0kKFNXVF9MSUIpOiAkKFNXVF9PQkpTKSBzd3QucmVzCi0JZWNobyAkKExGTEFHUykgPnRlbXBscmYKLQllY2hvICQoTElOS19MSUJTKSA+PnRlbXBscmYKLQllY2hvIC1tYWNoaW5lOklYODYgPj50ZW1wbHJmCi0JZWNobyAtc3Vic3lzdGVtOndpbmRvd3MgPj50ZW1wbHJmCi0JZWNobyAtb3V0OiQoU1dUX0xJQikgPj50ZW1wbHJmCi0JZWNobyAkKFNXVF9PQkpTKSA+PnRlbXBscmYKLQllY2hvIHN3dC5yZXMgPj50ZW1wbHJmCi0JbGluayBAdGVtcGxyZgotCWRlbCB0ZW1wbHJmCi0JCi1zd3QucmVzOgotCXJjICQoUkNGTEFHUykgLURTV1RfT1JHX0ZJTEVOQU1FPVwiJChTV1RfTElCKVwiIC1yIC1mbyBzd3QucmVzIHN3dC5yYwotCQotY2xlYW46Ci0gICAgZGVsICoub2JqICoucmVzICouZGxsICoubGliICouZXhwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODQzNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3RydWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzd3QuaCIKLSNpbmNsdWRlICJzdHJ1Y3RzLmgiCi0KLXR5cGVkZWYgc3RydWN0IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSB7Ci0JaW50IGNhY2hlZDsKLQlqY2xhc3MgY2xheno7Ci0JamZpZWxkSUQgZ21mQ2VsbEluY1ksIGdtZkNlbGxJbmNYLCBnbWZwdEdseXBoT3JpZ2luX3ksIGdtZnB0R2x5cGhPcmlnaW5feCwgZ21mQmxhY2tCb3hZLCBnbWZCbGFja0JveFg7Ci19IEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRTsKLXR5cGVkZWYgR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFICpQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFOwotCi1HTFlQSE1FVFJJQ1NGTE9BVF9GSURfQ0FDSEUgR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQotdm9pZCBjYWNoZUdMWVBITUVUUklDU0ZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUEdMWVBITUVUUklDU0ZMT0FUX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Z21mQ2VsbEluY1kgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZkNlbGxJbmNZIiwgIkYiKTsKLQlscENhY2hlLT5nbWZDZWxsSW5jWCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQ2VsbEluY1giLCAiRiIpOwotCWxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mcHRHbHlwaE9yaWdpbl95IiwgIkYiKTsKLQlscENhY2hlLT5nbWZwdEdseXBoT3JpZ2luX3ggPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImdtZnB0R2x5cGhPcmlnaW5feCIsICJGIik7Ci0JbHBDYWNoZS0+Z21mQmxhY2tCb3hZID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJnbWZCbGFja0JveFkiLCAiRiIpOwotCWxwQ2FjaGUtPmdtZkJsYWNrQm94WCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZ21mQmxhY2tCb3hYIiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1HTFlQSE1FVFJJQ1NGTE9BVCAqZ2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmdtZkNlbGxJbmNZID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZKTsKLQlscFN0cnVjdC0+Z21mQ2VsbEluY1ggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQ2VsbEluY1gpOwotCWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl95KTsKLQlscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi54ID0gKCplbnYpLT5HZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feCk7Ci0JbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSA9ICgqZW52KS0+R2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFkpOwotCWxwU3RydWN0LT5nbWZCbGFja0JveFggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mQmxhY2tCb3hYKTsKLQlyZXR1cm4gbHBTdHJ1Y3Q7Ci19Ci0KLXZvaWQgc2V0R0xZUEhNRVRSSUNTRkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIEdMWVBITUVUUklDU0ZMT0FUICpscFN0cnVjdCkKLXsKLQlQR0xZUEhNRVRSSUNTRkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUgPSAmR0xZUEhNRVRSSUNTRkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVHTFlQSE1FVFJJQ1NGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNZLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkNlbGxJbmNYLCAoamZsb2F0KWxwU3RydWN0LT5nbWZDZWxsSW5jWCk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZnB0R2x5cGhPcmlnaW5feSwgKGpmbG9hdClscFN0cnVjdC0+Z21mcHRHbHlwaE9yaWdpbi55KTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Z21mcHRHbHlwaE9yaWdpbl94LCAoamZsb2F0KWxwU3RydWN0LT5nbWZwdEdseXBoT3JpZ2luLngpOwotCSgqZW52KS0+U2V0RmxvYXRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5nbWZCbGFja0JveFksIChqZmxvYXQpbHBTdHJ1Y3QtPmdtZkJsYWNrQm94WSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmdtZkJsYWNrQm94WCwgKGpmbG9hdClscFN0cnVjdC0+Z21mQmxhY2tCb3hYKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBjclRyYW5zcGFyZW50LCBiUmVzZXJ2ZWQsIGlMYXllclBsYW5lLCBjQXV4QnVmZmVycywgY1N0ZW5jaWxCaXRzLCBjRGVwdGhCaXRzLCBjQWNjdW1BbHBoYUJpdHMsIGNBY2N1bUJsdWVCaXRzLCBjQWNjdW1HcmVlbkJpdHMsIGNBY2N1bVJlZEJpdHMsIGNBY2N1bUJpdHMsIGNBbHBoYVNoaWZ0LCBjQWxwaGFCaXRzLCBjQmx1ZVNoaWZ0LCBjQmx1ZUJpdHMsIGNHcmVlblNoaWZ0LCBjR3JlZW5CaXRzLCBjUmVkU2hpZnQsIGNSZWRCaXRzLCBjQ29sb3JCaXRzLCBpUGl4ZWxUeXBlLCBkd0ZsYWdzLCBuVmVyc2lvbiwgblNpemU7Ci19IExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFICpQTEFZRVJQTEFORURFU0NSSVBUT1JfRklEX0NBQ0hFOwotCi1MQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgTEFZRVJQTEFORURFU0NSSVBUT1JGYzsKLQotdm9pZCBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY3JUcmFuc3BhcmVudCIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJpTGF5ZXJQbGFuZSIsICJCIik7Ci0JbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBdXhCdWZmZXJzIiwgIkIiKTsKLQlscENhY2hlLT5jU3RlbmNpbEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNTdGVuY2lsQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0RlcHRoQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1BbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CbHVlQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1HcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bVJlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBY2N1bUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWxwaGFTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVTaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjR3JlZW5TaGlmdCIsICJCIik7Ci0JbHBDYWNoZS0+Y0dyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjUmVkQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+Y0NvbG9yQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0NvbG9yQml0cyIsICJCIik7Ci0JbHBDYWNoZS0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiaVBpeGVsVHlwZSIsICJCIik7Ci0JbHBDYWNoZS0+ZHdGbGFncyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiZHdGbGFncyIsICJJIik7Ci0JbHBDYWNoZS0+blZlcnNpb24gPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5WZXJzaW9uIiwgIlMiKTsKLQlscENhY2hlLT5uU2l6ZSA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiblNpemUiLCAiUyIpOwotCWxwQ2FjaGUtPmNhY2hlZCA9IDE7Ci19Ci0KLUxBWUVSUExBTkVERVNDUklQVE9SICpnZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KQotewotCVBMQVlFUlBMQU5FREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZMQVlFUlBMQU5FREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZUxBWUVSUExBTkVERVNDUklQVE9SRmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQlscFN0cnVjdC0+Y3JUcmFuc3BhcmVudCA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclBsYW5lID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aUxheWVyUGxhbmUpOwotCWxwU3RydWN0LT5jQXV4QnVmZmVycyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBdXhCdWZmZXJzKTsKLQlscFN0cnVjdC0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzKTsKLQlscFN0cnVjdC0+Y0RlcHRoQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1BbHBoYUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMpOwotCWxwU3RydWN0LT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhU2hpZnQpOwotCWxwU3RydWN0LT5jQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cyk7Ci0JbHBTdHJ1Y3QtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0JsdWVCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzKTsKLQlscFN0cnVjdC0+Y0dyZWVuU2hpZnQgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5TaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzKTsKLQlscFN0cnVjdC0+Y1JlZFNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0KTsKLQlscFN0cnVjdC0+Y1JlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jUmVkQml0cyk7Ci0JbHBTdHJ1Y3QtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzKTsKLQlscFN0cnVjdC0+aVBpeGVsVHlwZSA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUpOwotCWxwU3RydWN0LT5kd0ZsYWdzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzKTsKLQlscFN0cnVjdC0+blZlcnNpb24gPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24pOwotCWxwU3RydWN0LT5uU2l6ZSA9ICgqZW52KS0+R2V0U2hvcnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5uU2l6ZSk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUExBWUVSUExBTkVERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJkxBWUVSUExBTkVERVNDUklQVE9SRmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlTEFZRVJQTEFORURFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y3JUcmFuc3BhcmVudCwgKGppbnQpbHBTdHJ1Y3QtPmNyVHJhbnNwYXJlbnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclBsYW5lLCAoamJ5dGUpbHBTdHJ1Y3QtPmlMYXllclBsYW5lKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycywgKGpieXRlKWxwU3RydWN0LT5jQXV4QnVmZmVycyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0RlcHRoQml0cywgKGpieXRlKWxwU3RydWN0LT5jRGVwdGhCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1BbHBoYUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtUmVkQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1SZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYVNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBbHBoYUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0JsdWVTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlbkJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0dyZWVuQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZFNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y1JlZEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNDb2xvckJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0NvbG9yQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+aVBpeGVsVHlwZSwgKGpieXRlKWxwU3RydWN0LT5pUGl4ZWxUeXBlKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3RmxhZ3MsIChqaW50KWxwU3RydWN0LT5kd0ZsYWdzKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blZlcnNpb24sIChqc2hvcnQpbHBTdHJ1Y3QtPm5WZXJzaW9uKTsKLQkoKmVudiktPlNldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUsIChqc2hvcnQpbHBTdHJ1Y3QtPm5TaXplKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgUE9JTlRGTE9BVF9GSURfQ0FDSEUgewotCWludCBjYWNoZWQ7Ci0JamNsYXNzIGNsYXp6OwotCWpmaWVsZElEIHksIHg7Ci19IFBPSU5URkxPQVRfRklEX0NBQ0hFOwotdHlwZWRlZiBQT0lOVEZMT0FUX0ZJRF9DQUNIRSAqUFBPSU5URkxPQVRfRklEX0NBQ0hFOwotCi1QT0lOVEZMT0FUX0ZJRF9DQUNIRSBQT0lOVEZMT0FURmM7Ci0KLXZvaWQgY2FjaGVQT0lOVEZMT0FURmlkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUFBPSU5URkxPQVRfRklEX0NBQ0hFIGxwQ2FjaGUpCi17Ci0JaWYgKGxwQ2FjaGUtPmNhY2hlZCkgcmV0dXJuOwotCWxwQ2FjaGUtPmNsYXp6ID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIGxwT2JqZWN0KTsKLQlscENhY2hlLT55ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ5IiwgIkYiKTsKLQlscENhY2hlLT54ID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJ4IiwgIkYiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QT0lOVEZMT0FUICpnZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCkKLXsKLQlQUE9JTlRGTE9BVF9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQT0lOVEZMT0FURmM7Ci0JaWYgKCFscENhY2hlLT5jYWNoZWQpIGNhY2hlUE9JTlRGTE9BVEZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPnkgPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSk7Ci0JbHBTdHJ1Y3QtPnggPSAoKmVudiktPkdldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eCk7Ci0JcmV0dXJuIGxwU3RydWN0OwotfQotCi12b2lkIHNldFBPSU5URkxPQVRGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBPSU5URkxPQVQgKmxwU3RydWN0KQotewotCVBQT0lOVEZMT0FUX0ZJRF9DQUNIRSBscENhY2hlID0gJlBPSU5URkxPQVRGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQT0lOVEZMT0FURmlkcyhlbnYsIGxwT2JqZWN0LCBscENhY2hlKTsKLQkoKmVudiktPlNldEZsb2F0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+eSwgKGpmbG9hdClscFN0cnVjdC0+eSk7Ci0JKCplbnYpLT5TZXRGbG9hdEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPngsIChqZmxvYXQpbHBTdHJ1Y3QtPngpOwotfQotCi10eXBlZGVmIHN0cnVjdCBQSVhFTEZPUk1BVERFU0NSSVBUT1JfRklEX0NBQ0hFIHsKLQlpbnQgY2FjaGVkOwotCWpjbGFzcyBjbGF6ejsKLQlqZmllbGRJRCBkd0RhbWFnZU1hc2ssIGR3VmlzaWJsZU1hc2ssIGR3TGF5ZXJNYXNrLCBiUmVzZXJ2ZWQsIGlMYXllclR5cGUsIGNBdXhCdWZmZXJzLCBjU3RlbmNpbEJpdHMsIGNEZXB0aEJpdHMsIGNBY2N1bUFscGhhQml0cywgY0FjY3VtQmx1ZUJpdHMsIGNBY2N1bUdyZWVuQml0cywgY0FjY3VtUmVkQml0cywgY0FjY3VtQml0cywgY0FscGhhU2hpZnQsIGNBbHBoYUJpdHMsIGNCbHVlU2hpZnQsIGNCbHVlQml0cywgY0dyZWVuU2hpZnQsIGNHcmVlbkJpdHMsIGNSZWRTaGlmdCwgY1JlZEJpdHMsIGNDb2xvckJpdHMsIGlQaXhlbFR5cGUsIGR3RmxhZ3MsIG5WZXJzaW9uLCBuU2l6ZTsKLX0gUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRTsKLXR5cGVkZWYgUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSAqUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEU7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgUElYRUxGT1JNQVRERVNDUklQVE9SRmM7Ci0KLXZvaWQgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlKQotewotCWlmIChscENhY2hlLT5jYWNoZWQpIHJldHVybjsKLQlscENhY2hlLT5jbGF6eiA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBscE9iamVjdCk7Ci0JbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0RhbWFnZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3VmlzaWJsZU1hc2sgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3VmlzaWJsZU1hc2siLCAiSSIpOwotCWxwQ2FjaGUtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJkd0xheWVyTWFzayIsICJJIik7Ci0JbHBDYWNoZS0+YlJlc2VydmVkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJiUmVzZXJ2ZWQiLCAiQiIpOwotCWxwQ2FjaGUtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlMYXllclR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmNBdXhCdWZmZXJzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQXV4QnVmZmVycyIsICJCIik7Ci0JbHBDYWNoZS0+Y1N0ZW5jaWxCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjU3RlbmNpbEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNEZXB0aEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUFscGhhQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQWxwaGFCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtQmx1ZUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FjY3VtR3JlZW5CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1SZWRCaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1SZWRCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWNjdW1CaXRzID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJjQWNjdW1CaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0FscGhhU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNBbHBoYUJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNBbHBoYUJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlU2hpZnQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNCbHVlU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0JsdWVCaXRzIiwgIkIiKTsKLQlscENhY2hlLT5jR3JlZW5TaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY0dyZWVuU2hpZnQiLCAiQiIpOwotCWxwQ2FjaGUtPmNHcmVlbkJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNHcmVlbkJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZFNoaWZ0IiwgIkIiKTsKLQlscENhY2hlLT5jUmVkQml0cyA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxwQ2FjaGUtPmNsYXp6LCAiY1JlZEJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmNDb2xvckJpdHMgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImNDb2xvckJpdHMiLCAiQiIpOwotCWxwQ2FjaGUtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImlQaXhlbFR5cGUiLCAiQiIpOwotCWxwQ2FjaGUtPmR3RmxhZ3MgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgImR3RmxhZ3MiLCAiSSIpOwotCWxwQ2FjaGUtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbHBDYWNoZS0+Y2xhenosICJuVmVyc2lvbiIsICJTIik7Ci0JbHBDYWNoZS0+blNpemUgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBscENhY2hlLT5jbGF6eiwgIm5TaXplIiwgIlMiKTsKLQlscENhY2hlLT5jYWNoZWQgPSAxOwotfQotCi1QSVhFTEZPUk1BVERFU0NSSVBUT1IgKmdldFBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUElYRUxGT1JNQVRERVNDUklQVE9SICpscFN0cnVjdCkKLXsKLQlQUElYRUxGT1JNQVRERVNDUklQVE9SX0ZJRF9DQUNIRSBscENhY2hlID0gJlBJWEVMRk9STUFUREVTQ1JJUFRPUkZjOwotCWlmICghbHBDYWNoZS0+Y2FjaGVkKSBjYWNoZVBJWEVMRk9STUFUREVTQ1JJUFRPUkZpZHMoZW52LCBscE9iamVjdCwgbHBDYWNoZSk7Ci0JbHBTdHJ1Y3QtPmR3RGFtYWdlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrKTsKLQlscFN0cnVjdC0+ZHdWaXNpYmxlTWFzayA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdWaXNpYmxlTWFzayk7Ci0JbHBTdHJ1Y3QtPmR3TGF5ZXJNYXNrID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0xheWVyTWFzayk7Ci0JbHBTdHJ1Y3QtPmJSZXNlcnZlZCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCk7Ci0JbHBTdHJ1Y3QtPmlMYXllclR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pTGF5ZXJUeXBlKTsKLQlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQXV4QnVmZmVycyk7Ci0JbHBTdHJ1Y3QtPmNTdGVuY2lsQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cyk7Ci0JbHBTdHJ1Y3QtPmNEZXB0aEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jRGVwdGhCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQWxwaGFCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1CbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bUdyZWVuQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNBY2N1bVJlZEJpdHMgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWNjdW1SZWRCaXRzKTsKLQlscFN0cnVjdC0+Y0FjY3VtQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUJpdHMpOwotCWxwU3RydWN0LT5jQWxwaGFTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYVNoaWZ0KTsKLQlscFN0cnVjdC0+Y0FscGhhQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBbHBoYUJpdHMpOwotCWxwU3RydWN0LT5jQmx1ZVNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0JsdWVTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNCbHVlQml0cyA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cyk7Ci0JbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0ID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuU2hpZnQpOwotCWxwU3RydWN0LT5jR3JlZW5CaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0dyZWVuQml0cyk7Ci0JbHBTdHJ1Y3QtPmNSZWRTaGlmdCA9ICgqZW52KS0+R2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCk7Ci0JbHBTdHJ1Y3QtPmNSZWRCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y1JlZEJpdHMpOwotCWxwU3RydWN0LT5jQ29sb3JCaXRzID0gKCplbnYpLT5HZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0NvbG9yQml0cyk7Ci0JbHBTdHJ1Y3QtPmlQaXhlbFR5cGUgPSAoKmVudiktPkdldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5pUGl4ZWxUeXBlKTsKLQlscFN0cnVjdC0+ZHdGbGFncyA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdGbGFncyk7Ci0JbHBTdHJ1Y3QtPm5WZXJzaW9uID0gKCplbnYpLT5HZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uKTsKLQlscFN0cnVjdC0+blNpemUgPSAoKmVudiktPkdldFNob3J0RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+blNpemUpOwotCXJldHVybiBscFN0cnVjdDsKLX0KLQotdm9pZCBzZXRQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWVsZHMoSk5JRW52ICplbnYsIGpvYmplY3QgbHBPYmplY3QsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpCi17Ci0JUFBJWEVMRk9STUFUREVTQ1JJUFRPUl9GSURfQ0FDSEUgbHBDYWNoZSA9ICZQSVhFTEZPUk1BVERFU0NSSVBUT1JGYzsKLQlpZiAoIWxwQ2FjaGUtPmNhY2hlZCkgY2FjaGVQSVhFTEZPUk1BVERFU0NSSVBUT1JGaWRzKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUpOwotCSgqZW52KS0+U2V0SW50RmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+ZHdEYW1hZ2VNYXNrLCAoamludClscFN0cnVjdC0+ZHdEYW1hZ2VNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3VmlzaWJsZU1hc2ssIChqaW50KWxwU3RydWN0LT5kd1Zpc2libGVNYXNrKTsKLQkoKmVudiktPlNldEludEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmR3TGF5ZXJNYXNrLCAoamludClscFN0cnVjdC0+ZHdMYXllck1hc2spOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmJSZXNlcnZlZCwgKGpieXRlKWxwU3RydWN0LT5iUmVzZXJ2ZWQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlMYXllclR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aUxheWVyVHlwZSk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0F1eEJ1ZmZlcnMsIChqYnl0ZSlscFN0cnVjdC0+Y0F1eEJ1ZmZlcnMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNTdGVuY2lsQml0cywgKGpieXRlKWxwU3RydWN0LT5jU3RlbmNpbEJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNEZXB0aEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0RlcHRoQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQWxwaGFCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNBY2N1bUFscGhhQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQmx1ZUJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bUdyZWVuQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1HcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNBY2N1bVJlZEJpdHMsIChqYnl0ZSlscFN0cnVjdC0+Y0FjY3VtUmVkQml0cyk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FjY3VtQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWNjdW1CaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQWxwaGFTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFTaGlmdCk7Ci0JKCplbnYpLT5TZXRCeXRlRmllbGQoZW52LCBscE9iamVjdCwgbHBDYWNoZS0+Y0FscGhhQml0cywgKGpieXRlKWxwU3RydWN0LT5jQWxwaGFCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQmx1ZVNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNCbHVlU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNCbHVlQml0cywgKGpieXRlKWxwU3RydWN0LT5jQmx1ZUJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNHcmVlblNoaWZ0LCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlblNoaWZ0KTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jR3JlZW5CaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNHcmVlbkJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRTaGlmdCwgKGpieXRlKWxwU3RydWN0LT5jUmVkU2hpZnQpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmNSZWRCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNSZWRCaXRzKTsKLQkoKmVudiktPlNldEJ5dGVGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5jQ29sb3JCaXRzLCAoamJ5dGUpbHBTdHJ1Y3QtPmNDb2xvckJpdHMpOwotCSgqZW52KS0+U2V0Qnl0ZUZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPmlQaXhlbFR5cGUsIChqYnl0ZSlscFN0cnVjdC0+aVBpeGVsVHlwZSk7Ci0JKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGxwT2JqZWN0LCBscENhY2hlLT5kd0ZsYWdzLCAoamludClscFN0cnVjdC0+ZHdGbGFncyk7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5WZXJzaW9uLCAoanNob3J0KWxwU3RydWN0LT5uVmVyc2lvbik7Ci0JKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgbHBPYmplY3QsIGxwQ2FjaGUtPm5TaXplLCAoanNob3J0KWxwU3RydWN0LT5uU2l6ZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N0cnVjdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNjJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvbGlicmFyeS9zdHJ1Y3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotR0xZUEhNRVRSSUNTRkxPQVQgKmdldEdMWVBITUVUUklDU0ZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBHTFlQSE1FVFJJQ1NGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRHTFlQSE1FVFJJQ1NGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgR0xZUEhNRVRSSUNTRkxPQVQgKmxwU3RydWN0KTsKLQotTEFZRVJQTEFORURFU0NSSVBUT1IgKmdldExBWUVSUExBTkVERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBMQVlFUlBMQU5FREVTQ1JJUFRPUiAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRMQVlFUlBMQU5FREVTQ1JJUFRPUkZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgTEFZRVJQTEFORURFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQotUE9JTlRGTE9BVCAqZ2V0UE9JTlRGTE9BVEZpZWxkcyhKTklFbnYgKmVudiwgam9iamVjdCBscE9iamVjdCwgUE9JTlRGTE9BVCAqbHBTdHJ1Y3QpOwotdm9pZCBzZXRQT0lOVEZMT0FURmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQT0lOVEZMT0FUICpscFN0cnVjdCk7Ci0KLVBJWEVMRk9STUFUREVTQ1JJUFRPUiAqZ2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLXZvaWQgc2V0UElYRUxGT1JNQVRERVNDUklQVE9SRmllbGRzKEpOSUVudiAqZW52LCBqb2JqZWN0IGxwT2JqZWN0LCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgKmxwU3RydWN0KTsKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL2xpYnJhcnkvc3d0LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIzNTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9saWJyYXJ5L3N3dC5yYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi0jaW5jbHVkZSAid2luZG93cy5oIgotCi1WU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KLSBQUk9EVUNUVkVSU0lPTiAwLDAsMCwwCi0gRklMRUZMQUdTTUFTSyAweDNmTAotI2lmZGVmIF9ERUJVRwotIEZJTEVGTEFHUyAweDFMCi0jZWxzZQotIEZJTEVGTEFHUyAweDBMCi0jZW5kaWYKLSBGSUxFT1MgMHg0MDAwMEwKLSBGSUxFVFlQRSAweDJMCi0gRklMRVNVQlRZUEUgMHgwTAotQkVHSU4KLSAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCi0gICAgQkVHSU4KLSAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgotICAgICAgICBCRUdJTgotICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIklCTSBDb3Jwb3JhdGlvblwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdFwwIgotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJTV1RcMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICKpIENvcHlyaWdodCAyMDAwLCAyMDAzIElCTSBDb3JwLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cMCIKLSAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgU1dUX09SR19GSUxFTkFNRQotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIlwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjAsMCwwLDBcMCIKLSAgICAgICAgRU5ECi0gICAgRU5ECi0gICAgQkxPQ0sgIlZhckZpbGVJbmZvIgotICAgIEJFR0lOCi0gICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCi0gICAgRU5ECi1FTkQKLQotLyogU0hNRU5VQkFSIFBvY2tldCBQQyAKLSAqIElEX01FTlUgU0hNRU5VQkFSIERJU0NBUkRBQkxFCi0gKiBCRUdJTgotICogCUlEX01FTlUsIDEsCi0gKiAgSU1BR0VfTk9ORSwgSURfTUVOVV9JVEVNMSwgMCwgMCwKLSAqICAwLCAwLCAwLAotICogRU5ECi0gKiBJRF9NRU5VIE1FTlUgRElTQ0FSREFCTEUKLSAqIEJFR0lOCi0gKiAgTUVOVUlURU0gIiIsIElEX01FTlVfSVRFTTEKLSAqIEVORAotICovCi0xMDAgUkNEQVRBIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAxMDAsIDEsCi0gICAgLTIsIDEwMSwgMCwgMCwgCi0gICAgMCwgMCwgMCwKLUVORAotCi0xMDAgTUVOVSBESVNDQVJEQUJMRQotQkVHSU4KLQlNRU5VSVRFTSAiIiwgMTAxCi1FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvR0xDYW52YXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMWExYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wvd2luMzIvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9HTENhbnZhcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogR0xDYW52YXMgaXMgYSB3aWRnZXQgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIE9wZW5HTCBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBHTENhbnZhcyBleHRlbmRzIENhbnZhcyB7Ci0JaW50IGNvbnRleHQ7Ci0JaW50IHBpeGVsRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIEdMQ2FudmFzIHdpZGdldCB1c2luZyB0aGUgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gdGhlIEdMRGF0YQotICogb2JqZWN0IHByb3ZpZGVkLgotICoKLSAqIEBwYXJhbSBwYXJlbnQgYSBjb21wb3NpdGUgd2lkZ2V0Ci0gKiBAcGFyYW0gc3R5bGUgdGhlIGJpdHdpc2UgT1InaW5nIG9mIHdpZGdldCBzdHlsZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBvZiB0aGUgR0xDYW52YXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICogPHVsPjxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIHdoZW4gdGhlIGRhdGEgaXMgbnVsbAotICogICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCB3aGVuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcyBjYW5ub3QgYmUgcHJvdmlkZWQ8L3VsPiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uCi0gKiA8dWw+PGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyB3aGVuIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyB0aHJlYWQKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1Qgd2hlbiBmYWlsZWQgdG8gY3JlYXRlIE9MRSBPYmplY3QKLSAqICAgICA8bGk+RVJST1JfQ0FOTk9UX09QRU5fRklMRSB3aGVuIGZhaWxlZCB0byBvcGVuIGZpbGUKLSAqICAgICA8bGk+RVJST1JfSU5URVJGQUNFX05PVF9GT1VORCB3aGVuIHVuYWJsZSB0byBjcmVhdGUgY2FsbGJhY2tzIGZvciBPTEUgSW50ZXJmYWNlcwotICogICAgIDxsaT5FUlJPUl9JTlZBTElEX0NMQVNTSUQKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBHTENhbnZhcyAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBHTERhdGEgZGF0YSkgewotCXN1cGVyIChwYXJlbnQsIHN0eWxlKTsKLQlpZiAoZGF0YSA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQotCVBJWEVMRk9STUFUREVTQ1JJUFRPUiBwZmQgPSBuZXcgUElYRUxGT1JNQVRERVNDUklQVE9SICgpOwotCXBmZC5uU2l6ZSA9IChzaG9ydCkgUElYRUxGT1JNQVRERVNDUklQVE9SLnNpemVvZjsKLQlwZmQublZlcnNpb24gPSAxOwotCXBmZC5kd0ZsYWdzID0gV0dMLlBGRF9EUkFXX1RPX1dJTkRPVyB8IFdHTC5QRkRfU1VQUE9SVF9PUEVOR0w7Ci0JcGZkLmR3TGF5ZXJNYXNrID0gV0dMLlBGRF9NQUlOX1BMQU5FOwotCXBmZC5pUGl4ZWxUeXBlID0gKGJ5dGUpIFdHTC5QRkRfVFlQRV9SR0JBOwotCWlmIChkYXRhLmRvdWJsZUJ1ZmZlcikgcGZkLmR3RmxhZ3MgfD0gV0dMLlBGRF9ET1VCTEVCVUZGRVI7Ci0JaWYgKGRhdGEuc3RlcmVvKSBwZmQuZHdGbGFncyB8PSBXR0wuUEZEX1NURVJFTzsKLQlwZmQuY1JlZEJpdHMgPSAoYnl0ZSkgZGF0YS5yZWRTaXplOwotCXBmZC5jR3JlZW5CaXRzID0gKGJ5dGUpIGRhdGEuZ3JlZW5TaXplOwotCXBmZC5jQmx1ZUJpdHMgPSAoYnl0ZSkgZGF0YS5ibHVlU2l6ZTsKLQlwZmQuY0FscGhhQml0cyA9IChieXRlKSBkYXRhLmFscGhhU2l6ZTsKLQlwZmQuY0RlcHRoQml0cyA9IChieXRlKSBkYXRhLmRlcHRoU2l6ZTsKLQlwZmQuY1N0ZW5jaWxCaXRzID0gKGJ5dGUpIGRhdGEuc3RlbmNpbFNpemU7Ci0JcGZkLmNBY2N1bVJlZEJpdHMgPSAoYnl0ZSkgZGF0YS5hY2N1bVJlZFNpemU7Ci0JcGZkLmNBY2N1bUdyZWVuQml0cyA9IChieXRlKSBkYXRhLmFjY3VtR3JlZW5TaXplOwotCXBmZC5jQWNjdW1CbHVlQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQmx1ZVNpemU7Ci0JcGZkLmNBY2N1bUFscGhhQml0cyA9IChieXRlKSBkYXRhLmFjY3VtQWxwaGFTaXplOwotCXBmZC5jQWNjdW1CaXRzID0gKGJ5dGUpIChwZmQuY0FjY3VtUmVkQml0cyArIHBmZC5jQWNjdW1HcmVlbkJpdHMgKyBwZmQuY0FjY3VtQmx1ZUJpdHMgKyBwZmQuY0FjY3VtQWxwaGFCaXRzKTsKLQkvL0ZJWE1FIC0gdXNlIHdnbENob29zZVBpeGVsRm9ybWF0QVJCCi0vLwlpZiAoZGF0YS5zYW1wbGVCdWZmZXJzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVfQlVGRkVSU19BUkI7Ci0vLwkJd2dsQXR0cmliIFtwb3MrK10gPSBkYXRhLnNhbXBsZUJ1ZmZlcnM7Ci0vLwl9Ci0vLwlpZiAoZGF0YS5zYW1wbGVzID4gMCkgewotLy8JCXdnbEF0dHJpYiBbcG9zKytdID0gV0dMLldHTF9TQU1QTEVTX0FSQjsKLS8vCQl3Z2xBdHRyaWIgW3BvcysrXSA9IGRhdGEuc2FtcGxlczsKLS8vCX0KLQotCWludCBoREMgPSBPUy5HZXREQyAoaGFuZGxlKTsKLQlwaXhlbEZvcm1hdCA9IFdHTC5DaG9vc2VQaXhlbEZvcm1hdCAoaERDLCBwZmQpOwotCWlmIChwaXhlbEZvcm1hdCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWlmICghV0dMLlNldFBpeGVsRm9ybWF0IChoREMsIHBpeGVsRm9ybWF0LCBwZmQpKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci0JfQotCWNvbnRleHQgPSBXR0wud2dsQ3JlYXRlQ29udGV4dCAoaERDKTsKLQlpZiAoY29udGV4dCA9PSAwKSB7Ci0JCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotCQlTV1QuZXJyb3IgKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQl9Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0vLwlpZiAoc2hhcmUgIT0gbnVsbCkgewotLy8JCVdHTC53Z2xTaGFyZUxpc3RzIChjb250ZXh0LCBzaGFyZS5jb250ZXh0KTsKLS8vCX0KLQkKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5EaXNwb3NlOgotCQkJCVdHTC53Z2xEZWxldGVDb250ZXh0IChjb250ZXh0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0JYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEdMRGF0YSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY3JlYXRlZCBjb250ZXh0LgotICogIAotICogQHJldHVybiBHTERhdGEgZGVzY3JpcHRpb24gb2YgdGhlIE9wZW5HTCBjb250ZXh0IGF0dHJpYnV0ZXMKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIEdMRGF0YSBnZXRHTERhdGEgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCUdMRGF0YSBkYXRhID0gbmV3IEdMRGF0YSAoKTsKLQlQSVhFTEZPUk1BVERFU0NSSVBUT1IgcGZkID0gbmV3IFBJWEVMRk9STUFUREVTQ1JJUFRPUiAoKTsKLQlwZmQublNpemUgPSAoc2hvcnQpIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2Y7Ci0JaW50IGhEQyA9IE9TLkdldERDIChoYW5kbGUpOwotCVdHTC5EZXNjcmliZVBpeGVsRm9ybWF0KGhEQywgcGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUi5zaXplb2YsIHBmZCk7Ci0JT1MuUmVsZWFzZURDIChoYW5kbGUsIGhEQyk7Ci0JZGF0YS5kb3VibGVCdWZmZXIgPSAocGZkLmR3RmxhZ3MgJiBXR0wuUEZEX0RPVUJMRUJVRkZFUikgIT0gMDsKLQlkYXRhLnN0ZXJlbyA9IChwZmQuZHdGbGFncyAmIFdHTC5QRkRfU1RFUkVPKSAhPSAwOwotCWRhdGEucmVkU2l6ZSA9IHBmZC5jUmVkQml0czsKLQlkYXRhLmdyZWVuU2l6ZSA9IHBmZC5jR3JlZW5CaXRzOwotCWRhdGEuYmx1ZVNpemUgPSBwZmQuY0JsdWVCaXRzOwotCWRhdGEuYWxwaGFTaXplID0gcGZkLmNBbHBoYUJpdHM7Ci0JZGF0YS5kZXB0aFNpemUgPSBwZmQuY0RlcHRoQml0czsKLQlkYXRhLnN0ZW5jaWxTaXplID0gcGZkLmNTdGVuY2lsQml0czsKLQlkYXRhLmFjY3VtUmVkU2l6ZSA9IHBmZC5jQWNjdW1SZWRCaXRzOwotCWRhdGEuYWNjdW1HcmVlblNpemUgPSBwZmQuY0FjY3VtR3JlZW5CaXRzOwotCWRhdGEuYWNjdW1CbHVlU2l6ZSA9IHBmZC5jQWNjdW1CbHVlQml0czsKLQlkYXRhLmFjY3VtQWxwaGFTaXplID0gcGZkLmNBY2N1bUFscGhhQml0czsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlY2VpdmVyJ3MgT3BlbkdMIGNvbnRleHQKLSAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQuCi0gKiAgCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlY2VpdmVyIGhvbGRzIHRoZSBjdXJyZW50IE9wZW5HTCBjb250ZXh0LAotICogZmFsc2Ugb3RoZXJ3aXNlCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JcmV0dXJuIFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGU7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgT3BlbkdMIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR0xDYW52YXMgdG8gYmUgdGhlCi0gKiBjdXJyZW50IEdMIGNvbnRleHQuCi0gKiAKLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0Q3VycmVudCAoKSB7Ci0JY2hlY2tXaWRnZXQgKCk7Ci0JaWYgKFdHTC53Z2xHZXRDdXJyZW50Q29udGV4dCAoKSA9PSBoYW5kbGUpIHJldHVybjsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLndnbE1ha2VDdXJyZW50IChoREMsIGNvbnRleHQpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotCi0vKioKLSAqIFN3YXBzIHRoZSBmcm9udCBhbmQgYmFjayBjb2xvciBidWZmZXJzLgotICogCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHN3YXBCdWZmZXJzICgpIHsKLQljaGVja1dpZGdldCAoKTsKLQlpbnQgaERDID0gT1MuR2V0REMgKGhhbmRsZSk7Ci0JV0dMLlN3YXBCdWZmZXJzIChoREMpOwotCU9TLlJlbGVhc2VEQyAoaGFuZGxlLCBoREMpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL0xBWUVSUExBTkVERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjc0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvTEFZRVJQTEFORURFU0NSSVBUT1IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmludGVybmFsLndpbjMyOwotCi0KLXB1YmxpYyBjbGFzcyBMQVlFUlBMQU5FREVTQ1JJUFRPUiB7Ci0gICAgcHVibGljIHNob3J0IG5TaXplOwotICAgIHB1YmxpYyBzaG9ydCBuVmVyc2lvbjsKLSAgICBwdWJsaWMgaW50IGR3RmxhZ3M7Ci0gICAgcHVibGljIGJ5dGUgaVBpeGVsVHlwZTsKLSAgICBwdWJsaWMgYnl0ZSBjQ29sb3JCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNSZWRTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNHcmVlblNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNCbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQmx1ZVNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNBbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1SZWRCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUdyZWVuQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CbHVlQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1BbHBoYUJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0RlcHRoQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjU3RlbmNpbEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0F1eEJ1ZmZlcnM7Ci0gICAgcHVibGljIGJ5dGUgaUxheWVyUGxhbmU7Ci0gICAgcHVibGljIGJ5dGUgYlJlc2VydmVkOwotICAgIHB1YmxpYyBpbnQgY3JUcmFuc3BhcmVudDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAzNjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1BJWEVMRk9STUFUREVTQ1JJUFRPUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTcwMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvUElYRUxGT1JNQVRERVNDUklQVE9SLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5pbnRlcm5hbC53aW4zMjsKLQotCi1wdWJsaWMgY2xhc3MgUElYRUxGT1JNQVRERVNDUklQVE9SIHsKLSAgIAlwdWJsaWMgc2hvcnQgblNpemU7Ci0gICAgcHVibGljIHNob3J0IG5WZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgZHdGbGFnczsKLSAgICBwdWJsaWMgYnl0ZSBpUGl4ZWxUeXBlOwotICAgIHB1YmxpYyBieXRlIGNDb2xvckJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY1JlZFNoaWZ0OwotICAgIHB1YmxpYyBieXRlIGNHcmVlbkJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0dyZWVuU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0JsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNCbHVlU2hpZnQ7Ci0gICAgcHVibGljIGJ5dGUgY0FscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQWxwaGFTaGlmdDsKLSAgICBwdWJsaWMgYnl0ZSBjQWNjdW1CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bVJlZEJpdHM7Ci0gICAgcHVibGljIGJ5dGUgY0FjY3VtR3JlZW5CaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUJsdWVCaXRzOwotICAgIHB1YmxpYyBieXRlIGNBY2N1bUFscGhhQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjRGVwdGhCaXRzOwotICAgIHB1YmxpYyBieXRlIGNTdGVuY2lsQml0czsKLSAgICBwdWJsaWMgYnl0ZSBjQXV4QnVmZmVyczsKLSAgICBwdWJsaWMgYnl0ZSBpTGF5ZXJUeXBlOwotICAgIHB1YmxpYyBieXRlIGJSZXNlcnZlZDsKLSAgICBwdWJsaWMgaW50IGR3TGF5ZXJNYXNrOwotICAgIHB1YmxpYyBpbnQgZHdWaXNpYmxlTWFzazsKLSAgICBwdWJsaWMgaW50IGR3RGFtYWdlTWFzazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA0MDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC93aW4zMi9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2ludGVybmFsL3dpbjMyL1dHTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsL3dpbjMyL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvaW50ZXJuYWwvd2luMzIvV0dMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuaW50ZXJuYWwud2luMzI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotCi1wdWJsaWMgY2xhc3MgV0dMIHsKLQkKLXN0YXRpYyB7Ci0JTGlicmFyeS5sb2FkTGlicmFyeSgiZ2wiKTsKLX0KLQkKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdHTF9GT05UX0xJTkVTICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX0ZPTlRfUE9MWUdPTlMgICA9IDE7Ci0KLS8qIExBWUVSUExBTkVERVNDUklQVE9SIGZsYWdzICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfRE9VQkxFQlVGRkVSICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1RFUkVPICAgICAgICAgICAgICA9IDB4MDAwMDAwMDI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9HREkgICAgICAgICA9IDB4MDAwMDAwMTA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1VQUE9SVF9PUEVOR0wgICAgICA9IDB4MDAwMDAwMjA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfREVQVEggICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfU1RFTkNJTCAgICAgICA9IDB4MDAwMDAwODA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU0hBUkVfQUNDVU0gICAgICAgICA9IDB4MDAwMDAxMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9FWENIQU5HRSAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfU1dBUF9DT1BZICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBMUERfVFJBTlNQQVJFTlQgICAgICAgICA9IDB4MDAwMDEwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX1JHQkEgICAgICAgID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExQRF9UWVBFX0NPTE9SSU5ERVggID0gMTsKLQotLyogd2dsU3dhcExheWVyQnVmZmVycyBmbGFncyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfTUFJTl9QTEFORSAgICAgPSAweDAwMDAwMDAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTIgICAgICAgPSAweDAwMDAwMDA0OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTMgICAgICAgPSAweDAwMDAwMDA4OwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTQgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTUgICAgICAgPSAweDAwMDAwMDIwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTYgICAgICAgPSAweDAwMDAwMDQwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTcgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTggICAgICAgPSAweDAwMDAwMTAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTkgICAgICAgPSAweDAwMDAwMjAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEwICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTExICAgICAgPSAweDAwMDAwODAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEyICAgICAgPSAweDAwMDAxMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTEzICAgICAgPSAweDAwMDAyMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE0ICAgICAgPSAweDAwMDA0MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfT1ZFUkxBWTE1ICAgICAgPSAweDAwMDA4MDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxICAgICAgPSAweDAwMDEwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkyICAgICAgPSAweDAwMDIwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkzICAgICAgPSAweDAwMDQwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk0ICAgICAgPSAweDAwMDgwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk1ICAgICAgPSAweDAwMTAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk2ICAgICAgPSAweDAwMjAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk3ICAgICAgPSAweDAwNDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk4ICAgICAgPSAweDAwODAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVk5ICAgICAgPSAweDAxMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMCAgICAgPSAweDAyMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMSAgICAgPSAweDA0MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMiAgICAgPSAweDA4MDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxMyAgICAgPSAweDEwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNCAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0dMX1NXQVBfVU5ERVJMQVkxNSAgICAgPSAweDQwMDAwMDAwOwotCi0vKiBwaXhlbCB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfUkdCQSAgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1RZUEVfQ09MT1JJTkRFWCAgPSAxOwotCi0vKiBsYXllciB0eXBlcyAqLwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX01BSU5fUExBTkUgICAgICAgPSAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX09WRVJMQVlfUExBTkUgICAgPSAxOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1VOREVSTEFZX1BMQU5FICAgPSAoLTEpOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgKi8KLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9ET1VCTEVCVUZGRVIgICAgICAgICAgICA9IDB4MDAwMDAwMDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1RFUkVPICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RSQVdfVE9fV0lORE9XICAgICAgICAgID0gMHgwMDAwMDAwNDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9EUkFXX1RPX0JJVE1BUCAgICAgICAgICA9IDB4MDAwMDAwMDg7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9HREkgICAgICAgICAgICAgPSAweDAwMDAwMDEwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NVUFBPUlRfT1BFTkdMICAgICAgICAgID0gMHgwMDAwMDAyMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0ZPUk1BVCAgICAgICAgICA9IDB4MDAwMDAwNDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfTkVFRF9QQUxFVFRFICAgICAgICAgICAgPSAweDAwMDAwMDgwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX05FRURfU1lTVEVNX1BBTEVUVEUgICAgID0gMHgwMDAwMDEwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TV0FQX0VYQ0hBTkdFICAgICAgICAgICA9IDB4MDAwMDAyMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1dBUF9DT1BZICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX1NXQVBfTEFZRVJfQlVGRkVSUyAgICAgID0gMHgwMDAwMDgwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9HRU5FUklDX0FDQ0VMRVJBVEVEICAgICA9IDB4MDAwMDEwMDA7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfU1VQUE9SVF9ESVJFQ1REUkFXICAgICAgPSAweDAwMDAyMDAwOwotCi0vKiBQSVhFTEZPUk1BVERFU0NSSVBUT1IgZmxhZ3MgZm9yIHVzZSBpbiBDaG9vc2VQaXhlbEZvcm1hdCBvbmx5ICovCi1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRkRfREVQVEhfRE9OVENBUkUgICAgICAgICAgPSAweDIwMDAwMDAwOwotcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEZEX0RPVUJMRUJVRkZFUl9ET05UQ0FSRSAgID0gMHg0MDAwMDAwMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBGRF9TVEVSRU9fRE9OVENBUkUgICAgICAgICA9IDB4ODAwMDAwMDA7Ci0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBDaG9vc2VQaXhlbEZvcm1hdChpbnQgaGRjLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRGVzY3JpYmVQaXhlbEZvcm1hdChpbnQgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgbkJ5dGVzLCBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgR2V0UGl4ZWxGb3JtYXQoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIFNldFBpeGVsRm9ybWF0KGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIFBJWEVMRk9STUFUREVTQ1JJUFRPUiBwcGZkKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gU3dhcEJ1ZmZlcnMoaW50IGhkYyk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbENvcHlDb250ZXh0KGludCBoZ2xyY1NyYywgaW50IGhnbHJjRHN0LCBpbnQgbWFzayk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsQ3JlYXRlQ29udGV4dChpbnQgaGRjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xDcmVhdGVMYXllckNvbnRleHQoaW50IGhkYywgaW50IGlMYXllclBsYW5lKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVsZXRlQ29udGV4dChpbnQgaGdscmMpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IHdnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0Q3VycmVudERDKCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsR2V0UHJvY0FkZHJlc3MoYnl0ZVtdIGxwc3pQcm9jKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsTWFrZUN1cnJlbnQoaW50IGhkYywgaW50IGhnbHJjKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsU2hhcmVMaXN0cyhpbnQgaGdscmMxLCBpbnQgaGdscmMyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHNBKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xVc2VGb250Qml0bWFwc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udEJpdG1hcHMoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSkgewotCWlmIChPUy5Jc1VuaWNvZGUpIHJldHVybiB3Z2xVc2VGb250Qml0bWFwc1coaGRjLCBmaXJzdCwgY291bnQsIGxpc3RCYXNlKTsKLQlyZXR1cm4gd2dsVXNlRm9udEJpdG1hcHNBKGhkYywgZmlyc3QsIGNvdW50LCBsaXN0QmFzZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc0EoaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFVzZUZvbnRPdXRsaW5lc1coaW50IGhkYywgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0QmFzZSwgZmxvYXQgZGV2aWF0aW9uLCBmbG9hdCBleHRydXNpb24sIGludCBmb3JtYXQsIGludCBscGdtZik7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gd2dsVXNlRm9udE91dGxpbmVzKGludCBoZGMsIGludCBmaXJzdCwgaW50IGNvdW50LCBpbnQgbGlzdEJhc2UsIGZsb2F0IGRldmlhdGlvbiwgZmxvYXQgZXh0cnVzaW9uLCBpbnQgZm9ybWF0LCBpbnQgbHBnbWYpIHsKLQlpZiAoT1MuSXNVbmljb2RlKSByZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzVyhoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLQlyZXR1cm4gd2dsVXNlRm9udE91dGxpbmVzQShoZGMsIGZpcnN0LCBjb3VudCwgbGlzdEJhc2UsIGRldmlhdGlvbiwgZXh0cnVzaW9uLCBmb3JtYXQsIGxwZ21mKTsKLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gd2dsRGVzY3JpYmVMYXllclBsYW5lKGludCBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgaW50IG5CeXRlcywgTEFZRVJQTEFORURFU0NSSVBUT1IgcGxwZCk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgd2dsU2V0TGF5ZXJQYWxldHRlRW50cmllcyhpbnQgaGRjLCBpbnQgaUxheWVyUGxhbmUsIGludCBpU3RhcnQsIGludCBjRW50cmllcywgaW50W10gcGNyKTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCB3Z2xHZXRMYXllclBhbGV0dGVFbnRyaWVzKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgaW50IGlTdGFydCwgaW50IGNFbnRyaWVzLCBpbnRbXSBwY3IpOwotcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiB3Z2xSZWFsaXplTGF5ZXJQYWxldHRlKGludCBoZGMsIGludCBpTGF5ZXJQbGFuZSwgYm9vbGVhbiBiUmVhbGl6ZSk7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHdnbFN3YXBMYXllckJ1ZmZlcnMoaW50IGhkYywgaW50IGZ1UGxhbmVzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvd2lkZ2V0cy9UYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKaW5kZXggNjg1OTgxOS4uZGViNTJlOSAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RhYmxlLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAKIAlpbnQgaXRlbUNvdW50LCBjb2x1bW5Db3VudCwgY29sdW1uX2lkLCBpZENvdW50LCBhbmNob3JGaXJzdCwgYW5jaG9yTGFzdCwgaGVhZGVySGVpZ2h0LCBpdGVtSGVpZ2h0LCBsYXN0SW5kZXhPZjsKIAlib29sZWFuICBpZ25vcmVTZWxlY3QsIHdhc1NlbGVjdGVkLCBmaXhTY3JvbGxXaWR0aCwgZHJhd0JhY2tncm91bmQ7CiAJUmVjdGFuZ2xlIGltYWdlQm91bmRzOwotCWludCBzaG93SW5kZXgsIGxhc3RIaXR0ZXN0LCBsYXN0SGl0dGVzdENvbHVtbjsKKwlpbnQgc2hvd0luZGV4LCBsYXN0SGl0dGVzdDsKIAlzdGF0aWMgZmluYWwgaW50IENIRUNLX0NPTFVNTl9JRCA9IDEwMjQ7CiAJc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUQgPSAxMDI1OwogCXN0YXRpYyBmaW5hbCBpbnQgR1JJRF9XSURUSCA9IDE7CkBAIC0xNDQwLDggKzE0NDAsOSBAQAogCVJlY3QgcmVjdCA9IG5ldyBSZWN0ICgpOwogCW9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uUG9pbnQgcHQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5Qb2ludCAoKTsKIAlPUy5TZXRQdCAocHQsIChzaG9ydCkgcG9pbnQueCwgKHNob3J0KSBwb2ludC55KTsKLQlpZiAoMCA8IGxhc3RIaXR0ZXN0ICYmIGxhc3RIaXR0ZXN0IDw9IGl0ZW1Db3VudCAmJiBsYXN0SGl0dGVzdENvbHVtbiAhPSAwKSB7Ci0JCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGxhc3RIaXR0ZXN0LCBsYXN0SGl0dGVzdENvbHVtbiwgT1Mua0RhdGFCcm93c2VyUHJvcGVydHlFbmNsb3NpbmdQYXJ0LCByZWN0KSA9PSBPUy5ub0VycikgeworCWludCBjb2x1bW5JZCA9IChjb2x1bW5Db3VudCA9PSAwKSA/IGNvbHVtbl9pZCA6IGNvbHVtbnMgWzBdLmlkOworCWlmICgwIDwgbGFzdEhpdHRlc3QgJiYgbGFzdEhpdHRlc3QgPD0gaXRlbUNvdW50KSB7CisJCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGxhc3RIaXR0ZXN0LCBjb2x1bW5JZCwgT1Mua0RhdGFCcm93c2VyUHJvcGVydHlFbmNsb3NpbmdQYXJ0LCByZWN0KSA9PSBPUy5ub0VycikgewogCQkJaWYgKHJlY3QudG9wIDw9IHB0LnYgJiYgcHQudiA8PSByZWN0LmJvdHRvbSkgewogCQkJCWlmICgoc3R5bGUgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApIHsKIAkJCQkJcmV0dXJuIF9nZXRJdGVtIChsYXN0SGl0dGVzdCAtIDEpOwpAQCAtMTQ2MiwyNiArMTQ2MywxMiBAQAogCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykgewogCQlpbnQgaW5kZXggPSAodG9wWzBdIC0gaGVhZGVyIFswXSArIHBvaW50LnkpIC8gaGVpZ2h0IFswXSArIG9mZnNldHMgW2ldOwogCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IGl0ZW1Db3VudCkgewotCQkJaWYgKGNvbHVtbkNvdW50ID09IDApIHsKLQkJCQlpZiAoT1MuR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyAoaGFuZGxlLCBpbmRleCArIDEsIGNvbHVtbl9pZCwgT1Mua0RhdGFCcm93c2VyUHJvcGVydHlFbmNsb3NpbmdQYXJ0LCByZWN0KSA9PSBPUy5ub0VycikgewotCQkJCQlpZiAocmVjdC50b3AgPD0gcHQudiAmJiBwdC52IDw9IHJlY3QuYm90dG9tKSB7Ci0JCQkJCQlpZiAoKHN0eWxlICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKSB7Ci0JCQkJCQkJcmV0dXJuIF9nZXRJdGVtIChpbmRleCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBPUy5QdEluUmVjdCAocHQsIHJlY3QpID8gX2dldEl0ZW0gKGluZGV4KSA6IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJCQlpZiAoT1MuR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyAoaGFuZGxlLCBpbmRleCArIDEsIGNvbHVtbnMgW2pdLmlkLCBPUy5rRGF0YUJyb3dzZXJQcm9wZXJ0eUVuY2xvc2luZ1BhcnQsIHJlY3QpID09IE9TLm5vRXJyKSB7Ci0JCQkJCQlpZiAocmVjdC50b3AgPD0gcHQudiAmJiBwdC52IDw9IHJlY3QuYm90dG9tKSB7Ci0JCQkJCQkJaWYgKChzdHlsZSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCkgewotCQkJCQkJCQlyZXR1cm4gX2dldEl0ZW0gKGluZGV4KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm4gT1MuUHRJblJlY3QgKHB0LCByZWN0KSA/IF9nZXRJdGVtIChpbmRleCkgOiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KKwkJCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGluZGV4ICsgMSwgY29sdW1uSWQsIE9TLmtEYXRhQnJvd3NlclByb3BlcnR5RW5jbG9zaW5nUGFydCwgcmVjdCkgPT0gT1Mubm9FcnIpIHsKKwkJCQlpZiAocmVjdC50b3AgPD0gcHQudiAmJiBwdC52IDw9IHJlY3QuYm90dG9tKSB7CisJCQkJCWlmICgoc3R5bGUgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApIHsKKwkJCQkJCXJldHVybiBfZ2V0SXRlbSAoaW5kZXgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmV0dXJuIE9TLlB0SW5SZWN0IChwdCwgcmVjdCkgPyBfZ2V0SXRlbSAoaW5kZXgpIDogbnVsbDsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTE0ODksMjYgKzE0NzYsMTIgQEAKIAl9CiAJLy9UT0RPIC0gb3B0aW1pemUKIAlmb3IgKGludCBpPTA7IGk8aXRlbUNvdW50OyBpKyspIHsKLQkJaWYgKGNvbHVtbkNvdW50ID09IDApIHsKLQkJCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGkgKyAxLCBjb2x1bW5faWQsIE9TLmtEYXRhQnJvd3NlclByb3BlcnR5RW5jbG9zaW5nUGFydCwgcmVjdCkgPT0gT1Mubm9FcnIpIHsKLQkJCQlpZiAocmVjdC50b3AgPD0gcHQudiAmJiBwdC52IDw9IHJlY3QuYm90dG9tKSB7Ci0JCQkJCWlmICgoc3R5bGUgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApIHsKLQkJCQkJCXJldHVybiBfZ2V0SXRlbSAoaSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gT1MuUHRJblJlY3QgKHB0LCByZWN0KSA/IF9nZXRJdGVtIChpKSA6IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCQlpZiAoT1MuR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyAoaGFuZGxlLCBpICsgMSwgY29sdW1ucyBbal0uaWQsIE9TLmtEYXRhQnJvd3NlclByb3BlcnR5RW5jbG9zaW5nUGFydCwgcmVjdCkgPT0gT1Mubm9FcnIpIHsKLQkJCQkJaWYgKHJlY3QudG9wIDw9IHB0LnYgJiYgcHQudiA8PSByZWN0LmJvdHRvbSkgewotCQkJCQkJaWYgKChzdHlsZSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCkgewotCQkJCQkJCXJldHVybiBfZ2V0SXRlbSAoaSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBPUy5QdEluUmVjdCAocHQsIHJlY3QpID8gX2dldEl0ZW0gKGkpIDogbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQorCQlpZiAoT1MuR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyAoaGFuZGxlLCBpICsgMSwgY29sdW1uSWQsIE9TLmtEYXRhQnJvd3NlclByb3BlcnR5RW5jbG9zaW5nUGFydCwgcmVjdCkgPT0gT1Mubm9FcnIpIHsKKwkJCWlmIChyZWN0LnRvcCA8PSBwdC52ICYmIHB0LnYgPD0gcmVjdC5ib3R0b20pIHsKKwkJCQlpZiAoKHN0eWxlICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKSB7CisJCQkJCXJldHVybiBfZ2V0SXRlbSAoaSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIE9TLlB0SW5SZWN0IChwdCwgcmVjdCkgPyBfZ2V0SXRlbSAoaSkgOiBudWxsOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTkwNiw3ICsxODc5LDYgQEAKIAogaW50IGhpdFRlc3RQcm9jIChpbnQgYnJvd3NlciwgaW50IGlkLCBpbnQgcHJvcGVydHksIGludCB0aGVSZWN0LCBpbnQgbW91c2VSZWN0KSB7CiAJbGFzdEhpdHRlc3QgPSBpZDsKLQlsYXN0SGl0dGVzdENvbHVtbiA9IHByb3BlcnR5OwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L3dpZGdldHMvVHJlZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5zd3QvRWNsaXBzZSBTV1QvY2FyYm9uL29yZy9lY2xpcHNlL3N3dC93aWRnZXRzL1RyZWUuamF2YQppbmRleCBiZTliZmI2Li44NWZmOTFiIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLnN3dC9FY2xpcHNlIFNXVC9jYXJib24vb3JnL2VjbGlwc2Uvc3d0L3dpZGdldHMvVHJlZS5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uuc3d0L0VjbGlwc2UgU1dUL2NhcmJvbi9vcmcvZWNsaXBzZS9zd3Qvd2lkZ2V0cy9UcmVlLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAKIAlib29sZWFuIGlnbm9yZVJlZHJhdywgaWdub3JlU2VsZWN0LCB3YXNTZWxlY3RlZCwgaWdub3JlRXhwYW5kLCB3YXNFeHBhbmRlZCwgaW5DbGVhckFsbCwgZHJhd0JhY2tncm91bmQ7CiAJUmVjdGFuZ2xlIGltYWdlQm91bmRzOwogCVRyZWVJdGVtIHNob3dJdGVtOwotCWludCBsYXN0SGl0dGVzdCwgbGFzdEhpdHRlc3RDb2x1bW4sIHZpc2libGVDb3VudDsKKwlpbnQgbGFzdEhpdHRlc3QsIHZpc2libGVDb3VudDsKIAlzdGF0aWMgZmluYWwgaW50IENIRUNLX0NPTFVNTl9JRCA9IDEwMjQ7CiAJc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUQgPSAxMDI1OwogCXN0YXRpYyBmaW5hbCBpbnQgR1JJRF9XSURUSCA9IDE7CkBAIC0xNDkxLDEwICsxNDkxLDExIEBACiAJUmVjdCByZWN0ID0gbmV3IFJlY3QgKCk7CiAJb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5Qb2ludCBwdCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLlBvaW50ICgpOwogCU9TLlNldFB0IChwdCwgKHNob3J0KSBwb2ludC54LCAoc2hvcnQpIHBvaW50LnkpOwotCWlmICgwIDwgbGFzdEhpdHRlc3QgJiYgbGFzdEhpdHRlc3QgPD0gaXRlbXMubGVuZ3RoICYmIGxhc3RIaXR0ZXN0Q29sdW1uICE9IDApIHsKKwlpbnQgY29sdW1uSWQgPSAoY29sdW1uQ291bnQgPT0gMCkgPyBjb2x1bW5faWQgOiBjb2x1bW5zIFswXS5pZDsKKwlpZiAoMCA8IGxhc3RIaXR0ZXN0ICYmIGxhc3RIaXR0ZXN0IDw9IGl0ZW1zLmxlbmd0aCkgewogCQlUcmVlSXRlbSBpdGVtID0gX2dldEl0ZW0gKGxhc3RIaXR0ZXN0LCBmYWxzZSk7CiAJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGl0ZW0uaWQsIGxhc3RIaXR0ZXN0Q29sdW1uLCBPUy5rRGF0YUJyb3dzZXJQcm9wZXJ0eUVuY2xvc2luZ1BhcnQsIHJlY3QpID09IE9TLm5vRXJyKSB7CisJCQlpZiAoT1MuR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyAoaGFuZGxlLCBpdGVtLmlkLCBjb2x1bW5JZCwgT1Mua0RhdGFCcm93c2VyUHJvcGVydHlFbmNsb3NpbmdQYXJ0LCByZWN0KSA9PSBPUy5ub0VycikgewogCQkJCWlmIChyZWN0LnRvcCA8PSBwdC52ICYmIHB0LnYgPD0gcmVjdC5ib3R0b20pIHsKIAkJCQkJaWYgKChzdHlsZSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCkgewogCQkJCQkJcmV0dXJuIGl0ZW07CkBAIC0xNTA5LDI2ICsxNTEwLDEyIEBACiAJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtcyBbaV07CiAJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWlmIChjb2x1bW5Db3VudCA9PSAwKSB7Ci0JCQkJaWYgKE9TLkdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMgKGhhbmRsZSwgaXRlbS5pZCwgY29sdW1uX2lkLCBPUy5rRGF0YUJyb3dzZXJQcm9wZXJ0eUVuY2xvc2luZ1BhcnQsIHJlY3QpID09IE9TLm5vRXJyKSB7Ci0JCQkJCWlmIChyZWN0LnRvcCA8PSBwdC52ICYmIHB0LnYgPD0gcmVjdC5ib3R0b20pIHsKLQkJCQkJCWlmICgoc3R5bGUgJiBTV1QuRlVMTF9TRUxFQ1RJT04pICE9IDApIHsKLQkJCQkJCQlyZXR1cm4gaXRlbTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIE9TLlB0SW5SZWN0IChwdCwgcmVjdCkgPyBpdGVtIDogbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb2x1bW5Db3VudDsgaisrKSB7Ci0JCQkJCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGl0ZW0uaWQsIGNvbHVtbnMgW2pdLmlkLCBPUy5rRGF0YUJyb3dzZXJQcm9wZXJ0eUVuY2xvc2luZ1BhcnQsIHJlY3QpID09IE9TLm5vRXJyKSB7Ci0JCQkJCQlpZiAocmVjdC50b3AgPD0gcHQudiAmJiBwdC52IDw9IHJlY3QuYm90dG9tKSB7Ci0JCQkJCQkJaWYgKChzdHlsZSAmIFNXVC5GVUxMX1NFTEVDVElPTikgIT0gMCkgewotCQkJCQkJCQlyZXR1cm4gaXRlbTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm4gT1MuUHRJblJlY3QgKHB0LCByZWN0KSA/IGl0ZW0gOiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KKwkJCWlmIChPUy5HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIChoYW5kbGUsIGl0ZW0uaWQsIGNvbHVtbklkLCBPUy5rRGF0YUJyb3dzZXJQcm9wZXJ0eUVuY2xvc2luZ1BhcnQsIHJlY3QpID09IE9TLm5vRXJyKSB7CisJCQkJaWYgKHJlY3QudG9wIDw9IHB0LnYgJiYgcHQudiA8PSByZWN0LmJvdHRvbSkgeworCQkJCQlpZiAoKHN0eWxlICYgU1dULkZVTExfU0VMRUNUSU9OKSAhPSAwKSB7CisJCQkJCQlyZXR1cm4gaXRlbTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJldHVybiBPUy5QdEluUmVjdCAocHQsIHJlY3QpID8gaXRlbSA6IG51bGw7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0xOTYyLDcgKzE5NDksNiBAQAogCiBpbnQgaGl0VGVzdFByb2MgKGludCBicm93c2VyLCBpbnQgaWQsIGludCBwcm9wZXJ0eSwgaW50IHRoZVJlY3QsIGludCBtb3VzZVJlY3QpIHsKIAlsYXN0SGl0dGVzdCA9IGlkOwotCWxhc3RIaXR0ZXN0Q29sdW1uID0gcHJvcGVydHk7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGggYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBiNDdkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLkJyb3dzZXJEZW1vPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0Yjg4YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxNDozMSBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2NGRhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLkJyb3dzZXJEZW1vLmphciA9IHNyYy8KLW91dHB1dC5Ccm93c2VyRGVtby5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotCQkJICAgcGx1Z2luLnByb3BlcnRpZXMsXAotCQkJICAgcGx1Z2luLnhtbCxcCi0JCQkgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEJyb3dzZXJEZW1vLmphcixcCi0gICAgICAgICAgICAgICBjc3MxLyxcCi0gICAgICAgICAgICAgICBjc3MyLyxcCi0gICAgICAgICAgICAgICBjc3MzLyxcCi0gICAgICAgICAgICAgICBjc3M0LyxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazEuanBnIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjlmMzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9iYWNrMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JhY2syLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y2OGRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYmFjazIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9ibGFjay5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2YzFlOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JsYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvYm9hcmQxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNGQ1ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2JvYXJkMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2VtcHR5LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJjZTRkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvZW1wdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9saW5lMS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMGYzNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL2xpbmUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvc3R5bGUuY3NzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzZmYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS9zdHlsZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1ib2R5IHtiYWNrZ3JvdW5kOiB1cmwoLi9iYWNrMi5qcGcpIGZpeGVkOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgxIHt0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgyIHtiYWNrZ3JvdW5kOiB1cmwoLi9saW5lMS5naWYpIG5vLXJlcGVhdCByaWdodCBib3R0b207IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDMge2ZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotDQotdWwge2xpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjowOyBmb250OiAxMnB0IFRpbWVzO30NCi1saS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotDQotLmJvYXJkIHt0ZXh0LWFsaWduOiBjZW50ZXI7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwO30NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6IDMycHg7IHdpZHRoOjMycHg7IHRhYmxlLWxheW91dDogZml4ZWQ7fQ0KLQ0KLS53aGl0ZWxpbmsgYSB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2VtcHR5LmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vZW1wdHkuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9lbXB0eS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6MzJweDsgaGVpZ2h0OjMycHg7fQ0KLQ0KLS53aGl0ZWxpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0OyB3aWR0aDozMnB4OyBoZWlnaHQ6MzJweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjMycHg7IGhlaWdodDozMnB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlLmdpZikgbm8tcmVwZWF0O30NCi0uYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbC5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtmbG9hdDogbGVmdDsgbWFyZ2luOiAxZW0gMWVtOyBib3JkZXI6IDFweCBzb2xpZCBncmF5OyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZS5naWYpIG5vLXJlcGVhdDsgdGV4dC1hbGlnbjogcmlnaHQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6MzJweDt9DQotLnBsYXllcmJsYWNrIHtmbG9hdDogcmlnaHQ7IG1hcmdpbjogMWVtIDFlbTsgYm9yZGVyOiAxcHggc29saWQgZ3JheTsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2suZ2lmKSBuby1yZXBlYXQ7IHRleHQtYWxpZ246IHJpZ2h0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjMycHg7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIGJsdWU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93YWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5N2ZjMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93ZWxjb21lLmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlOTJhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MxL3dlbGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci0JPHRpdGxlPlN0YXJ0IGEgZ2FtZTwvdGl0bGU+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0JPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9zdHlsZS5jc3MiPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+UGF3bnMgR2FtZTwvaDE+Ci08ZGl2IGNsYXNzPSJzdGFydCI+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQxcGxheWVyIj4xIHBsYXllcjwvYT4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDJwbGF5ZXJzIj4yIHBsYXllcnM8L2E+Ci08L2Rpdj4KLTxoMj5Ib3cgdG8gcGxheTwvaDI+Ci1UaGlzIGJvYXJkIGdhbWUgaXMgYSB2YXJpYW50IG9mIFJldmVyc2kgYW5kIFRpYyBUYWMgVG9lLiBFYWNoIG9uZSBvZiB0aGUgdHdvIHBsYXllcnMgc2V0cyBhIHBhd24gb24gYW4gZW1wdHkgY2VsbCBvZiB0aGUgYm9hcmQuCi08aDM+UGF3bnM8L2gzPgotPHVsPgotPGxpIGNsYXNzPSJ3aGl0ZSI+UGxheWVyIDE8L2xpPgotPGxpIGNsYXNzPSJibGFjayI+UGxheWVyIDI8L2xpPgotPGxpIGNsYXNzPSJ3YWxsIj5XYWxsLiBDYW5ub3QgYmUgcmV2ZXJzZWQuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJ0aGVtZSI+Ci1EaWZmZXJlbnQgdGhlbWVzIGFyZSBzdXBwb3J0ZWQuIFRoZW1lIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCBhIENhc2NhZGluZyBTdHlsZSBTaGVldCAoQ1NTKSB0aGF0IGRldGVybWluZXMgaG93IHRoZSBIVE1MIGNvbnRlbnQgaXMgcmVuZGVyZWQgYnkgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4KLTx1bCBjbGFzcz0idGhlbWUiPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMSI+VGhlbWUgMTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMiI+VGhlbWUgMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzMyI+VGhlbWUgMzwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9udGhlbWUvY3NzNCI+VGhlbWUgNDwvYT48L2xpPgotPC91bD4KLQotPC9kaXY+Ci08aDI+SG93IHRvIHdpbjwvaDI+Ci1UaGUgZ2FtZSBlbmRzIHdoZW4gYWxsIGNlbGxzIGFyZSBmaWxsZWQuIFRoZSB3aW5uZXIgaXMgdGhlIG9uZSB3aXRoIG1vc3QgcGF3bnMgb2YgdGhlaXIgY29sb3VyLiAKLQotPGgyPkphdmEgYW5kIEhUTUwgaW50ZWdyYXRlZCB0aHJvdWdoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQ8L2gyPgotPHA+Ci1SZW5kZXJpbmcgaXMgYmFzZWQgb24gSFRNTCBhbmQgQ1NTIHRlY2huaXF1ZXMuIENvbXB1dGVyIG1vdmVzIGFyZSBwcm9ncmFtbWVkIGluIHJlZ3VsYXIKLUphdmEgY29kZSBpbiB0aGUgRWNsaXBzZSBwbHVnLWluLiBUaGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGlzIHVzZWQgZm9yIHJlbmRlcmluZyBhbmQgcmVhY3RpbmcKLXRvIHVzZXIgaW5wdXQuCi08L3A+Ci08aDM+SW1wbGVtZW50YXRpb248L2gzPgotPHA+Ci1UaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzCi1wcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4KLTxicj5UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotPGJyPlBsYXllciBtb3ZlcyBhcmUgY2FwdHVyZWQgYnkgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcjwvY29kZT4uCi1lLmcgdGhlIHBsYXllciBjbGlja3Mgb24gYSBjZWxsIHRoYXQgbWF5IGdlbmVyYXRlIGEgaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotPGNvZGU+aHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTI8L2NvZGU+LiBUaGF0IGh5cGVybGluayBpZGVudGlmaWVzCi10aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgc2VsZWN0ZWQgYnkgdGhlIHBsYXllciAoY29sdW1uIDEsIHJvdyAyKS4gVGhlIG1vdmUgaXMgY29tcGxldGVkIGJ5IGdlbmVyYXRpbmcKLW5ldyBIVE1MIGNvbnRlbnQgYW5kIGludm9raW5nIDxjb2RlPkJyb3dzZXIuc2V0VGV4dDwvY29kZT4gdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczEvd2hpdGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93aGl0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2ZkOTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMS93aGl0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL0JhY2s2NDB4NDQwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvQmFjazY0MHg0NDAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTMzODIxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvQmFjazY0MHg0NDAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9ibGFja19jaGlwLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvYmxhY2tfY2hpcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzZlYmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9ibGFja19jaGlwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvbGluZTEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9saW5lMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTBmMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi9saW5lMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3N0eWxlLmNzcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA3NDljLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotYm9keSB7YmFja2dyb3VuZDogdXJsKC4vQmFjazY0MHg0NDAuZ2lmKSBmaXhlZDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMSB7dGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMiB7YmFja2dyb3VuZDogdXJsKC4vbGluZTEuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgzIHtmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLQ0KLXVsIHtsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46MDsgZm9udDogMTJwdCBUaW1lczt9DQotbGkud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlX2NoaXAuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLWxpLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfY2hpcC5naWYpIG5vLXJlcGVhdDsgcGFkZGluZzogM3B4IDAgMzJweCA2NHB4OyBtYXJnaW46IDA7fQ0KLQ0KLS5ib2FyZCB7dGV4dC1hbGlnbjogbGVmdDt9DQotdGFibGUgeyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBtYXJnaW46IDA7IHBhZGRpbmc6MDsgYmFja2dyb3VuZDogdXJsKC4vdGV4dHVyZV9jZWxscy5naWYpfQ0KLXRyIHt9DQotdGQge2hlaWdodDo0OHB4OyB3aWR0aDo0OHB4OyB0YWJsZS1sYXlvdXQ6IGZpeGVkO30NCi0NCi0ud2hpdGVsaW5rIGEge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5lbXB0eSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0NCi0ud2hpdGVsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9jaGlwLmdpZikgbm8tcmVwZWF0OyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotLmJsYWNrbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vd2hpdGVfY2hpcC5naWYpIG5vLXJlcGVhdDt9DQotLmJsYWNrIHtiYWNrZ3JvdW5kOiB1cmwoLi9ibGFja19jaGlwLmdpZikgbm8tcmVwZWF0O30NCi0ud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9jaGlwLmdpZikgbm8tcmVwZWF0O30NCi0NCi0ucGxheWVyd2hpdGUge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9jaGlwLmdpZikgbm8tcmVwZWF0IHJpZ2h0OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDoxMDBweDsgaGVpZ2h0OjQ4cHg7IGZvbnQ6IDM2cHQgVGltZXMsIHNlcmlmO30NCi0ucGxheWVyYmxhY2sge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAzMDBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vYmxhY2tfY2hpcC5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotDQotLndpbm5lciB7Ym9yZGVyOiA0cHggc29saWQgd2hpdGU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3RleHR1cmVfY2VsbHMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi90ZXh0dXJlX2NlbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZWU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3RleHR1cmVfY2VsbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93YWxsX2NoaXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93YWxsX2NoaXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYwYjMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2FsbF9jaGlwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczIvd2VsY29tZS5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93ZWxjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTkyYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93ZWxjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TdGFydCBhIGdhbWU8L3RpdGxlPgotCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGUuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxPlBhd25zIEdhbWU8L2gxPgotPGRpdiBjbGFzcz0ic3RhcnQiPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MXBsYXllciI+MSBwbGF5ZXI8L2E+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQycGxheWVycyI+MiBwbGF5ZXJzPC9hPgotPC9kaXY+Ci08aDI+SG93IHRvIHBsYXk8L2gyPgotVGhpcyBib2FyZCBnYW1lIGlzIGEgdmFyaWFudCBvZiBSZXZlcnNpIGFuZCBUaWMgVGFjIFRvZS4gRWFjaCBvbmUgb2YgdGhlIHR3byBwbGF5ZXJzIHNldHMgYSBwYXduIG9uIGFuIGVtcHR5IGNlbGwgb2YgdGhlIGJvYXJkLgotPGgzPlBhd25zPC9oMz4KLTx1bD4KLTxsaSBjbGFzcz0id2hpdGUiPlBsYXllciAxPC9saT4KLTxsaSBjbGFzcz0iYmxhY2siPlBsYXllciAyPC9saT4KLTxsaSBjbGFzcz0id2FsbCI+V2FsbC4gQ2Fubm90IGJlIHJldmVyc2VkLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0idGhlbWUiPgotRGlmZmVyZW50IHRoZW1lcyBhcmUgc3VwcG9ydGVkLiBUaGVtZSBpcyBjb25maWd1cmVkIHRocm91Z2ggYSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgKENTUykgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgSFRNTCBjb250ZW50IGlzIHJlbmRlcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuCi08dWwgY2xhc3M9InRoZW1lIj4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczEiPlRoZW1lIDE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczIiPlRoZW1lIDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczMiPlRoZW1lIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczQiPlRoZW1lIDQ8L2E+PC9saT4KLTwvdWw+Ci0KLTwvZGl2PgotPGgyPkhvdyB0byB3aW48L2gyPgotVGhlIGdhbWUgZW5kcyB3aGVuIGFsbCBjZWxscyBhcmUgZmlsbGVkLiBUaGUgd2lubmVyIGlzIHRoZSBvbmUgd2l0aCBtb3N0IHBhd25zIG9mIHRoZWlyIGNvbG91ci4gCi0KLTxoMj5KYXZhIGFuZCBIVE1MIGludGVncmF0ZWQgdGhyb3VnaCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0PC9oMj4KLTxwPgotUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBDb21wdXRlciBtb3ZlcyBhcmUgcHJvZ3JhbW1lZCBpbiByZWd1bGFyCi1KYXZhIGNvZGUgaW4gdGhlIEVjbGlwc2UgcGx1Zy1pbi4gVGhlIFNXVCBCcm93c2VyIHdpZGdldCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYW5kIHJlYWN0aW5nCi10byB1c2VyIGlucHV0LgotPC9wPgotPGgzPkltcGxlbWVudGF0aW9uPC9oMz4KLTxwPgotVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi08YnI+VGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLTxicj5QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLTxjb2RlPmh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyPC9jb2RlPi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIgKGNvbHVtbiAxLCByb3cgMikuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3doaXRlX2NoaXAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMi93aGl0ZV9jaGlwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2ZDY1OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MyL3doaXRlX2NoaXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9CYWNrNjQweDQ0MC5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL0JhY2s2NDB4NDQwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzgyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL0JhY2s2NDB4NDQwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvYmxhY2tfcGF3bi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2JsYWNrX3Bhd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTFhNDFkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvYmxhY2tfcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL2xpbmUxLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvbGluZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWEwZjM0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvbGluZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy9zdHlsZS5jc3MgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3N0eWxlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkZjA0ZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3N0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWJvZHkge2JhY2tncm91bmQ6IHVybCguL0JhY2s2NDB4NDQwLmdpZikgZml4ZWQ7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDEge3RleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNHB0OyBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHYsIEhlbHZldGljYSwgc2Fucy1zZXJpZjt9DQotaDIge2JhY2tncm91bmQ6IHVybCguL2xpbmUxLmdpZikgbm8tcmVwZWF0IHJpZ2h0IGJvdHRvbTsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMyB7Zm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi0NCi11bCB7bGlzdC1zdHlsZTogbm9uZTsgcGFkZGluZzogMDsgbWFyZ2luOjA7IGZvbnQ6IDEycHQgVGltZXM7fQ0KLWxpLndoaXRlIHtiYWNrZ3JvdW5kOiB1cmwoLi93aGl0ZV9wYXduLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkuYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi1saS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi0NCi0uYm9hcmQge3RleHQtYWxpZ246IGxlZnQ7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwOyBwYWRkaW5nOjA7IGJhY2tncm91bmQ6IHVybCguL3RleHR1cmVfY2VsbHMuZ2lmKX0NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6NDhweDsgd2lkdGg6NDhweDsgdGFibGUtbGF5b3V0OiBmaXhlZDt9DQotDQotLndoaXRlbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotDQotLndoaXRlbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGVfcGF3bi5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYTpob3ZlciB7ZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0ud2hpdGUge2JhY2tncm91bmQ6IHVybCguL3doaXRlX3Bhd24uZ2lmKSBuby1yZXBlYXQ7fQ0KLS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vYmxhY2tfcGF3bi5naWYpIG5vLXJlcGVhdDt9DQotLndhbGwge2JhY2tncm91bmQ6IHVybCguL3dhbGxfcGF3bi5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vd2hpdGVfcGF3bi5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotLnBsYXllcmJsYWNrIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMzAwcHg7IHJpZ2h0OjEwcHg7IG1hcmdpbjogMWVtIDEwcHg7IGJvcmRlcjogM3B4IHNvbGlkIGJsdWU7IGJhY2tncm91bmQ6IHVybCguL2JsYWNrX3Bhd24uZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLQ0KLS53aW5uZXIge2JvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBmb250OiBib2xkIDE2cHQgVGltZXMsIHNlcmlmO30NCi0ubG9zZXIge2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBmb250OiAxMnB0IFRpbWVzLCBzZXJpZjt9DQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy90ZXh0dXJlX2NlbGxzLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvdGV4dHVyZV9jZWxscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZmVlOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy90ZXh0dXJlX2NlbGxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2FsbF9wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2FsbF9wYXduLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1Y2Q1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dhbGxfcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3MzL3dlbGNvbWUuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2VsY29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5MmEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2VsY29tZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLQk8dGl0bGU+U3RhcnQgYSBnYW1lPC90aXRsZT4KLQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlLmNzcyI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5QYXducyBHYW1lPC9oMT4KLTxkaXYgY2xhc3M9InN0YXJ0Ij4KLTxhIGNsYXNzPSJzdGFydCIgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb25zdGFydDFwbGF5ZXIiPjEgcGxheWVyPC9hPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MnBsYXllcnMiPjIgcGxheWVyczwvYT4KLTwvZGl2PgotPGgyPkhvdyB0byBwbGF5PC9oMj4KLVRoaXMgYm9hcmQgZ2FtZSBpcyBhIHZhcmlhbnQgb2YgUmV2ZXJzaSBhbmQgVGljIFRhYyBUb2UuIEVhY2ggb25lIG9mIHRoZSB0d28gcGxheWVycyBzZXRzIGEgcGF3biBvbiBhbiBlbXB0eSBjZWxsIG9mIHRoZSBib2FyZC4KLTxoMz5QYXduczwvaDM+Ci08dWw+Ci08bGkgY2xhc3M9IndoaXRlIj5QbGF5ZXIgMTwvbGk+Ci08bGkgY2xhc3M9ImJsYWNrIj5QbGF5ZXIgMjwvbGk+Ci08bGkgY2xhc3M9IndhbGwiPldhbGwuIENhbm5vdCBiZSByZXZlcnNlZC48L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InRoZW1lIj4KLURpZmZlcmVudCB0aGVtZXMgYXJlIHN1cHBvcnRlZC4gVGhlbWUgaXMgY29uZmlndXJlZCB0aHJvdWdoIGEgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IChDU1MpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIEhUTUwgY29udGVudCBpcyByZW5kZXJlZCBieSB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LgotPHVsIGNsYXNzPSJ0aGVtZSI+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MxIj5UaGVtZSAxPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MyIj5UaGVtZSAyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3MzIj5UaGVtZSAzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5wYXducy9hY3Rpb250aGVtZS9jc3M0Ij5UaGVtZSA0PC9hPjwvbGk+Ci08L3VsPgotCi08L2Rpdj4KLTxoMj5Ib3cgdG8gd2luPC9oMj4KLVRoZSBnYW1lIGVuZHMgd2hlbiBhbGwgY2VsbHMgYXJlIGZpbGxlZC4gVGhlIHdpbm5lciBpcyB0aGUgb25lIHdpdGggbW9zdCBwYXducyBvZiB0aGVpciBjb2xvdXIuIAotCi08aDI+SmF2YSBhbmQgSFRNTCBpbnRlZ3JhdGVkIHRocm91Z2ggdGhlIFNXVCBCcm93c2VyIHdpZGdldDwvaDI+Ci08cD4KLVJlbmRlcmluZyBpcyBiYXNlZCBvbiBIVE1MIGFuZCBDU1MgdGVjaG5pcXVlcy4gQ29tcHV0ZXIgbW92ZXMgYXJlIHByb2dyYW1tZWQgaW4gcmVndWxhcgotSmF2YSBjb2RlIGluIHRoZSBFY2xpcHNlIHBsdWctaW4uIFRoZSBTV1QgQnJvd3NlciB3aWRnZXQgaXMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuZCByZWFjdGluZwotdG8gdXNlciBpbnB1dC4KLTwvcD4KLTxoMz5JbXBsZW1lbnRhdGlvbjwvaDM+Ci08cD4KLVRoZSBib2FyZCBpcyBhIHRhYmxlIGZpbGxlZCB3aXRoIGh5cGVybGlua3MuIENhc2NhZGluZyBTdHlsZSBTaGVldHMKLXByb3ZpZGUgdmFyaW91cyB0aGVtZXMgYW5kIGNvbnRyb2wgdGhlIHRhYmxlIGFlc3RoZXRpYyBhcHBlYXJhbmNlLgotPGJyPlRoZSBBUEkgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3Nlci5zZXRUZXh0KGphdmEubGFuZy5TdHJpbmcpPC9jb2RlPiBkcmF3cwotdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuCi08YnI+UGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYSBoeXBlcmxpbmsgd2l0aCBhIFVSTCBzaW1pbGFyIHRvCi08Y29kZT5odHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3h4MXl5MjwvY29kZT4uIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyIChjb2x1bW4gMSwgcm93IDIpLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93aGl0ZV9wYXduLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczMvd2hpdGVfcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjVlNTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzMy93aGl0ZV9wYXduLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvQmFjazY0MHg0NDAuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9CYWNrNjQweDQ0MC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzM4MjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9CYWNrNjQweDQ0MC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2JsdWVfcGVvcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvYmx1ZV9wZW9wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEwYzU1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvYmx1ZV9wZW9wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9nb2xkX3Blb3BsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2dvbGRfcGVvcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MDkwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L2dvbGRfcGVvcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvbGluZTEuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9saW5lMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTBmMzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC9saW5lMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3N0eWxlLmNzcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTViMDk2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvc3R5bGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotYm9keSB7YmFja2dyb3VuZDogdXJsKC4vQmFjazY0MHg0NDAuZ2lmKSBmaXhlZDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTpWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMSB7dGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO30NCi1oMiB7YmFja2dyb3VuZDogdXJsKC4vbGluZTEuZ2lmKSBuby1yZXBlYXQgcmlnaHQgYm90dG9tOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLWgzIHtmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OlZlcmRhbmEsIEFyaWFsLCBIZWx2LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7fQ0KLQ0KLXVsIHtsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46MDsgZm9udDogMTJwdCBUaW1lczt9DQotbGkud2hpdGUge2JhY2tncm91bmQ6IHVybCguL2JsdWVfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkuYmxhY2sge2JhY2tncm91bmQ6IHVybCguL2dvbGRfcGVvcGxlLmdpZikgbm8tcmVwZWF0OyBwYWRkaW5nOiAzcHggMCAzMnB4IDY0cHg7IG1hcmdpbjogMDt9DQotbGkud2FsbCB7YmFja2dyb3VuZDogdXJsKC4vd2FsbF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHBhZGRpbmc6IDNweCAwIDMycHggNjRweDsgbWFyZ2luOiAwO30NCi0NCi0uYm9hcmQge3RleHQtYWxpZ246IGxlZnQ7fQ0KLXRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgbWFyZ2luOiAwOyBwYWRkaW5nOjA7IGJhY2tncm91bmQ6IHVybCguL3RleHR1cmVfY2VsbHMuZ2lmKX0NCi10ciB7fQ0KLXRkIHtoZWlnaHQ6NDhweDsgd2lkdGg6NDhweDsgdGFibGUtbGF5b3V0OiBmaXhlZDt9DQotDQotLndoaXRlbGluayBhIHtkaXNwbGF5OiBibG9jazsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS5ibGFja2xpbmsgYSB7ZGlzcGxheTogYmxvY2s7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uZW1wdHkge2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDo0OHB4OyBoZWlnaHQ6NDhweDt9DQotDQotLndoaXRlbGluayBhOmhvdmVyIHtkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7IHdpZHRoOjQ4cHg7IGhlaWdodDo0OHB4O30NCi0uYmxhY2tsaW5rIGE6aG92ZXIge2Rpc3BsYXk6IGJsb2NrOyBiYWNrZ3JvdW5kOiB1cmwoLi9nb2xkX3Blb3BsZS5naWYpIG5vLXJlcGVhdDsgd2lkdGg6NDhweDsgaGVpZ2h0OjQ4cHg7fQ0KLS53aGl0ZSB7YmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7fQ0KLS5ibGFjayB7YmFja2dyb3VuZDogdXJsKC4vZ29sZF9wZW9wbGUuZ2lmKSBuby1yZXBlYXQ7fQ0KLS53YWxsIHtiYWNrZ3JvdW5kOiB1cmwoLi93YWxsX3Blb3BsZS5naWYpIG5vLXJlcGVhdDt9DQotDQotLnBsYXllcndoaXRlIHtwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTBweDsgcmlnaHQ6MTBweDsgbWFyZ2luOiAxZW0gMTBweDsgYm9yZGVyOiAzcHggc29saWQgYmx1ZTsgYmFja2dyb3VuZDogdXJsKC4vYmx1ZV9wZW9wbGUuZ2lmKSBuby1yZXBlYXQgcmlnaHQ7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOjEwMHB4OyBoZWlnaHQ6NDhweDsgZm9udDogMzZwdCBUaW1lcywgc2VyaWY7fQ0KLS5wbGF5ZXJibGFjayB7cG9zaXRpb246IGFic29sdXRlOyB0b3A6IDMwMHB4OyByaWdodDoxMHB4OyBtYXJnaW46IDFlbSAxMHB4OyBib3JkZXI6IDNweCBzb2xpZCBibHVlOyBiYWNrZ3JvdW5kOiB1cmwoLi9nb2xkX3Blb3BsZS5naWYpIG5vLXJlcGVhdCByaWdodDsgdGV4dC1hbGlnbjogbGVmdDsgd2lkdGg6MTAwcHg7IGhlaWdodDo0OHB4OyBmb250OiAzNnB0IFRpbWVzLCBzZXJpZjt9DQotDQotLndpbm5lciB7Ym9yZGVyOiA0cHggc29saWQgd2hpdGU7IGZvbnQ6IGJvbGQgMTZwdCBUaW1lcywgc2VyaWY7fQ0KLS5sb3NlciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQ6IDEycHQgVGltZXMsIHNlcmlmO30NCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3RleHR1cmVfY2VsbHMuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC90ZXh0dXJlX2NlbGxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmZWU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3RleHR1cmVfY2VsbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93YWxsX3Blb3BsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dhbGxfcGVvcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxNmM4MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9jc3M0L3dhbGxfcGVvcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2NzczQvd2VsY29tZS5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93ZWxjb21lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTkyYTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvY3NzNC93ZWxjb21lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT5TdGFydCBhIGdhbWU8L3RpdGxlPgotCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3R5bGUuY3NzIj4KLTwvaGVhZD4KLTxib2R5PgotPGgxPlBhd25zIEdhbWU8L2gxPgotPGRpdiBjbGFzcz0ic3RhcnQiPgotPGEgY2xhc3M9InN0YXJ0IiBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnN0YXJ0MXBsYXllciI+MSBwbGF5ZXI8L2E+Ci08YSBjbGFzcz0ic3RhcnQiIGhyZWY9Imh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MucGF3bnMvYWN0aW9uc3RhcnQycGxheWVycyI+MiBwbGF5ZXJzPC9hPgotPC9kaXY+Ci08aDI+SG93IHRvIHBsYXk8L2gyPgotVGhpcyBib2FyZCBnYW1lIGlzIGEgdmFyaWFudCBvZiBSZXZlcnNpIGFuZCBUaWMgVGFjIFRvZS4gRWFjaCBvbmUgb2YgdGhlIHR3byBwbGF5ZXJzIHNldHMgYSBwYXduIG9uIGFuIGVtcHR5IGNlbGwgb2YgdGhlIGJvYXJkLgotPGgzPlBhd25zPC9oMz4KLTx1bD4KLTxsaSBjbGFzcz0id2hpdGUiPlBsYXllciAxPC9saT4KLTxsaSBjbGFzcz0iYmxhY2siPlBsYXllciAyPC9saT4KLTxsaSBjbGFzcz0id2FsbCI+V2FsbC4gQ2Fubm90IGJlIHJldmVyc2VkLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0idGhlbWUiPgotRGlmZmVyZW50IHRoZW1lcyBhcmUgc3VwcG9ydGVkLiBUaGVtZSBpcyBjb25maWd1cmVkIHRocm91Z2ggYSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgKENTUykgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgSFRNTCBjb250ZW50IGlzIHJlbmRlcmVkIGJ5IHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuCi08dWwgY2xhc3M9InRoZW1lIj4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczEiPlRoZW1lIDE8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczIiPlRoZW1lIDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczMiPlRoZW1lIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zL2FjdGlvbnRoZW1lL2NzczQiPlRoZW1lIDQ8L2E+PC9saT4KLTwvdWw+Ci0KLTwvZGl2PgotPGgyPkhvdyB0byB3aW48L2gyPgotVGhlIGdhbWUgZW5kcyB3aGVuIGFsbCBjZWxscyBhcmUgZmlsbGVkLiBUaGUgd2lubmVyIGlzIHRoZSBvbmUgd2l0aCBtb3N0IHBhd25zIG9mIHRoZWlyIGNvbG91ci4gCi0KLTxoMj5KYXZhIGFuZCBIVE1MIGludGVncmF0ZWQgdGhyb3VnaCB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0PC9oMj4KLTxwPgotUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBDb21wdXRlciBtb3ZlcyBhcmUgcHJvZ3JhbW1lZCBpbiByZWd1bGFyCi1KYXZhIGNvZGUgaW4gdGhlIEVjbGlwc2UgcGx1Zy1pbi4gVGhlIFNXVCBCcm93c2VyIHdpZGdldCBpcyB1c2VkIGZvciByZW5kZXJpbmcgYW5kIHJlYWN0aW5nCi10byB1c2VyIGlucHV0LgotPC9wPgotPGgzPkltcGxlbWVudGF0aW9uPC9oMz4KLTxwPgotVGhlIGJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi08YnI+VGhlIEFQSSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZyk8L2NvZGU+IGRyYXdzCi10aGUgYm9hcmQgZ2FtZSBmcm9tIEhUTUwgZ2VuZXJhdGVkIGluIG1lbW9yeS4KLTxicj5QbGF5ZXIgbW92ZXMgYXJlIGNhcHR1cmVkIGJ5IGltcGxlbWVudGluZyB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uTGlzdGVuZXI8L2NvZGU+LgotZS5nIHRoZSBwbGF5ZXIgY2xpY2tzIG9uIGEgY2VsbCB0aGF0IG1heSBnZW5lcmF0ZSBhIGh5cGVybGluayB3aXRoIGEgVVJMIHNpbWlsYXIgdG8KLTxjb2RlPmh0dHA6Ly93d3cub3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MveHgxeXkyPC9jb2RlPi4gVGhhdCBoeXBlcmxpbmsgaWRlbnRpZmllcwotdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIgKGNvbHVtbiAxLCByb3cgMikuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nCi1uZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyA8Y29kZT5Ccm93c2VyLnNldFRleHQ8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgYm9hcmQgZ2FtZS4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9kZW1vc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZGVtb3NfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5NzViMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9kZW1vc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEJyb3dzZXIgRGVtb3M8L2gyPgotCi08cD4KLVRoZSBCcm93c2VyIERlbW9zIGRlbW9uc3RyYXRlIHZhcmlvdXMgZmVhdHVyZXMgb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gCi08L3A+PHA+VGhlIFBhd25zIEdhbWUgaXMgYSBib2FyZCBnYW1lIHRoYXQgY2FuIGJlIHBsYXllZCBhZ2FpbnN0IHRoZSBjb21wdXRlcgotb3IgYWdhaW5zdCBhbm90aGVyIHBsYXllci4gUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBUaGUKLWJvYXJkIGlzIGEgdGFibGUgZmlsbGVkIHdpdGggaHlwZXJsaW5rcy4gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cwotcHJvdmlkZSB2YXJpb3VzIHRoZW1lcyBhbmQgY29udHJvbCB0aGUgdGFibGUgYWVzdGhldGljIGFwcGVhcmFuY2UuCi1UaGUgQVBJIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXIuc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKTwvY29kZT4gZHJhd3MKLXRoZSBib2FyZCBnYW1lIGZyb20gSFRNTCBnZW5lcmF0ZWQgaW4gbWVtb3J5LgotUGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyPC9jb2RlPi4KLWUuZyB0aGUgcGxheWVyIGNsaWNrcyBvbiBhIGNlbGwgdGhhdCBtYXkgZ2VuZXJhdGUgYW4gaHlwZXJsaW5rIHdpdGggYSBVUkwgc2ltaWxhciB0bwotaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTIuIFRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMKLXRoZSBwb3NpdGlvbiBvZiB0aGUgY2VsbCBzZWxlY3RlZCBieSB0aGUgcGxheWVyLiBUaGUgbW92ZSBpcyBjb21wbGV0ZWQgYnkgZ2VuZXJhdGluZwotbmV3IEhUTUwgY29udGVudCBhbmQgaW52b2tpbmcgPGNvZGU+QnJvd3Nlci5zZXRUZXh0PC9jb2RlPiB0byB1cGRhdGUgdGhlIGJvYXJkIGdhbWUuCi08L3A+Ci0KLTxoMz5SdW5uaW5nIHRoZSBleGFtcGxlPC9oMz4KLTxwPgotRm9sbG93IHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMvZG9jLWh0bWwvc3d0X21hbnVhbF9zZXR1cC5odG1sIj5TV1Qgc3RhbmRhbG9uZSBleGFtcGxlcyBzZXR1cDwvYT4gCi1pbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBleGFtcGxlIGZyb20geW91ciB3b3Jrc3BhY2UuCi08L3A+Ci08cD4KLVRoZSAiTWFpbiIgY2xhc3MgaXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW9WaWV3PC9jb2RlPi4KLTwvcD4KLTxwPgotVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIHJ1biB1c2luZyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIj5FeGFtcGxlIExhdW5jaGVyPC9hPi4KLVNlbGVjdCB0aGUgPHN0cm9uZz5Ccm93c2VyIERlbW88L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL2ljb25zL3Bhd24uZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTFmOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvaWNvbnMvcGF3bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmEwZmVhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RCcm93c2VyRGVtb3MubmFtZSA9IFNXVCBCcm93c2VyIERlbW9zIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5Ccm93c2VyRGVtb3MubmFtZSA9IEJyb3dzZXIgRGVtbwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5uYW1lID0gQnJvd3NlciBEZW1vCi1sYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgdG8gdXNlIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQgZm9yIEhUTUwgcmVuZGVyaW5nLlxuXG5cCi0JVGhlIFBhd25zIEdhbWUgaXMgYSBib2FyZCBnYW1lIHRoYXQgY2FuIGJlIHBsYXllZCBhZ2FpbnN0IHRoZSBjb21wdXRlciBvciBhZ2FpbnN0IGFub3RoZXIgcGxheWVyLlxuXG5cCi0JUmVuZGVyaW5nIGlzIGJhc2VkIG9uIEhUTUwgYW5kIENTUyB0ZWNobmlxdWVzLiBUaGUgYm9hcmQgaXMgYSB0YWJsZSBmaWxsZWQgd2l0aCBoeXBlcmxpbmtzLiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIFwKLQlwcm92aWRlIHZhcmlvdXMgdGhlbWVzIGFuZCBjb250cm9sIHRoZSB0YWJsZSBhZXN0aGV0aWMgYXBwZWFyYW5jZS4gXG5cCi0JVGhlIEFQSSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyLnNldFRleHQoamF2YS5sYW5nLlN0cmluZykgZHJhd3MgdGhlIGJvYXJkIGdhbWUgZnJvbSBIVE1MIGdlbmVyYXRlZCBpbiBtZW1vcnkuXG5cCi0JUGxheWVyIG1vdmVzIGFyZSBjYXB0dXJlZCBieSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkxpc3RlbmVyLiBlLmcgdGhlIHBsYXllciBjbGlja3MgXAotCW9uIGEgY2VsbCB0aGF0IGRlZmluZXMgYW4gaHlwZXJsaW5rIHdpdGggYSBVUkwgaHR0cDovL3d3dy5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy94eDF5eTIuXAotCVRoYXQgaHlwZXJsaW5rIGlkZW50aWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjZWxsIHNlbGVjdGVkIGJ5IHRoZSBwbGF5ZXIuIFRoZSBtb3ZlIGlzIGNvbXBsZXRlZCBieSBnZW5lcmF0aW5nIFwKLQluZXcgSFRNTCBjb250ZW50IGFuZCBpbnZva2luZyBCcm93c2VyLnNldFRleHQgdG8gdXBkYXRlIHRoZSBib2FyZCBnYW1lLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDU4ZGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MiCi0gICBuYW1lPSIlcGx1Z2luLlNXVEJyb3dzZXJEZW1vcy5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJCcm93c2VyRGVtby5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXZpZXcuQnJvd3NlckRlbW9zLm5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3MuQnJvd3NlckRlbW8iPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9wYXduLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJCcm93c2VyIERlbW8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3MuQnJvd3NlckRlbW9WaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkJyb3dzZXJEZW1vcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmRlbW9zLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy52aWV3cy5Ccm93c2VyRGVtb1ZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9Ccm93c2VyRGVtb1BsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2RiZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL0Jyb3dzZXJEZW1vUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJEZW1vUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzZXJEZW1vUGx1Z2luIHBsdWdpbjsKLQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQTFVHSU5fUEFUSCA9IG51bGw7Ci0JCi0JcHVibGljIEJyb3dzZXJEZW1vUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLkJyb3dzZXJEZW1vUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJUExVR0lOX1BBVEggPSBQbGF0Zm9ybS5yZXNvbHZlKHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLiIpKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyb3dzZXJEZW1vUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBCcm93c2VyRGVtb1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3MvUGF3bnMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTJlZjcwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy9QYXducy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vczsKLQotcHVibGljIGNsYXNzIFBhd25zIHsKLQotCS8qIEN1cnJlbnQgYm9hcmQgcmVwcmVzZW50YXRpb24gaW4gY29tcGFjdGVkIGZvcm0gKi8KLQlieXRlW10gZ2FtZSA9IG5ldyBieXRlWzY0XTsKLQkvKiBCZXN0IG1vdmUgKi8KLQlpbnQgYmVzdEluZGV4ID0gLTE7Ci0JLyogUmVsYXRlZCBiZXN0IHNjb3JlICovCi0JaW50IGJlc3RTY29yZSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCS8qIEVzdGltYXRlZCBzdHJhdGVnaWMgdmFsdWUgb2YgZWFjaCBjZWxsIGJhc2VkIG9uIHByb3hpbWl0eSB0byB3YWxscyAqLwotCXN0YXRpYyBpbnRbXSBnYW1lV2FsbFdlaWdodCA9IG5ldyBpbnRbNjRdOwotCVRocmVhZCB0aHJlYWQgPSBudWxsOwotCWJvb2xlYW4gdGhyZWFkU3RvcCA9IGZhbHNlOwotCQotCWZpbmFsIHN0YXRpYyBieXRlIEVNUFRZID0gMDsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXSElURSA9IDE7Ci0JZmluYWwgc3RhdGljIGJ5dGUgQkxBQ0sgPSAyOwotCWZpbmFsIHN0YXRpYyBieXRlIFdBTEwgPSAzOwotCQotcHVibGljIFBhd25zKCkgewotfQotCi0vKiBQcm92aWRlIHRoZSBjdXJyZW50IGdhbWUgYW5kIGlnbml0aWF0ZSB0aGUgc2VhcmNoIG9mIHRoZSBiZXN0IG1vdmUgZm9yIHRoZSBnaXZlbiB0eXBlCi0gKiBNdXN0IHJldHVybiBpbW1lZGlhdGVseSBhcyBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQuCi0gKiBUaGUgVUkgdGhyZWFkIHdpbGwgZmV0Y2ggdGhlIGJlc3QgbW92ZSBhbnkgdGltZSB0aGVyZWFmdGVyLgotICovCi1wdWJsaWMgdm9pZCBwbGF5UmVxdWVzdChieXRlW11bXSBnYW1lLCBpbnQgdHlwZSkgewotCXRocmVhZFN0b3AgPSB0cnVlOwotCXN5bmNocm9uaXplZCAodGhpcykgewotCQliZXN0SW5kZXggPSAtMTsKLQkJYmVzdFNjb3JlID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0JCWNvbnZlcnQoZ2FtZSwgdGhpcy5nYW1lKTsKLQkJaW5pdFBhd25Cb3JkZXJzKHRoaXMuZ2FtZSwgZ2FtZVdhbGxXZWlnaHQpOwotCQkvKiBRdWlja2x5IGNvbXB1dGUgYSBsZWdhbCBtb3ZlICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5nYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5nYW1lW2ldID09IEVNUFRZKSB7Ci0JCQkJYmVzdEluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN5bmNocm9uaXplZChQYXducy50aGlzKSB7Ci0JCQkJCXRocmVhZFN0b3AgPSBmYWxzZTsKLQkJCQkJaW50W10gcmVzdWx0ID0gbmV3IGludFsyXTsKLQkJCQkJLyogaWYgbG9uZyB0aW1lLCBtdXN0IGNoZWNrIGZvciB0aHJlYWRTdG9wIGFuZCBleGl0IGVhcmx5ICovIAotCQkJCQlldmFsQmVzdChQYXducy50aGlzLmdhbWUsIEJMQUNLLCAyLCByZXN1bHQpOwotCQkJCQliZXN0SW5kZXggPSByZXN1bHRbMF07Ci0JCQkJCWJlc3RTY29yZSA9IHJlc3VsdFsxXTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQl9Ci19Ci0KLS8qIEZldGNoIGJlc3QgbW92ZSBpbiBuYXR1cmFsIGNvb3JkaW5hdGVzIGZvciB0aGUgYm9hcmQgcHJldmlvdXNseSBnaXZlbiBpbgotICogdGhlIGNhbGwgdG8gcGxheVJlcXVlc3QuCi0gKi8KLXB1YmxpYyB2b2lkIGdldEJlc3RNb3ZlKGludFtdIHBvaW50KSB7Ci0JY29udmVydChiZXN0SW5kZXgsIHBvaW50KTsKLQl0aHJlYWRTdG9wID0gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYW4gZXhwYW5kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJvYXJkLCBmb3JtYXQgaW50ZXJuYWwgY29tcGFjdCBtb2RlICovCi1zdGF0aWMgdm9pZCBjb252ZXJ0KGJ5dGVbXVtdIGJvYXJkLCBieXRlW10gZykgewotCWZvciAoaW50IGkgPSAwOyBpIDwgYm9hcmQubGVuZ3RoOyBpKyspIFN5c3RlbS5hcnJheWNvcHkoYm9hcmRbaV0sIDAsIGcsIGkgKiA4LCA4KTsKLX0KLS8qIFVwZGF0ZSBnaXZlbiBjb21wYWN0IG1vZGVsIGJhc2VkIG9uIHBsYXllciBtb3ZlIGluIG5hdHVyYWwgY29vcmRpbmF0ZXMgKi8KLXN0YXRpYyB2b2lkIHNldChieXRlW10gZywgaW50IHgsIGludCB5LCBieXRlIHR5cGUpIHsKLQlnW3gqOCt5XSA9IHR5cGU7Ci19Ci0vKiBHaXZlbiBhbiBpbmRleCBpbiBjb21wYWN0IHJlcHJlc2VudGF0aW9uLCByZXR1cm4gbmF0dXJhbCBjb29yZGluYXRlcyAqLwotc3RhdGljIHZvaWQgY29udmVydChpbnQgaW5kZXgsIC8qb3V0IFswXSB4IFsxXSB5ICovaW50W10gcG9pbnQpIHsKLQlwb2ludFswXSA9IGluZGV4IC8gODsKLQlwb2ludFsxXSA9IGluZGV4ICUgODsKLX0KLS8qIEdpdmVuIGFuIGluZGV4IGludG8gdGhlIGNvbXBhY3QgbW9kZWwgYW5kIHRoZSBuZWlnaGJvdXIgY29kZSwKLSAqIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgbmVpZ2hib3VyIGluZGV4LgotICogUmV0dXJucyAtMSBpZiB0aGVyZSBpcyBubyBuZWlnaGJvdXIuCi0gKiAKLSAqIE5laWdoYm91ciBjb2RlIGZvciB0aGUgaW5kZXggWAotICogMCAxIDIKLSAqIDMgWCA0Ci0gKiA1IDYgNyAKLSAqLwotc3RhdGljIGludCBnZXROZWlnaGJvdXJJbmRleChieXRlW10gZywgaW50IGluZGV4LCBpbnQgbmVpZ2hib3VyKSB7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBnLmxlbmd0aCkgcmV0dXJuIC0xOwotCWludCByZXN1bHQgPSAtMTsKLQlzd2l0Y2ggKG5laWdoYm91cikgewotCQljYXNlIDA6IHJlc3VsdCA9IGluZGV4IDwgOCB8fCBpbmRleCAlIDggPT0gMCA/IC0xIDogaW5kZXggLSA5OyBicmVhazsKLQkJY2FzZSAxOiByZXN1bHQgPSBpbmRleCA8IDggPyAtMSA6IGluZGV4IC0gODsgYnJlYWs7Ci0JCWNhc2UgMjogcmVzdWx0ID0gaW5kZXggPCA4IHx8IGluZGV4ICUgOCA9PSA3ID8gLTEgOiBpbmRleCAtIDc7IGJyZWFrOwotCQljYXNlIDM6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSAwID8gLTEgOiBpbmRleCAtIDE7IGJyZWFrOwotCQljYXNlIDQ6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSA3ID8gLTEgOiBpbmRleCArIDE7IGJyZWFrOwotCQljYXNlIDU6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSAwIHx8IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDc7IGJyZWFrOwotCQljYXNlIDY6IHJlc3VsdCA9IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDg7IGJyZWFrOwotCQljYXNlIDc6IHJlc3VsdCA9IGluZGV4ICUgOCA9PSA3IHx8IGluZGV4ID49IDU2ID8gLTEgOiBpbmRleCArIDk7IGJyZWFrOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotLyogTWFrZSB0aGUgcGxheWVyIHR5cGUgcGxheSBhdCBpbmRleCBvbiBnaXZlbiBjb21wYWN0IGJvYXJkIAotICogQ29tcHV0ZSBhbGwgcGF3bnMgdGhhdCBtdXN0IGJlIHJldmVyc2VkLgotICovCi1zdGF0aWMgdm9pZCBwbGF5KGJ5dGVbXSBnLCBpbnQgaW5kZXgsIGJ5dGUgdHlwZSkgewotCWJ5dGUgb3Bwb25lbnRUeXBlID0gdHlwZSA9PSBXSElURSA/IEJMQUNLIDogV0hJVEU7Ci0JZm9yIChpbnQgbmVpZ2hib3VyID0gMDsgbmVpZ2hib3VyIDw9IDc7IG5laWdoYm91cisrKSB7Ci0JCWludCBuSW5kZXggPSBnZXROZWlnaGJvdXJJbmRleChnLCBpbmRleCwgbmVpZ2hib3VyKTsKLQkJaW50W10gcmV2ZXJzaUluZGVjZXMgPSBuZXcgaW50WzZdOwotCQlpbnQgblJldmVyc2kgPSAwOwotCQl3aGlsZSAobkluZGV4ICE9IC0xICYmIG5SZXZlcnNpIDwgNiAmJiBnW25JbmRleF0gPT0gb3Bwb25lbnRUeXBlKSB7Ci0JCQlyZXZlcnNpSW5kZWNlc1tuUmV2ZXJzaV0gPSBuSW5kZXg7Ci0JCQluUmV2ZXJzaSsrOwotCQkJbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgbkluZGV4LCBuZWlnaGJvdXIpOwkJCQotCQl9Ci0JCWlmIChuUmV2ZXJzaSA+IDAgJiYgbkluZGV4ICE9IC0xICYmIGdbbkluZGV4XSA9PSB0eXBlKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZXZlcnNpOyBpKyspIGdbcmV2ZXJzaUluZGVjZXNbaV1dID0gdHlwZTsKLQkJfQotCX0KLQlnW2luZGV4XSA9IHR5cGU7Ci19Ci0vKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gY29tcGFjdCBtb2RlbCBiYXNlZCBvbiBwYXducyBkaXN0cmlidXRpb24gCi0gKiBIaWdoIG1lYW5zIHdoaXRlIGhhcyBhZHZhbnRhZ2UuIEJlbG93IHplcm8gbWVhbnMgYmxhY2sgaGFzIGFkdmFudGFnZS4KLSAqLwotc3RhdGljIGludCBldmFsKGJ5dGVbXSBnKSB7Ci0JaW50IGNudFdoaXRlID0gMCwgY250QmxhY2sgPSAwLCBjbnRFbXB0eSA9IDA7Ci0JaW50IGNudFdoaXRlV2FsbEFkdmFudGFnZSA9IDAsIGNudEJsYWNrV2FsbEFkdmFudGFnZSA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChnW2ldID09IFdISVRFKSB7Ci0JCQljbnRXaGl0ZSsrOwotCQkJY250V2hpdGVXYWxsQWR2YW50YWdlICs9IGdhbWVXYWxsV2VpZ2h0W2ldOwotCQl9Ci0JCWVsc2UgaWYgKGdbaV0gPT0gQkxBQ0spIHsKLQkJCWNudEJsYWNrKys7Ci0JCQljbnRCbGFja1dhbGxBZHZhbnRhZ2UgKz0gZ2FtZVdhbGxXZWlnaHRbaV07Ci0JCX0KLQkJZWxzZSBpZiAoZ1tpXSA9PSBFTVBUWSkgY250RW1wdHkrKzsKLQl9Ci0JaWYgKGNudEVtcHR5ID09IDApIHsKLQkJaWYgKGNudFdoaXRlID4gY250QmxhY2spIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsgLyogV2hpdGUgd2lucyAqLwotCQlpZiAoY250V2hpdGUgPCBjbnRCbGFjaykgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOyAvKiBCbGFjayB3aW5zICovCi0JCXJldHVybiAwOyAvKiBTdGFsZW1hdGUgKi8KLQl9Ci0JcmV0dXJuIGNudFdoaXRlICsgY250V2hpdGVXYWxsQWR2YW50YWdlIC0gY250QmxhY2sgLSBjbnRCbGFja1dhbGxBZHZhbnRhZ2U7Ci19Ci0KLS8qIFJlY29nbml6ZSBwYXducyBwcm90ZWN0ZWQgYnkgd2FsbHMgb3IgYm9yZGVycyAKLSAqIFRCRCAtIG5vdGUgdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBjZWxsIGFuZCBzdG9yZWQKLSAqIGluIGEgc2VwYXJhdGUgYnl0ZVtdIGdXYWxsR2FpbgotICogKi8KLXN0YXRpYyB2b2lkIGluaXRQYXduQm9yZGVycyhieXRlW10gZywgaW50W10gZ2FtZVdhbGxXZWlnaHQpIHsKLQkvKiBBIHBhd24gaGFzIDggbmVpZ2hib3VycyBvbiA0IGF4ZXMuCi0JICogU3RyYXRlZ2ljIHBhd25zIGhhdmUgb25lIHNpZGUgb2YgZWFjaCBheGlzIHByb3RlY3RlZCBieSBhIHdhbGwgYW5kIHRoZSBvdGhlcgotCSAqIHNpZGUgbm90IGNsb3NlZCBieSBhIHdhbGwuCi0JICogQSBwYXduIGNhbm5vdCBiZSByZXZlcnNlZCB3aGVuIGVhY2ggb2YgaXRzIDQgYXhlcyBhcmUgcHJvdGVjdGVkIGJ5IGEgd2FsbCBvbgotCSAqIG9uZSBzaWRlLiBQYXducyB0aGF0IGhhdmUgbW9yZSB0aGFuIDQgd2FsbHMgYXJlIGxlc3MgaW50ZXJlc3Rpbmcgc2luY2UgdGhleQotCSAqIGFyZSBub3Qgb3BlbiBlbm91Z2ggdG8gdGhlIGJvYXJkLgotCSAqIAotCSAqIE5iciB3YWxscywgbmJyIGF4aXMgY292ZXJlZCwgZXN0aW1hdGVkIHZhbHVlCi0JICogMCBuL2EgMAotCSAqIDEgMSAyCi0JICogMiAxIDEKLQkgKiAyIDIgNgotCSAqIDMgMiA0Ci0JICogNCAyIDIKLQkgKiAzIDMgOQotCSAqIDQgMyA4Ci0JICogNCA0IDE2Ci0JICogNSA0IDE0Ci0JICogNiA0IDkKLQkgKiA3IDQgNgotCSAqIDggNCAwCi0JICovCi0JaW50W10gblR5cGVzID0gbmV3IGludFs4XTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaW50IG5XYWxscyA9IDA7Ci0JCWludCBuQXhpcyA9IDA7Ci0JCWZvciAoaW50IG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCQlpbnQgbkluZGV4ID0gZ2V0TmVpZ2hib3VySW5kZXgoZywgaSwgbik7Ci0JCQluVHlwZXNbbl0gPSBuSW5kZXggIT0gLTEgPyBnW25JbmRleF0gOiBXQUxMOwotCQkJaWYgKG5UeXBlc1tuXSA9PSBXQUxMKSBuV2FsbHMrKzsKLQkJfQotCQlpbnQgc2NvcmUgPSBuV2FsbHM7Ci0JCWlmIChuV2FsbHMgPiAwKSB7Ci0JCQlpZiAoblR5cGVzWzBdID09IFdBTEwgfHwgblR5cGVzWzddID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzFdID09IFdBTEwgfHwgblR5cGVzWzZdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzJdID09IFdBTEwgfHwgblR5cGVzWzVdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlpZiAoblR5cGVzWzRdID09IFdBTEwgfHwgblR5cGVzWzNdID09IFdBTEwpIG5BeGlzKys7Ci0JCQlzd2l0Y2ggKG5BeGlzKSB7Ci0JCQkJY2FzZSA0OiBzd2l0Y2ggKG5XYWxscykgeyBjYXNlIDQ6IHNjb3JlID0gMTY7IGJyZWFrOyBjYXNlIDU6IHNjb3JlID0gMTQ7IGJyZWFrOyBjYXNlIDY6IHNjb3JlID0gOTsgY2FzZSA3OiBzY29yZSA9IDY7IGJyZWFrOyBjYXNlIDg6IHNjb3JlID0gMDsgYnJlYWs7fSBicmVhazsKLQkJCQljYXNlIDM6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMzogc2NvcmUgPSA5OyBicmVhazsgY2FzZSA0OiBzY29yZSA9IDg7fSBicmVhazsKLQkJCQljYXNlIDI6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMjogc2NvcmUgPSA2OyBicmVhazsgY2FzZSAzOiBzY29yZSA9IDQ7IGJyZWFrOyBjYXNlIDQ6IHNjb3JlID0gMjsgfSBicmVhazsKLQkJCQljYXNlIDE6IHN3aXRjaCAobldhbGxzKSB7IGNhc2UgMTogc2NvcmUgPSAyOyBicmVhazsgY2FzZSAyOiBzY29yZSA9IDE7IGJyZWFrO30gYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZ2FtZVdhbGxXZWlnaHRbaV0gPSBzY29yZTsKLQl9Ci19Ci0KLS8qIEV2YWx1YXRlIHRoZSBiZXN0IG1vdmUgZm9yIHBsYXllciB0eXBlIGZvciB0aGUgZ2l2ZW4gYm9hcmQsIGRvaW5nIGEgZGVwdGggMSBzZWFyY2ggKi8KLXN0YXRpYyB2b2lkIGV2YWxCZXN0KGJ5dGVbXSBnLCBieXRlIHR5cGUsIGludCBkZXB0aCwgLyogb3V0IFswXSBiZXN0IG1vdmUsIFsxXSBtaW5pbWF4ICovaW50W10gcmVzdWx0KSB7Ci0JYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzY0XTsKLQlieXRlIG9wcG9uZW50VHlwZSA9IHR5cGUgPT0gV0hJVEUgPyBCTEFDSyA6IFdISVRFOwotCXJlc3VsdFswXSA9IC0xOyByZXN1bHRbMV0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLQkJaWYgKGdbaV0gPT0gRU1QVFkpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZywgMCwgdG1wLCAwLCA2NCk7Ci0JCQlwbGF5KHRtcCwgaSwgdHlwZSk7Ci0JCQlpbnQgc2NvcmUgPSBldmFsKHRtcCk7Ci0JCQlpZiAoZGVwdGggPiAxKSB7Ci0JCQkJaW50W10gdG1wUmVzdWx0ID0gbmV3IGludFsyXTsKLQkJCQlldmFsQmVzdCh0bXAsIG9wcG9uZW50VHlwZSwgZGVwdGggLSAxLCB0bXBSZXN1bHQpOwotCQkJCXNjb3JlID0gdG1wUmVzdWx0WzFdOwotCQkJfQotCQkJaWYgKCh0eXBlID09IFdISVRFICYmIHNjb3JlID4gcmVzdWx0WzFdKSB8fCAodHlwZSA9PSBCTEFDSyAmJiBzY29yZSA8IHJlc3VsdFsxXSkgfHwgcmVzdWx0WzBdID09IC0xKSB7Ci0JCQkJcmVzdWx0WzBdID0gaTsKLQkJCQlyZXN1bHRbMV0gPSBzY29yZTsKLQkJCX0KLQkJfQotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9Ccm93c2VyRGVtb1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyMzcwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvQnJvd3NlckRlbW9WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXJEZW1vVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlBY3Rpb24gcGF3bkFjdGlvbjsKLQlBY3Rpb24gZWRpdEFjdGlvbjsKLQlDb21wb3NpdGUgcGFyZW50OwotCQotCXB1YmxpYyBCcm93c2VyRGVtb1ZpZXcoKSB7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWJyb3dzZXIuZGlzcG9zZSgpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotCQkJdGV4dC5zZXRUZXh0KCJCcm93c2VyIHdpZGdldCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiBUaGUgZXhhY3QgZXJyb3IgaXM6XHJcbiIrZSk7Ci0JCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJbmV3IFBhd25UYWIoaXRlbSk7Ci0JCQotCQlpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCW5ldyBFZGl0b3JUYWIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9FZGl0b3JUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzE2NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2Jyb3dzZXIvZGVtb3Mvdmlld3MvRWRpdG9yVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIEVkaXRvclRhYiB7Ci0JQnJvd3NlciBicm93c2VyOwotCVRleHQgaHRtbFRleHQsIHNjcmlwdFRleHQ7Ci0JQnV0dG9uIGh0bWxCdXR0b24sIHNjcmlwdEJ1dHRvbjsKLQlzdGF0aWMgU3RyaW5nIGh0bWwgPSAKLQkJIjxodG1sPlxyXG4iKwotCQkiCTxib2R5PlxyXG4iKwotCQkiCQk8aDEgaWQ9J215aWQnPkhUTUwgRG9jdW1lbnQ8L2gxPlxyXG4iKwotCQkiCQk8aDI+U2V0IEhUTUwgY29udGVudDwvaDI+XHJcbiIrCi0JCSIJCTxvbD5cclxuIisKLQkJIgkJCTxsaT5FbnRlciBodG1sIGRhdGEgaW50byB0aGUgJ3NldFRleHQnIHBhbmU8L2xpPlxyXG4iKwotCQkiCQkJPGxpPkNsaWNrIG9uICdzZXRUZXh0JyB0byBzZXQgdGhlIG5ldyBjb250ZW50PC9saT5cclxuIisKLQkJIgkJPC9vbD5cclxuIisKLQkJIgkJPGgyPlF1ZXJ5IG9yIG1vZGlmeSBIVE1MIGRvY3VtZW50PC9oMj5cclxuIisKLQkJIgkJPG9sPlxyXG4iKwotCQkiCQk8bGk+RW50ZXIgamF2YXNjcmlwdCBjb21tYW5kcyBpbnRvIHRoZSAnZXhlY3V0ZScgcGFuZTwvbGk+XHJcbiIrCi0JCSIJCTxsaT5DbGljayBvbiAnZXhlY3V0ZScgdG8gcnVuIHRoZSBqYXZhc2NyaXB0IGluIHRoZSBjdXJyZW50IGRvY3VtZW50PC9saT5cclxuIisKLQkJIgkJPC9vbD5cclxuIisKLQkJIgk8L2JvZHk+XHJcbiIrCi0JCSI8L2h0bWw+IjsKLQkKLQlzdGF0aWMgU3RyaW5nIHNjcmlwdCA9IAotCQkidmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQJyk7XHJcbiIrCi0JCSJ2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdDb250ZW50IGluc2VydGVkIScpO1xyXG4iKwotCQkibm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteWlkJykuYXBwZW5kQ2hpbGQobm9kZSk7XHJcblxyXG4iKwotCQkiZG9jdW1lbnQuYmdDb2xvciA9ICd5ZWxsb3cnOyI7Ci0JCi0JcHVibGljIEVkaXRvclRhYihUYWJJdGVtIGl0ZW0pIHsKLQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoaXRlbS5nZXRQYXJlbnQoKSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIkVkaXRvciIpOwotCQlpdGVtLnNldENvbnRyb2wocGFyZW50KTsKLQkJCi0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2gocGFyZW50LCBTV1QuVkVSVElDQUwpOwotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCgpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGZvcm0pOwotCQkKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlicm93c2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlzYXNoRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwLCAwKTsKLQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQkJc2FzaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBzYXNoLmdldEJvdW5kcygpOwotCQkJCVJlY3RhbmdsZSBwYXJlbnRSZWN0ID0gc2FzaC5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJaW50IHJpZ2h0ID0gcGFyZW50UmVjdC53aWR0aCAtIHJlY3Qud2lkdGggLSAyMDsKLQkJCQllLnggPSBNYXRoLm1heChNYXRoLm1pbihlLngsIHJpZ2h0KSwgMjApOwotCQkJCWlmIChlLnggIT0gcmVjdC54KSB7Ci0JCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgZS54KTsKLQkJCQkJcGFyZW50LmxheW91dCgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLyogSW5pdGlhbGl6ZSBQYW5lbCAqLwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCUdyb3VwIGh0bWxHcm91cCA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5PTkUpOwotCQlodG1sR3JvdXAuc2V0VGV4dCgic2V0VGV4dCIpOwotCQlodG1sVGV4dCA9IG5ldyBUZXh0KGh0bWxHcm91cCwgU1dULk1VTFRJKTsKLQkJaHRtbEJ1dHRvbiA9IG5ldyBCdXR0b24oaHRtbEdyb3VwLCBTV1QuUFVTSCk7Ci0JCWh0bWxCdXR0b24uc2V0VGV4dCgic2V0VGV4dCIpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlodG1sR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlodG1sVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJaHRtbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaHRtbEdyb3VwLmxheW91dCgpOwotCQkKLQkJR3JvdXAgc2NyaXB0R3JvdXAgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OT05FKTsKLQkJc2NyaXB0R3JvdXAuc2V0VGV4dCgiZXhlY3V0ZSIpOwotCQlzY3JpcHRUZXh0ID0gbmV3IFRleHQoc2NyaXB0R3JvdXAsIFNXVC5NVUxUSSk7Ci0JCXNjcmlwdEJ1dHRvbiA9IG5ldyBCdXR0b24oc2NyaXB0R3JvdXAsIFNXVC5QVVNIKTsKLQkJc2NyaXB0QnV0dG9uLnNldFRleHQoImV4ZWN1dGUiKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNjcmlwdEdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc2NyaXB0VGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJc2NyaXB0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzY3JpcHRHcm91cC5sYXlvdXQoKTsKLQkJCi0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJaHRtbFRleHQuc2V0VGV4dChodG1sKTsKLQkJc2NyaXB0VGV4dC5zZXRUZXh0KHNjcmlwdCk7Ci0JCXBhcmVudC5sYXlvdXQoKTsKLQkJCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVdpZGdldCB3ID0gZS53aWRnZXQ7Ci0JCQkJaWYgKHcgPT0gaHRtbEJ1dHRvbikgYnJvd3Nlci5zZXRUZXh0KGh0bWxUZXh0LmdldFRleHQoKSk7Ci0JCQkJaWYgKHcgPT0gc2NyaXB0QnV0dG9uKSBicm93c2VyLmV4ZWN1dGUoc2NyaXB0VGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQkKLQkJaHRtbEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCXNjcmlwdEJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3Nlci9kZW1vcy92aWV3cy9QYXduVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxM2YxMmUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyL2RlbW9zL3ZpZXdzL1Bhd25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIuZGVtb3Mudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5Ccm93c2VyRGVtb1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci5kZW1vcy5QYXduczsKLQotcHVibGljIGNsYXNzIFBhd25UYWIgewotCi0JQWN0aW9uIHBhd25BY3Rpb247Ci0JQWN0aW9uIGVkaXRBY3Rpb247Ci0JCi0JQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQlSZXZlcnNpTGlzdGVuZXIgcmV2ZXJzaUxpc3RlbmVyOwotCi0JZmluYWwgc3RhdGljIGludCBUWVBFX1dFTENPTUUgPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgVFlQRV9TVEFSVCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBUWVBFX0JPQVJEID0gMzsKLQlmaW5hbCBzdGF0aWMgaW50IFRZUEVfQk9BUkRfT1ZFUiA9IDQ7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTCA9ICJodHRwOi8vd3d3Lm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLmRlbW9zLnBhd25zLyI7Ci0Jc3RhdGljIFN0cmluZyBQTFVHSU5fUEFUSCA9IEJyb3dzZXJEZW1vUGx1Z2luLlBMVUdJTl9QQVRIOwotCXN0YXRpYyBTdHJpbmcgQ1NTX0ZPTERFUiA9ICJjc3MyIjsKLQlzdGF0aWMgU3RyaW5nIFVSTF9DU1MgPSBQTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvc3R5bGUuY3NzIjsKLQlzdGF0aWMgU3RyaW5nIFVSTF9XRUxDT01FID1QTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvd2VsY29tZS5odG1sIjsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1NUQVJUXzJfUExBWUVSUyA9ICJhY3Rpb25zdGFydDJwbGF5ZXJzIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9TVEFSVF8xX1BMQVlFUiA9ICJhY3Rpb25zdGFydDFwbGF5ZXIiOwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX1dISVRFID0gImFjdGlvbndoaXRlIjsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9CTEFDSyA9ICJhY3Rpb25ibGFjayI7Ci0JZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fVEhFTUUgPSAiYWN0aW9udGhlbWUiOwotCi0Jc3RhdGljIGJ5dGVbXVtdIGdhbWUgPSBudWxsOwotCXN0YXRpYyBib29sZWFuIGlzV2hpdGUgPSB0cnVlOwotCXN0YXRpYyBpbnQgY250V2hpdGUgPSAwLCBjbnRCbGFjayA9IDA7Ci0Jc3RhdGljIGJvb2xlYW4gY29tcHV0ZXIgPSBmYWxzZTsKLQlzdGF0aWMgaW50IGN4LCBjeTsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBFTVBUWSA9IDA7Ci0JZmluYWwgc3RhdGljIGJ5dGUgV0hJVEUgPSAxOwotCWZpbmFsIHN0YXRpYyBieXRlIEJMQUNLID0gMjsKLQlmaW5hbCBzdGF0aWMgYnl0ZSBXQUxMID0gMzsKLQkKLQlzdGF0aWMgUGF3bnMgdHRyID0gbnVsbDsKLQlzdGF0aWMgaW50W10gbW92ZSA9IG5ldyBpbnRbMl07Ci0Jc3RhdGljIE1lbnUgbWVudSA9IG51bGw7Ci0JCi0JcHVibGljIFBhd25UYWIoVGFiSXRlbSBpdGVtKSB7CQkKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihpdGVtLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaXRlbS5zZXRUZXh0KCJQYXducyIpOwotCQlpdGVtLnNldENvbnRyb2woYnJvd3Nlcik7Ci0KLQkJbWVudSA9IG5ldyBNZW51KGJyb3dzZXIuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCU1lbnVJdGVtIGl0ZW0yID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbTIuc2V0VGV4dCgiRW5kIEdhbWUiKTsKLQkJaXRlbTIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWdhbWUgPSBudWxsOwotCQkJCWlzV2hpdGUgPSB0cnVlOwotCQkJCWNudFdoaXRlID0gMDsgY250QmxhY2sgPSAwOwotCQkJCXR0ciA9IG51bGw7Ci0JCQkJYnJvd3Nlci5zZXRVcmwoVVJMX1dFTENPTUUpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5zZXRNZW51KG1lbnUpOwotCQkKLQkJcmV2ZXJzaUxpc3RlbmVyID0gbmV3IFJldmVyc2lMaXN0ZW5lcigpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIocmV2ZXJzaUxpc3RlbmVyKTsKLQkJYnJvd3Nlci5zZXRVcmwoVVJMX1dFTENPTUUpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0SHRtbChpbnQgdHlwZSkgewotCQlTdHJpbmcgaHRtbCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFRZUEVfQk9BUkQ6Ci0JCWNhc2UgVFlQRV9CT0FSRF9PVkVSOiB7Ci0JCQlodG1sID0gIjxodG1sPjxoZWFkZXI+PGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIiK1VSTF9DU1MrIlwiPjwvaGVhZGVyPjxib2R5PjxkaXYgY2xhc3M9XCJib2FyZFwiPjx0YWJsZT48dGJvZHk+IjsKLQkJCVN0cmluZyBjbGFzc1BsYXllcldoaXRlID0gInBsYXllcndoaXRlIiwgY2xhc3NQbGF5ZXJCbGFjayA9ICJwbGF5ZXJibGFjayI7Ci0JCQlpZiAodHlwZSA9PSBUWVBFX0JPQVJEX09WRVIpIHsKLQkJCQlpZiAoY250V2hpdGUgPiBjbnRCbGFjaykgewotCQkJCQljbGFzc1BsYXllcldoaXRlICs9ICIgd2lubmVyIjsKLQkJCQkJY2xhc3NQbGF5ZXJCbGFjayArPSAiIGxvc2VyIjsKLQkJCQl9IGVsc2UgewotCQkJCQljbGFzc1BsYXllcldoaXRlICs9ICIgbG9zZXIiOwotCQkJCQljbGFzc1BsYXllckJsYWNrICs9ICIgd2lubmVyIjsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgd2hpdGUgPSAiPHRkIGNsYXNzPVwid2hpdGVcIi8+IjsKLQkJCVN0cmluZyBibGFjayA9ICI8dGQgY2xhc3M9XCJibGFja1wiLz4iOwotCQkJU3RyaW5nIHdhbGwgPSAiPHRkIGNsYXNzPVwid2FsbFwiLz4iOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaHRtbCArPSAiPHRyPiI7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBnYW1lWzBdLmxlbmd0aDsgaisrKSB7Ci0JCQkJCXN3aXRjaCAoZ2FtZVtpXVtqXSkgewotCQkJCQkJY2FzZSBFTVBUWTogewotCQkJCQkJCVN0cmluZyBlbXB0eSA9ICI8dGQgY2xhc3M9XCIiKyhpc1doaXRlID8gIndoaXRlbGluayIgOiAiYmxhY2tsaW5rIikrIlwiPiIrIChpc1doaXRlIHx8ICghaXNXaGl0ZSAmJiAhY29tcHV0ZXIpID8gIjxhIGhyZWY9XCIiK1VSTCsoaXNXaGl0ZSA/IEFDVElPTl9XSElURSA6IEFDVElPTl9CTEFDSykrIi94eCIraSsieXkiK2orIlwiIGNsYXNzPVwiZW1wdHlcIi8+IiA6ICI8ZGl2IGNsYXNzPVwiZW1wdHlcIi8+IikrIjwvdGQ+IjsKLQkJCQkJCQlodG1sICs9IGVtcHR5OyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgV0hJVEU6IGh0bWwgKz0gd2hpdGU7IGJyZWFrOwotCQkJCQkJY2FzZSBCTEFDSzogaHRtbCArPSBibGFjazsgYnJlYWs7Ci0JCQkJCQljYXNlIFdBTEw6IGh0bWwgKz0gd2FsbDsgYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaHRtbCArPSI8L3RyPiI7Ci0JCQl9Ci0JCQlodG1sICs9ICI8L3Rib2R5PjwvdGFibGU+PC9kaXY+IjsKLQkJCWh0bWwgKz0gIjxkaXYgY2xhc3M9XCIiK2NsYXNzUGxheWVyV2hpdGUrIlwiPiIrY250V2hpdGUrIjwvZGl2PiI7Ci0JCQlodG1sICs9ICI8ZGl2IGNsYXNzPVwiIitjbGFzc1BsYXllckJsYWNrKyJcIj4iK2NudEJsYWNrKyI8L2Rpdj4iOwotCQkJaHRtbCArPSAiPC9ib2R5PjwvaHRtbD4iOwotCQkJYnJlYWs7Ci0JCX0KLQkJfQotCQlyZXR1cm4gaHRtbDsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgUmV2ZXJzaUxpc3RlbmVyIGltcGxlbWVudHMgTG9jYXRpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQl0cnkgewotCQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZS53aWRnZXQ7Ci0JCQlpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9TVEFSVF8xX1BMQVlFUikgIT0gLTEgfHwgZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9TVEFSVF8yX1BMQVlFUlMpICE9IC0xKSB7Ci0JCQkJY29tcHV0ZXIgPSBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1NUQVJUXzFfUExBWUVSKSAhPSAtMTsKLQkJCQlnYW1lID0gbmV3IGJ5dGVbOF1bOF07Ci0JCQkJaWYgKGNvbXB1dGVyKSB0dHIgPSBuZXcgUGF3bnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgZ2FtZVsoaW50KShNYXRoLnJhbmRvbSgpKmdhbWUubGVuZ3RoKV1bKGludCkoTWF0aC5yYW5kb20oKSpnYW1lWzBdLmxlbmd0aCldID0gV0FMTDsKLQkJCQllLmRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoVFlQRV9CT0FSRCkpOwotCQkJCX19KTsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9USEVNRSkgIT0gLTEpIHsKLQkJCQlpbnQgaW5kZXggPSBlLmxvY2F0aW9uLmluZGV4T2YoQUNUSU9OX1RIRU1FKSArIEFDVElPTl9USEVNRS5sZW5ndGgoKSArIDE7Ci0JCQkJQ1NTX0ZPTERFUiA9IGUubG9jYXRpb24uc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDQpOwotCQkJCVVSTF9DU1MgPSBQTFVHSU5fUEFUSCtDU1NfRk9MREVSKyIvc3R5bGUuY3NzIjsKLQkJCQlVUkxfV0VMQ09NRSA9IFBMVUdJTl9QQVRIK0NTU19GT0xERVIrIi93ZWxjb21lLmh0bWwiOwotCQkJCWUuZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlicm93c2VyLnNldFVybChVUkxfV0VMQ09NRSk7Ci0JCQkJfX0pOwotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJ5dGUgcGxheWVyID0gRU1QVFk7Ci0JCQlpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9XSElURSkgIT0gLTEpIHBsYXllciA9IFdISVRFOwotCQkJZWxzZSBpZiAoZS5sb2NhdGlvbi5pbmRleE9mKEFDVElPTl9CTEFDSykgIT0gLTEpIHBsYXllciA9IEJMQUNLOwotCQkJaWYgKHBsYXllciAhPSBFTVBUWSkgewotCQkJCWludCBpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZigieHgiKSArIDI7Ci0JCQkJaW50IHggPSBJbnRlZ2VyLnBhcnNlSW50KGUubG9jYXRpb24uc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpKTsKLQkJCQlpbmRleCA9IGUubG9jYXRpb24uaW5kZXhPZigieXkiKSArIDI7Ci0JCQkJaW50IHkgPSBJbnRlZ2VyLnBhcnNlSW50KGUubG9jYXRpb24uc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpKTsKLQkJCQlib29sZWFuIGhhc01vcmUgPSBhZGQoeCwgeSwgcGxheWVyKTsKLQkJCQlpc1doaXRlID0gcGxheWVyICE9IFdISVRFOwotCQkJCWJyb3dzZXIuc2V0VGV4dChnZXRIdG1sKGhhc01vcmUgPyBUWVBFX0JPQVJEIDogVFlQRV9CT0FSRF9PVkVSKSk7Ci0JCQkJaWYgKGNvbXB1dGVyICYmIGhhc01vcmUgJiYgIWlzV2hpdGUpIHBsYXkoZS5kaXNwbGF5LCBicm93c2VyLCA1MDAwKTsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJCX1jYXRjaCAoRXhjZXB0aW9uIGUxICkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZChpbnQgeCwgaW50IHksIGJ5dGUgY29sb3IpIHsKLQkJZ2FtZVt4XVt5XSA9IGNvbG9yOwotCQlpbnQgY250ID0gTWF0aC5taW4oeCwgeSksIG4gPSAwOwotCQlpbnQgb3RoZXJfY29sb3IgPSBjb2xvciA9PSBXSElURSA/IEJMQUNLIDogV0hJVEU7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4LWRdW3ktZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3gtZF1beS1kXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IE1hdGgubWluKGdhbWUubGVuZ3RoIC0gMSAtIHgsIGdhbWVbMF0ubGVuZ3RoIC0gMSAtIHkpOyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3grZF1beStkXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4K2RdW3krZF0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeCtkXVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0gTWF0aC5taW4oZ2FtZS5sZW5ndGggLSAxIC0geCwgeSk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5LWRdID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3grZF1beS1kXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4K2RdW3ktZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBNYXRoLm1pbih4LCBnYW1lWzBdLmxlbmd0aCAtIDEgLSB5KTsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4LWRdW3krZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeC1kXVt5K2RdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3gtZF1beStkXSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IHk7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeF1beS1kXSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4XVt5LWRdICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3hdW3ktZF0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCQljbnQgPSBnYW1lWzBdLmxlbmd0aCAtIDEgLSB5OyBuID0gMDsKLQkJZm9yIChpbnQgZCA9IDE7IGQgPD0gY250OyBkKyspIHsKLQkJCWlmIChnYW1lW3hdW3krZF0gPT0gb3RoZXJfY29sb3IpIG4rKzsKLQkJCWVsc2UgaWYgKGdhbWVbeF1beStkXSAhPSBjb2xvcikgYnJlYWs7Ci0JCQllbHNlIHsgaWYgKG4gPiAwKSBmb3IgKGQgPSAxOyBkIDw9IG47IGQrKykgZ2FtZVt4XVt5K2RdID0gY29sb3I7IGJyZWFrOyB9Ci0JCX0KLQkJY250ID0geDsgbiA9IDA7Ci0JCWZvciAoaW50IGQgPSAxOyBkIDw9IGNudDsgZCsrKSB7Ci0JCQlpZiAoZ2FtZVt4LWRdW3ldID09IG90aGVyX2NvbG9yKSBuKys7Ci0JCQllbHNlIGlmIChnYW1lW3gtZF1beV0gIT0gY29sb3IpIGJyZWFrOwotCQkJZWxzZSB7IGlmIChuID4gMCkgZm9yIChkID0gMTsgZCA8PSBuOyBkKyspIGdhbWVbeC1kXVt5XSA9IGNvbG9yOyBicmVhazsgfQotCQl9Ci0JCWNudCA9IGdhbWUubGVuZ3RoIC0gMSAtIHg7IG4gPSAwOwotCQlmb3IgKGludCBkID0gMTsgZCA8PSBjbnQ7IGQrKykgewotCQkJaWYgKGdhbWVbeCtkXVt5XSA9PSBvdGhlcl9jb2xvcikgbisrOwotCQkJZWxzZSBpZiAoZ2FtZVt4K2RdW3ldICE9IGNvbG9yKSBicmVhazsKLQkJCWVsc2UgeyBpZiAobiA+IDApIGZvciAoZCA9IDE7IGQgPD0gbjsgZCsrKSBnYW1lW3grZF1beV0gPSBjb2xvcjsgYnJlYWs7IH0KLQkJfQotCi0JCWJvb2xlYW4gaGFzTW9yZSA9IGZhbHNlOwotCQljbnRXaGl0ZSA9IDA7IGNudEJsYWNrID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnYW1lLmxlbmd0aDsgaSsrKQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBnYW1lWzBdLmxlbmd0aDsgaisrKSB7Ci0JCQkJc3dpdGNoIChnYW1lW2ldW2pdKSB7Ci0JCQkJCWNhc2UgRU1QVFk6IGhhc01vcmUgPSB0cnVlOyBicmVhazsKLQkJCQkJY2FzZSBXSElURTogY250V2hpdGUrKzsgYnJlYWs7Ci0JCQkJCWNhc2UgQkxBQ0s6IGNudEJsYWNrKys7IGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIGhhc01vcmU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwbGF5KGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgQnJvd3NlciBicm93c2VyLCBpbnQgZGVsYXkpIHsKLQkJdHRyLnBsYXlSZXF1ZXN0KGdhbWUsIEJMQUNLKTsKLQkJZGlzcGxheS50aW1lckV4ZWMoMzAwMCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHRyLmdldEJlc3RNb3ZlKG1vdmUpOwotCQkJCQlib29sZWFuIGhhc01vcmUgPSBhZGQobW92ZVswXSwgbW92ZVsxXSwgQkxBQ0spOwotCQkJCQlpc1doaXRlID0gdHJ1ZTsKLQkJCQkJYnJvd3Nlci5zZXRUZXh0KGdldEh0bWwoaGFzTW9yZSA/IFRZUEVfQk9BUkQgOiBUWVBFX0JPQVJEX09WRVIpKTsKLQkJCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTRlMTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvLnByb2plY3QgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkNWVlNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzN2E0Ni4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jTW9uIERlYyAxMSAxNToxNDo0MCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlNjQ0Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCSAgICAgICAKLXNvdXJjZS5icm93c2VyZXhhbXBsZS5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvZG9jLWh0bWwvc3d0X2Jyb3dzZXJfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1ZTE4MS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9kb2MtaHRtbC9zd3RfYnJvd3Nlcl9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEJyb3dzZXI8L2gyPgotCi08cD4KLVRoZSBCcm93c2VyIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0LiAKLUl0IGNvbnNpc3RzIG9mIGEgY29tcG9zaXRlIGNvbnRhaW5pbmcgYSBCcm93c2VyIHdpZGdldCB0byByZW5kZXIgSFRNTCBhbmQgc29tZQotYWRkaXRpb25hbCB3aWRnZXRzIHRvIGltcGxlbWVudCBhY3Rpb25zIGNvbW1vbmx5IGZvdW5kIG9uIGJyb3dzZXJzICh0b29sYmFyCi13aXRoIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3AgYnV0dG9ucywgc3RhdHVzIGJhciBldGMuKS4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlckV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkJyb3dzZXI8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvaWNvbnMvYnJvd3Nlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9pY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5N2NmMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUQnJvd3NlckV4YW1wbGUubmFtZSA9IFNXVCBCcm93c2VyIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBXZWIgQnJvd3NlcgotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBXZWIgQnJvd3NlcgotbGF1bmNoaXRlbS5Ccm93c2VyRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbnRlZ3JhdGUgYSBXZWIgQnJvd3NlciB3aXRoIHRoZSBTV1QgQnJvd3NlciB3aWRnZXQuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIGNvbXBvc2l0ZSBjb250YWluaW5nIGEgQnJvd3NlciB3aWRnZXQgdG8gcmVuZGVyIEhUTUwuIFwKLQlBZGRpdGlvbmFsIHdpZGdldHMgYWxsb3cgdGhlIHVzZXIgdG8gcGVyZm9ybSB0eXBpY2FsIGJyb3dzZXIgYWN0aW9ucyAoZm9yIGV4YW1wbGUsIG5hdmlnYXRlIHRvIGEgcGFydGljdWxhciBVUkwsIGdvIGJhY2ssIGZvcndhcmQsIHJlZnJlc2ggYW5kIHN0b3ApLgotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhNTNlYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlciIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlclBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iYnJvd3NlcmV4YW1wbGUuamFyIj4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUuQnJvd3NlclZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLkJyb3dzZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9icm93c2VyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlLnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGUudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3Nlci9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjE2MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXJleGFtcGxlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEJyb3dzZXJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmJyb3dzZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9icm93c2VyZXhhbXBsZS9Ccm93c2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGY2Y2UwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5icm93c2VyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvYnJvd3NlcmV4YW1wbGUvQnJvd3NlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuYnJvd3NlcmV4YW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiA8Y29kZT5Ccm93c2VyVmlldzwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIFNXVCBCcm93c2VyIHdpZGdldC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0JQnJvd3NlckV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZXhhbXBsZQotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgZnJhbWUpIHsKLQkJaW5zdGFuY2UgPSBuZXcgQnJvd3NlckV4YW1wbGUoZnJhbWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2UuZm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGM2OGViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3YjNhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTQ6MjEgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ1Yzc2Zi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLQkgICAgICAgICAgICouamFyCi0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLQkgICAgICAgCi1zb3VyY2UuY29udHJvbHMuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jb250cm9sc19leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTQ2MzA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9kb2MtaHRtbC9zd3RfY29udHJvbHNfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIENvbnRyb2xzIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIENvbnRyb2xzIEV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkNvbnRyb2xzPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvZG9jLWh0bWwvc3d0X2N1c3RvbWNvbnRyb2xzX2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjBkMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2RvYy1odG1sL3N3dF9jdXN0b21jb250cm9sc19leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gQ29udHJvbHMgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgZXhhbXBsZSAtIEN1c3RvbSBDb250cm9sczwvaDI+Ci0KLTxwPgotVGhlIEN1c3RvbSBDb250cm9scyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgZW11bGF0ZWQgU1dUIGNvbnRyb2xzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgdXNlciAKLXRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgZW11bGF0ZWQgY29udHJvbC4KLVRoZSB1c2VyIGNhbiBjaGFuZ2Ugc3R5bGVzIGFuZCBzZXR0aW5ncyBhbmQgdmlldyBob3cgdGhpcyBhZmZlY3RzIGVhY2ggY29udHJvbC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotPHA+Ci1Gb2xsb3cgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy9kb2MtaHRtbC9zd3RfbWFudWFsX3NldHVwLmh0bWwiPlNXVCBzdGFuZGFsb25lIGV4YW1wbGVzIHNldHVwPC9hPiAKLWluc3RydWN0aW9ucyB0byBpbnN0YWxsIGFuZCBydW4gdGhlIGV4YW1wbGUgZnJvbSB5b3VyIHdvcmtzcGFjZS4KLTwvcD4KLTxwPgotVGhlICJNYWluIiBjbGFzcyBpcyA8Y29kZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbGV4YW1wbGUuQ3VzdG9tQ29udHJvbEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkN1c3RvbSBDb250cm9sczwvc3Ryb25nPiBpdGVtIGZyb20gdGhlIDxzdHJvbmc+V29ya2JlbmNoIFZpZXdzPC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL2ljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmRlZTk3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9pY29ucy9jb250cm9sc19leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA3YzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLlNXVENvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzIEV4YW1wbGUgUGx1Z2luCi1jYXRlZ29yeS5TV1RFeGFtcGxlcy5uYW1lID0gU1dUIEV4YW1wbGVzCi12aWV3LkNvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIENvbnRyb2xzCi12aWV3LkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lID0gU1dUIEN1c3RvbSBDb250cm9scwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkNvbnRyb2xzRXhhbXBsZS5uYW1lID0gQ29udHJvbHMKLWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIG9mIG5hdGl2ZSBTV1QgY29udHJvbHMuXG5cblwKLQlJdCBjb25zaXN0cyBvZiBhIHRhYiBmb2xkZXIgd2hlcmUgZWFjaCB0YWIgYWxsb3dzIHRoZSB1c2VyIFwKLQl0byBpbnRlcmFjdCB3aXRoIGEgZGlmZmVyZW50IFNXVCBjb250cm9sLiBcCi0JVGhlIHVzZXIgY2FuIGNoYW5nZSBzdHlsZXMgYW5kIHNldHRpbmdzIGFuZCB2aWV3IGhvdyB0aGlzIGFmZmVjdHMgdGhlIGNvbnRyb2wuCi0JCi1sYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lID0gQ3VzdG9tIENvbnRyb2xzCi1sYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjdXN0b20gU1dUIGNvbnRyb2xzLlxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGFsbG93cyB0aGUgdXNlciBcCi0JdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgY3VzdG9tIGNvbnRyb2wuIFwKLQlUaGUgdXNlciBjYW4gY2hhbmdlIHN0eWxlcyBhbmQgc2V0dGluZ3MgYW5kIHZpZXcgaG93IHRoaXMgYWZmZWN0cyB0aGUgY29udHJvbC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyNzdkZWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLkNvbnRyb2xQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImNvbnRyb2xzLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIldmlldy5Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMuQ29udHJvbFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzLnZpZXciPgotICAgICAgPC92aWV3PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvY29udHJvbHNfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy5DdXN0b21Db250cm9sVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY3VzdG9tY29udHJvbHMudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uQ29udHJvbHNFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9jb250cm9sc19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5Db250cm9sc0V4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMudmlld2xhdW5jaGVyIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy52aWV3Ij4KLSAgICAgICAgIDwvdmlldz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5DdXN0b21Db250cm9sc0V4YW1wbGUubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2NvbnRyb2xzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkN1c3RvbUNvbnRyb2xzRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jdXN0b21jb250cm9scy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmN1c3RvbWNvbnRyb2xzLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlYjZkNTUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ29udHJvbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb250cm9sUGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9Db250cm9sVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTk1MzI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9scy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2NvbnRyb2xzL0NvbnRyb2xWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+Q29udHJvbHM8L2NvZGU+IGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24KLSAqIG9mIHRoZSBuYXRpdmUgY29udHJvbHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGNvbnRyb2wuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCUNvbnRyb2xFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IENvbnRyb2xFeGFtcGxlKGZyYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB3ZSBtdXN0IGdyYWIgZm9jdXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I3NldEZvY3VzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWluc3RhbmNlLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFZpZXcgaXMgdG8gYmUgZGlzcG9zZWQKLQkgKi8JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaW5zdGFuY2UuZGlzcG9zZSgpOwotCQlpbnN0YW5jZSA9IG51bGw7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvY29udHJvbHMvQ3VzdG9tQ29udHJvbFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0MzAyZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY29udHJvbHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9jb250cm9scy9DdXN0b21Db250cm9sVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5jb250cm9sczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNvbnRyb2xleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiA8Y29kZT5DdXN0b21Db250cm9sczwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGN1c3RvbSBjb250cm9scyBkZWZpbmVkIGJ5IFNXVC4gIEl0IGNvbnNpc3RzIG9mIGEgd29ya2JlbmNoCi0gKiB2aWV3IGFuZCB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGluIHRoZSBmb2xkZXIgYWxsb3dzIHRoZQotICogdXNlciB0byBpbnRlcmFjdCB3aXRoIGEgY29udHJvbC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29udHJvbFZpZXcgZXh0ZW5kcyBDb250cm9sVmlldyB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IEN1c3RvbUNvbnRyb2xFeGFtcGxlKGZyYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzdmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWFmODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjE0OjExIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxOWU0OTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MvLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotCSAgICAgICAgICAgKi5qYXIKLQkgICAgICAgICAgIAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotCi1zb3VyY2UubGF1bmNoZXIuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy1odG1sL3N3dF9sYXVuY2hlcl9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWY0ZjhjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDAsIDIwMDUuIFRoaXMgcGFnZSBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBsaWNlbnNlLiBGb3IgZnVsbCBkZXRhaWxzIHNlZSB0aGUgTEVHQUwgaW4gdGhlIGRvY3VtZW50YXRpb24gYm9vayB0aGF0IGNvbnRhaW5zIHRoaXMgcGFnZS4iID4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPHRpdGxlPlNXVCAtIEV4YW1wbGUgTGF1bmNoZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMj5TV1QgRXhhbXBsZSBMYXVuY2hlcjwvaDI+Ci0KLTxwPgotVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzLCB3aGljaCBjYW4gZWl0aGVyIGJlIFdvcmtiZW5jaCB2aWV3cyAKLW9yIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLgotPC9wPgotCi08dWw+Ci08bGk+V29ya2JlbmNoIHZpZXdzIGFyZSBleGFtcGxlcyB0aGF0IGFyZSBpbnRlZ3JhdGVkIGludG8gRWNsaXBzZS4gIFdoZW4gdGhlIGxhdW5jaGVyCi1zdGFydHMgYSBXb3JrYmVuY2ggdmlldywgaXQgaXMgb3BlbmVkIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBlcnNwZWN0aXZlLgotPGxpPlN0YW5kYWxvbmUgYXBwbGljYXRpb25zIGFyZSBsYXVuY2hlZCBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KLTwvdWw+Ci0KLTxwPgotRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gdGhlIHN0YW5kYWxvbmUgZXhhbXBsZXMgd2l0aG91dCB0aGUgU1dUIEV4YW1wbGUgTGF1bmNoZXIsIAotcmVmZXIgdG8gPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+LgotPC9wPgotPHA+Ci1UaGUgU1dUIFdvcmtiZW5jaCB2aWV3IGV4YW1wbGVzIGNhbiBhbHNvIGJlIGxhdW5jaGVkIGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIFNXVCBFeGFtcGxlIAotTGF1bmNoZXIuICBTV1QgV29ya2JlbmNoIHZpZXcgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSA8c3Ryb25nPlNXVCBFeGFtcGxlczwvc3Ryb25nPiBjYXRlZ29yeSBvZiB0aGUgCi08c3Ryb25nPlNob3cgVmlld3M8L3N0cm9uZz4gZGlhbG9nLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgRXhhbXBsZSBMYXVuY2hlcjwvaDM+Ci0KLTxwPgotRnJvbSBFY2xpcHNlJ3MgPHN0cm9uZz5XaW5kb3c8L3N0cm9uZz4gbWVudSwgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3ICZndDsgT3RoZXI8L3N0cm9uZz4uIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QgdGhlIDxzdHJvbmc+U1dUIEV4YW1wbGUgTGF1bmNoZXI8L3N0cm9uZz4gdmlldy4gCi1BIHZpZXcgY29udGFpbmluZyBhIGxpc3Qgb2YgZXhhbXBsZXMgd2lsbCBhcHBlYXIgaW4geW91ciBjdXJyZW50IHBlcnNwZWN0aXZlLgotV2hlbiB5b3Ugc2VsZWN0IGFuIGV4YW1wbGUgZnJvbSB0aGUgbGlzdCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBleGFtcGxlIGlzIGRpc3BsYXllZC4KLUNsaWNrIG9uIHRoZSA8c3Ryb25nPlJ1bjwvc3Ryb25nPiBidXR0b24gdG8gbGF1bmNoIHRoZSBleGFtcGxlLgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2RvYy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2VkZjkxOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIRUFEPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci08SFRNTD4KLTxCT0RZPgotPEgxPjxDRU5URVI+TGF1bmNoIEl0ZW1zPC9DRU5URVI+PC9IMT4KLTxIMj5JZGVudGlmaWVyPC9IMj4KLW9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtczxIMj5EZXNjcmlwdGlvbjwvSDI+Ci1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCAnc3RhbmRhbG9uZSBwcm9ncmFtJyBhbmQKLSdXb3JrYmVuY2ggdmlldycKLWxhdW5jaCBpdGVtcyB0byB0aGUgTGF1bmNoZXIsIG9wdGlvbmFsbHkgZ3JvdXBpbmcgdGhlbSBpbnRvCi1jYXRlZ29yaWVzIHNvIGFzIHRvIGZvcm0gYSBtdWx0aS10aWVyZWQgaGllcmFyY2h5LgotU3RhbmRhbG9uZSBwcm9ncmFtcyBhcmUgZXhlY3V0ZWQgdXNpbmcgdGhlIHBsYXRmb3JtJ3MgZXZlbnQgbG9vcC4KLVdvcmtiZW5jaCB2aWV3cyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIGFjdGl2ZSBXb3JrYmVuY2ggUGVyc3BlY3RpdmUuPEgyPk1hcmt1cDwvSDI+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIGV4dGVuc2lvbiBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBleHRlbnNpb248L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+cG9pbnQ8L2I+IC0gPC9saT48bGk+PGI+aWQ8L2I+IC0gPC9saT48bGk+PGI+bmFtZTwvYj4gLSA8L2xpPjwvdWw+Ci08cD48c2FtcD4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIHByb2dyYW0gRU1QVFkmZ3Q7PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgcHJvZ3JhbTwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDttYWluQ2xhc3MmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cGx1Z2luSWQmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+bWFpbkNsYXNzPC9iPiAtIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgd2hvc2UgbWFpbigpIG1ldGhvZCBpcyB0byBiZSBsYXVuY2hlZC48L2xpPjxsaT48Yj5wbHVnaW5JZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoZSBFY2xpcHNlIFBsYXRmb3JtIHBsdWdpbiBjb250YWluaW5nIHRoZSBwcm9ncmFtLjwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgdmlldyBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCB2aWV3PC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3ZpZXdJZCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj52aWV3SWQ8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgV29ya2JlbmNoIFZpZXcgdG8gYmUgYWN0aXZhdGVkIHdoZW4gdGhlIGl0ZW0gaXMgbGF1bmNoZWQuPC9saT48L3VsPgotPHA+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCBjYXRlZ29yeSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBjYXRlZ29yeTwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2lkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2NhdGVnb3J5Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L3NhbXA+Ci08dWw+Ci08bGk+PGI+bmFtZTwvYj4gLSBUaGUgbG9jYWxpemVkIG5hbWUgb2YgdGhpcyBjYXRlZ29yeS48L2xpPjxsaT48Yj5pZDwvYj4gLSBUaGUgdW5pcXVlIGlkIG9mIHRoaXMgY2F0ZWdvcnkuICBDYXRlZ29yaWVzIHdpdGggZHVwbGljYXRlIGlkJ3Mgd2lsbCBiZSBkaXNjYXJkZWQuPC9saT48bGk+PGI+Y2F0ZWdvcnk8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGFyZW50IGNhdGVnb3J5LjwvbGk+PC91bD4KLTxwPjxzYW1wPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgaXRlbSBFTVBUWSZndDs8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBpdGVtPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2F0ZWdvcnkmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpY29uJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZW5hYmxlZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyh0cnVlIHwgZmFsc2UpICJmYWxzZSIidHJ1ZSI8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ZGVzY3JpcHRpb24mbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0Ozwvc2FtcD4KLTx1bD4KLTxsaT48Yj5uYW1lPC9iPiAtIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGxhdW5jaCBpdGVtLjwvbGk+PGxpPjxiPmlkPC9iPiAtIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBsYXVuY2ggaXRlbS4gTGF1bmNoIGl0ZW1zIHdpdGggZHVwbGljYXRlIGlkJ3Mgd2lsbCBiZSBkaXNjYXJkZWQuPC9saT48bGk+PGI+Y2F0ZWdvcnk8L2I+IC0gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgY2F0ZWdvcnkgdGhpcyBsYXVuY2ggaXRlbSBiZWxvbmdzIHRvLjwvbGk+PGxpPjxiPmljb248L2I+IC0gVGhlIGRlY2xhcmluZyBwbHVnaW4gcmVsYXRpdmUgcGF0aCBvZiBhbiBpY29uIHRvIGRpc3BsYXkgd2l0aCB0aGlzIGxhdW5jaCBpdGVtIGluIHRoZSBMYXVuY2hlci48L2xpPjxsaT48Yj5lbmFibGVkPC9iPiAtIFNldCB0byAiZmFsc2UiIHRvIGRpc2FibGUgdGhpcyBsYXVuY2ggaXRlbSwgb3IgdG8gInRydWUiIHRvIGVuYWJsZSBpdCAoZGVmYXVsdCkuPC9saT48bGk+PGI+ZGVzY3JpcHRpb248L2I+IC0gVGhlIGxvY2FsaXplZCBwbGFpbi10ZXh0IGRlc2NyaXB0aW9uIG9mIHRoaXMgbGF1bmNoIGl0ZW0uPC9saT48L3VsPgotPEgyPkV4YW1wbGU8L0gyPgotPEgyPkFQSSBJbmZvcm1hdGlvbjwvSDI+Ci08SDI+U3VwcGxpZWQgSW1wbGVtZW50YXRpb248L0gyPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2Nsb3NlZEZvbGRlci5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmViNmVkMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvY2xvc2VkRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9pY29ucy9nZW5lcmljX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY5ZmI2YjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvbGF1bmNoZXJfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhYjRkMzIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL29wZW5Gb2xkZXIuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL2ljb25zL29wZW5Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWM3NzczNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvaWNvbnMvb3BlbkZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhMDNhYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RMYXVuY2hlckV4YW1wbGUubmFtZSA9IFNXVCBMYXVuY2hlciBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5MYXVuY2hlckV4YW1wbGUubmFtZSA9IFNXVCBFeGFtcGxlIExhdW5jaGVyCi0KLWV4dGVuc2lvbi1wb2ludC5sYXVuY2hJdGVtcy5uYW1lID0gTGF1bmNoIEl0ZW1zCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lID0gV29ya2JlbmNoIFZpZXdzCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24gPSBcCi0JQSBjb2xsZWN0aW9uIG9mIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IGV4YW1wbGVzIHRoYXQgcnVuIGFzIFZpZXdzIGluc2lkZSB0aGUgV29ya2JlbmNoLiAgXAotCVRoZXNlIGV4YW1wbGVzIHdpbGwgY3JlYXRlIGEgbmV3IFZpZXcgaW4gdGhlIGN1cnJlbnQgUGVyc3BlY3RpdmUuCi0KLWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLm5hbWUgPSBMYXVuY2hlcgotbGF1bmNoaXRlbS5MYXVuY2hlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhlIEV4YW1wbGUgTGF1bmNoZXIgaXMgdXNlZCB0byBsYXVuY2ggU1dUIGV4YW1wbGVzIHdoaWNoIGNhbiBlaXRoZXIgYmUgXAotCVdvcmtiZW5jaCBWaWV3cywgb3IgU3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuXG5cblwKLQlXb3JrYmVuY2ggVmlld3MgYXJlIGV4YW1wbGVzIHRoYXQgYXJlIGludGVncmF0ZWQgaW50byBFY2xpcHNlLiAgV2hlbiB0aGUgTGF1bmNoZXIgXAotCXN0YXJ0cyBhIFdvcmtiZW5jaCBWaWV3LCBpdCBpcyBvcGVuZWQgaW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgcGVyc3BlY3RpdmUuXG5cblwKLQlTdGFuZGFsb25lIGFwcGxpY2F0aW9ucyBhcmUgbGF1bmNoZWQgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCi0KLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotZXJyb3IuQ291bGROb3RGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbnMgPSBDb3VsZCBOb3QgRmluZCBSZWdpc3RlcmVkIEV4dGVuc2lvbnMKLWVycm9yLkluY29tcGxldGVQcm9ncmFtTGF1bmNoSXRlbSA9IEluY29tcGxldGUgWE1MIFByb2dyYW1MYXVuY2hJdGVtIGRlZmluaXRpb24sIGlkID0gezB9Ci1lcnJvci5JbmNvbXBsZXRlVmlld0xhdW5jaEl0ZW0gPSBJbmNvbXBsZXRlIFhNTCBWaWV3TGF1bmNoSXRlbSBkZWZpbml0aW9uLCBpZCA9IHswfQotZXJyb3IuSW5jb21wbGV0ZUxhdW5jaEl0ZW0gPSBJbmNvbXBsZXRlIG9yIHVucmVjb2duaXplZCBYTUwgTGF1bmNoSXRlbSBkZWZpbml0aW9uLCBpZCA9IHswfQotCi1sYXVuY2hpdGVtLk51bGwuZGVzY3JpcHRpb24gPSA8PG5vIGl0ZW0gc2VsZWN0ZWQ+PgotCi1sYXVuY2hpdGVtLk1pc3NpbmcubmFtZSA9IDw8dW5uYW1lZD4+Ci1sYXVuY2hpdGVtLk1pc3NpbmcuZGVzY3JpcHRpb24gPSA8PG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZT4+Ci0KLXZpZXcubGF1bmNoR3JvdXAudGV4dCA9IEV4YW1wbGVzCi12aWV3LmxhdW5jaEJ1dHRvbi50ZXh0ID0gUnVuCi12aWV3LmRlc2NyaXB0aW9uR3JvdXAudGV4dCA9IERlc2NyaXB0aW9uCi0KLXJ1bi5lcnJvci5JbnZvY2F0aW9uID0gQSBmYXRhbCBlcnJvciBvY2N1cnJlZCB3aGlsZSBsYXVuY2hpbmcgdGhlIHByb2dyYW0uCi1ydW4uZXJyb3IuRG9lc05vdEltcGxlbWVudE1ldGhvZCA9IFRoZSBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZW4oKSBtZXRob2QuCi1ydW4uZXJyb3IuQ291bGROb3RGaW5kQ2xhc3MgPSBDb3VsZCBub3QgZmluZCB0aGUgY2xhc3MgdG8gcnVuLgotcnVuLmVycm9yLkNvdWxkTm90SW5zdGFudGlhdGVDbGFzcyA9IENvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGUgY2xhc3MgdG8gcnVuLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzNiODJiMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyIgotICAgbmFtZT0iJXBsdWdpbi5TV1RMYXVuY2hlckV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIuTGF1bmNoZXJQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImxhdW5jaGVyLmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ib290Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPCEtLSBFeHRlbnNpb24gcG9pbnRzIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGF1bmNoSXRlbXMiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubGF1bmNoSXRlbXMubmFtZSIgc2NoZW1hPSJzY2hlbWEvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmV4c2QiLz4KLQotPCEtLSBFeHRlbnNpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuTGF1bmNoZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXVuY2hlcl9leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLkxhdW5jaGVyVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIudmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLm5hbWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8aXRlbQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uTGF1bmNoZXJFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBlbmFibGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2xhdW5jaGVyX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkxhdW5jaGVyRXhhbXBsZS5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoVmlld0NhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLnZpZXciPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9pdGVtPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zY2hlbWEvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjdkOGIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NjaGVtYS9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlciIgaWQ9ImxhdW5jaEl0ZW1zIiBuYW1lPSJMYXVuY2ggSXRlbXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhZGQgJmFwb3M7c3RhbmRhbG9uZSBwcm9ncmFtJmFwb3M7IGFuZAotJmFwb3M7V29ya2JlbmNoIHZpZXcmYXBvczsKLWxhdW5jaCBpdGVtcyB0byB0aGUgTGF1bmNoZXIsIG9wdGlvbmFsbHkgZ3JvdXBpbmcgdGhlbSBpbnRvCi1jYXRlZ29yaWVzIHNvIGFzIHRvIGZvcm0gYSBtdWx0aS10aWVyZWQgaGllcmFyY2h5LgotU3RhbmRhbG9uZSBwcm9ncmFtcyBhcmUgZXhlY3V0ZWQgdXNpbmcgdGhlIHBsYXRmb3JtJmFwb3M7cyBldmVudCBsb29wLgotV29ya2JlbmNoIHZpZXdzIGFyZSBjcmVhdGVkIHdpdGhpbiB0aGUgYWN0aXZlIFdvcmtiZW5jaCBQZXJzcGVjdGl2ZS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Iml0ZW0iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9ncmFtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSAmcXVvdDtTdGFuZGFsb25lIFByb2dyYW0mcXVvdDsgZm9yIGEgbGF1bmNoIGl0ZW0gdG8gcnVuLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWluQ2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aG9zZSBtYWluKCkgbWV0aG9kIGlzIHRvIGJlIGxhdW5jaGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBsdWdpbklkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIEVjbGlwc2UgUGxhdGZvcm0gcGx1Z2luIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZpZXciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFNwZWNpZmllcyBhICZxdW90O1dvcmtiZW5jaCBWaWV3JnF1b3Q7IGZvciBhIGxhdW5jaCBpdGVtIHRvIGFjdGl2YXRlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3SWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgV29ya2JlbmNoIFZpZXcgdG8gYmUgYWN0aXZhdGVkIHdoZW4gdGhlIGl0ZW0gaXMgbGF1bmNoZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgYSBsYXVuY2ggaXRlbSBjYXRlZ29yeSBoZWFkaW5nLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGNhdGVnb3J5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBjYXRlZ29yeS4gIENhdGVnb3JpZXMgd2l0aCBkdXBsaWNhdGUgaWQmYXBvcztzIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGVnb3J5IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHBhcmVudCBjYXRlZ29yeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBsYXVuY2ggaXRlbSBjYXRlZ29yeSBkZXNjcmlwdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaXRlbSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgU3BlY2lmaWVzIGEgbGF1bmNoIGl0ZW0uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2aWV3Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2dyYW0iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBsb2NhbGl6ZWQgbmFtZSBvZiB0aGlzIGxhdW5jaCBpdGVtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBsYXVuY2ggaXRlbS4gTGF1bmNoIGl0ZW1zIHdpdGggZHVwbGljYXRlIGlkJmFwb3M7cyB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkIG9mIHRoZSBjYXRlZ29yeSB0aGlzIGxhdW5jaCBpdGVtIGJlbG9uZ3MgdG8uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWNvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgZGVjbGFyaW5nIHBsdWdpbiByZWxhdGl2ZSBwYXRoIG9mIGFuIGljb24gdG8gZGlzcGxheSB3aXRoIHRoaXMgbGF1bmNoIGl0ZW0gaW4gdGhlIExhdW5jaGVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iIHVzZT0iZGVmYXVsdCIgdmFsdWU9InRydWUiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFNldCB0byAmcXVvdDtmYWxzZSZxdW90OyB0byBkaXNhYmxlIHRoaXMgbGF1bmNoIGl0ZW0sIG9yIHRvICZxdW90O3RydWUmcXVvdDsgdG8gZW5hYmxlIGl0IChkZWZhdWx0KS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgbG9jYWxpemVkIHBsYWluLXRleHQgZGVzY3JpcHRpb24gb2YgdGhpcyBsYXVuY2ggaXRlbS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1EZXNjcmlwdG9yLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYzEwNWYyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0l0ZW1EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogSXRlbURlc2NyaXB0b3IgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgYSBsYXVuY2ggaXRlbS4KLSAqLwotY2xhc3MgSXRlbURlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBJbWFnZSAgaWNvbjsKLQlwcml2YXRlIFN0cmluZyB2aWV3OwotCXByaXZhdGUgU3RyaW5nIG1haW5UeXBlOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JCi0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbiBJdGVtRGVzY3JpcHRvci4KLQkgKgotCSAqIEBwYXJhbSBpZCB0aGUgaWQKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gaWNvbiB0aGUgaWNvbgotCSAqIEBwYXJhbSB2aWV3IHRoZSBob3N0IHZpZXcgbWF5IGJlIG51bGwgaWYgaXQgaXMgYSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uCi0JICogQHBhcmFtIG1haW5UeXBlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byBydW4gbWF5IGJlIG51bGwgaWYgaXQgaXMgYSB2aWV3Ci0JICogQHBhcmFtIHBsdWdpbklkIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gd2hpY2ggY29udGFpbnMgdGhlIG1haW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgSXRlbURlc2NyaXB0b3IoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQlJbWFnZSBpY29uLCBTdHJpbmcgdmlldywgU3RyaW5nIG1haW5UeXBlLCBTdHJpbmcgcGx1Z2luSWQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmljb24gPSBpY29uOwotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQl0aGlzLm1haW5UeXBlID0gbWFpblR5cGU7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24ncyBzcGVjaWZpZWQgdHlwZSwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB0eXBlIHdhcyBzcGVjaWZpZWQgYnkgdGhlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24ncyBzcGVjaWZpZWQgdHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlSXRlbUluc3RhbmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihMYXVuY2hlclBsdWdpbi5MQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIGZvciB0aGlzIHByb2dyYW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB1c2VyLXNwZWNpZmllZCBJRCBmb3IgdGhpcyBwcm9ncmFtCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGVkIG5hbWUgZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hvcnQgZGVzY3JpcHRpb24gZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXdsaW5lLWRlbGltaXRlZCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvZ3JhbSwgbnVsbCBpZiBubyBkZXNjcmlwdGlvbiBpcyBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpY29uIGZvciB0aGlzIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcmV0dXJucyBhbiBpY29uLCBudWxsIGlmIHRoZSBpdGVtIGlzIGEgZm9sZGVyCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBob3N0IHZpZXcgZm9yIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhvc3QgdmlldywgbnVsbCBpZiB0aGUgaXRlbSBpcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXcgKCkgewotCQlyZXR1cm4gdmlldzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIHRvIHJ1bgotCSAqIGZvciB0aGUgcHJvZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjbGFzcyB0byBydW4gZm9yIHRoZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpblR5cGUgKCkgewotCQlyZXR1cm4gbWFpblR5cGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBwcm9ncmFtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IGNvbnRhaW5zIHRoZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQgKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgYW4gaXRlbSBpcyBhIGZvbGRlci4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaXRlbSBpcyBhIGZvbGRlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9sZGVyKCkgewotCQlyZXR1cm4gKG1haW5UeXBlID09IG51bGwgJiYgdmlldyA9PSBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgZXF1YWxpdHkgb2YgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMuZ2V0SWQoKS5lcXVhbHNJZ25vcmVDYXNlKG90aGVyLmdldElkKCkpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBJdGVtRGVzY3JpcHRvcikgewotCQkJSXRlbURlc2NyaXB0b3Igb3RoZXJEZXNjcmlwdG9yID0gKEl0ZW1EZXNjcmlwdG9yKSBvdGhlcjsKLQkJCXJldHVybiBnZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJEZXNjcmlwdG9yLmdldElkKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUHJvZHVjZXMgYSBoYXNoY29kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBoYXNoY29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBpZC50b1VwcGVyQ2FzZSgpLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvSXRlbVRyZWVOb2RlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtVHJlZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYwMzBhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9JdGVtVHJlZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHN0b3JlIHRyZWUgc3RydWN0dXJlcyBvZiBJdGVtRGVzY3JpcHRvcnMKLSAqLwotY2xhc3MgSXRlbVRyZWVOb2RlIHsKLQlwcml2YXRlIEl0ZW1UcmVlTm9kZSBuZXh0U2libGluZzsKLQlwcml2YXRlIEl0ZW1UcmVlTm9kZSBmaXJzdENoaWxkOwotCXByaXZhdGUgSXRlbURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBsZWFmIEl0ZW1UcmVlTm9kZSB3aXRoIGEgZ2l2ZW4gZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJdGVtVHJlZU5vZGUoSXRlbURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBub2RlIHRvIHRoZSBUcmVlIGluIHNvcnRlZCBvcmRlciBieSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIGFkZC4gTm90ZSB0aGF0IG5vZGUubmV4dFNpYmxpbmcgbXVzdCBiZSBudWxsCi0JICovCi0JcHVibGljIHZvaWQgYWRkU29ydGVkTm9kZShJdGVtVHJlZU5vZGUgbm9kZSkgewotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQlmaXJzdENoaWxkID0gbm9kZTsKLQkJfSBlbHNlIGlmIChmaXJzdENoaWxkLmRlc2NyaXB0b3IuZ2V0TmFtZSgpLmNvbXBhcmVUbyhub2RlLmRlc2NyaXB0b3IuZ2V0TmFtZSgpKSA+IDApIHsKLQkJCW5vZGUubmV4dFNpYmxpbmcgPSBmaXJzdENoaWxkOwotCQkJZmlyc3RDaGlsZCA9IG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQlJdGVtVHJlZU5vZGUgY3Vyc29yOwotCQkJZm9yIChjdXJzb3IgPSBmaXJzdENoaWxkOyBjdXJzb3IubmV4dFNpYmxpbmcgIT0gbnVsbDsgY3Vyc29yID0gY3Vyc29yLm5leHRTaWJsaW5nKSB7Ci0JCQkJSXRlbVRyZWVOb2RlIHNpYmxpbmcgPSBjdXJzb3IubmV4dFNpYmxpbmc7Ci0JCQkJaWYgKHNpYmxpbmcuZGVzY3JpcHRvci5nZXROYW1lKCkuY29tcGFyZVRvKG5vZGUuZGVzY3JpcHRvci5nZXROYW1lKCkpID4gMCkgYnJlYWs7Ci0JCQl9Ci0JCQlub2RlLm5leHRTaWJsaW5nID0gY3Vyc29yLm5leHRTaWJsaW5nOwotCQkJY3Vyc29yLm5leHRTaWJsaW5nID0gbm9kZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBJdGVtRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgc2libGluZywgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIG5leHRTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBjaGlsZCwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gZmlyc3RDaGlsZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF1bmNoZXIvTGF1bmNoZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWI3MDBmZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hlclBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCQlMQVVOQ0hfSVRFTVNfUE9JTlRfSUQgPSAib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSA9ICJjYXRlZ29yeSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTSA9ICJpdGVtIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9JVEVNX0lDT04gPSAiaWNvbiIsCi0JCUxBVU5DSF9JVEVNU19YTUxfSVRFTV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTSA9ICJwcm9ncmFtIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9QUk9HUkFNX1BMVUdJTiA9ICJwbHVnaW5JZCIsCi0JCUxBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9DTEFTUyA9ICJtYWluQ2xhc3MiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX1ZJRVcgPSAidmlldyIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVklFV19WSUVXSUQgPSAidmlld0lkIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQgPSAiaWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9OQU1FID0gIm5hbWUiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9FTkFCTEVEID0gImVuYWJsZWQiLAotCQlMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9DQVRFR09SWSA9ICJjYXRlZ29yeSIsCi0JCUxBVU5DSF9JVEVNU19YTUxfVkFMVUVfVFJVRSA9ICJ0cnVlIiwKLQkJTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7CQkKLQotCXN0YXRpYyBmaW5hbCBpbnQKLQkJbGlDbG9zZWRGb2xkZXIgPSAwLAotCQlsaU9wZW5Gb2xkZXIgPSAxLAotCQlsaUdlbmVyaWNFeGFtcGxlID0gMjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gaW1hZ2VMb2NhdGlvbnMgPSB7Ci0JCSJpY29ucy9jbG9zZWRGb2xkZXIuZ2lmIiwKLQkJImljb25zL29wZW5Gb2xkZXIuZ2lmIiwKLQkJImljb25zL2dlbmVyaWNfZXhhbXBsZS5naWYiIH07Ci0Jc3RhdGljIEltYWdlIGltYWdlc1tdOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyB0aGUgTGF1bmNoZXJQbHVnaW4uCi0JICovCi0JcHVibGljIExhdW5jaGVyUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZyZWVSZXNvdXJjZXMoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMYXVuY2hlclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSByZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlc291cmNlcygpIHsKLQkJaWYgKGltYWdlcyA9PSBudWxsKSB7Ci0JCQlpbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VMb2NhdGlvbnMubGVuZ3RoXTsKLQkJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQlpbWFnZXNbaV0gPSBnZXRJbWFnZUZyb21QbHVnaW4ocGx1Z2luLmdldEJ1bmRsZSgpLCBpbWFnZUxvY2F0aW9uc1tpXSk7Ci0JCQkJaWYgKGltYWdlc1tpXSA9PSBudWxsKSB7Ci0JCQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyIpLCBudWxsKTsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZyBhbiBlcnJvciB0byB0aGUgSUxvZyBmb3IgdGhpcyBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdGV4dAotCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGFzc29jaWF0ZWQgZXhjZXB0aW9uLCBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCXBsdWdpbi5nZXRMb2coKS5sb2cobmV3IFN0YXR1cygKLQkJCUlTdGF0dXMuRVJST1IsIHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHByb2dyYW1zIGZyb20gcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gSXRlbVRyZWVOb2RlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiBhIHRyZWUgb2YgaXRlbXMgKHRoZSByb290IGlzIG5vdCB0byBiZSBkaXNwbGF5ZWQpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVtVHJlZU5vZGUgZ2V0TGF1bmNoSXRlbVRyZWUoKSB7Ci0JCUl0ZW1UcmVlTm9kZSBjYXRlZ29yeVRyZWUgPQotCQkJbmV3IEl0ZW1UcmVlTm9kZShuZXcgSXRlbURlc2NyaXB0b3IoIjw8Um9vdD4+IiwgIjw8Um9vdD4+IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCi0JCS8vIGdldCB0aGUgcGxhdGZvcm0ncyBwdWJsaWMgcGx1Z2luIHJlZ2lzdHJ5Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCS8vIHJldHJpZXZlIGFsbCBjb25maWd1cmF0aW9uIGVsZW1lbnRzIHJlZ2lzdGVyZWQgYXQgb3VyIGxhdW5jaEl0ZW1zIGV4dGVuc2lvbi1wb2ludAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWd1cmF0aW9uRWxlbWVudHMgPQotCQkJZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKExBVU5DSF9JVEVNU19QT0lOVF9JRCk7Ci0JCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9PSBudWxsIHx8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkNvdWxkTm90RmluZFJlZ2lzdGVyZWRFeHRlbnNpb25zIiksIG51bGwpOwotCQkJcmV0dXJuIGNhdGVnb3J5VHJlZTsKLQkJfQotCQkKLQkJLyogQ29sbGVjdCBhbGwgbGF1bmNoIGNhdGVnb3JpZXMgLS0gY29hbGVzY2UgdGhvc2Ugd2l0aCBzYW1lIElEICovCi0JCUhhc2hNYXAgaWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25FbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlID0gY29uZmlndXJhdGlvbkVsZW1lbnRzW2ldOwotCQkJZmluYWwgU3RyaW5nIGNlTmFtZSA9IGNlLmdldE5hbWUoKTsKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJJZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0lELCBudWxsKTsKLQkJCQotCQkJaWYgKGlkTWFwLmNvbnRhaW5zS2V5KGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQlmaW5hbCBTdHJpbmcgYXR0cmliTmFtZSA9IGdldEl0ZW1OYW1lKGNlKTsgCi0JCQkJSXRlbURlc2NyaXB0b3IgdGhlRGVzY3JpcHRvciA9IG5ldyBJdGVtRGVzY3JpcHRvcihhdHRyaWJJZCwgYXR0cmliTmFtZSwKLQkJCQkJZ2V0SXRlbURlc2NyaXB0aW9uKGNlKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgY2UpOwotCQkJCWlkTWFwLnB1dChhdHRyaWJJZCwgbmV3IEl0ZW1UcmVlTm9kZSh0aGVEZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIEdlbmVyYXRlIGxhdW5jaCBjYXRlZ29yeSBoaWVyYXJjaHkgKi8KLQkJU2V0IHRlbXBJZFNldCA9IG5ldyBIYXNoU2V0KCk7IC8vIHVzZWQgdG8gcHJldmVudCBkdXBsaWNhdGVzIGZyb20gYmVpbmcgZW50ZXJlZCBpbnRvIHRoZSB0cmVlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UgPSBjb25maWd1cmF0aW9uRWxlbWVudHNbaV07Ci0JCQlmaW5hbCBTdHJpbmcgY2VOYW1lID0gY2UuZ2V0TmFtZSgpOwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYklkID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfSUQsIG51bGwpOwotCQkJCi0JCQlpZiAodGVtcElkU2V0LmNvbnRhaW5zKGF0dHJpYklkKSkgY29udGludWU7Ci0JCQlpZiAoY2VOYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9DQVRFR09SWSkpIHsKLQkJCQlmaW5hbCBJdGVtVHJlZU5vZGUgdGhlTm9kZSA9IChJdGVtVHJlZU5vZGUpIGlkTWFwLmdldChhdHRyaWJJZCk7Ci0JCQkJYWRkSXRlbUJ5Q2F0ZWdvcnkoY2UsIGNhdGVnb3J5VHJlZSwgdGhlTm9kZSwgaWRNYXApOwotCQkJCXRlbXBJZFNldC5hZGQoYXR0cmliSWQpOwotCQkJfQotCQl9Ci0JCQotCQkvKiBHZW5lcmF0ZSBwcm9ncmFtIHRyZWUgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uRWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50c1tpXTsKLQkJCWZpbmFsIFN0cmluZyBjZU5hbWUgPSBjZS5nZXROYW1lKCk7Ci0JCQlmaW5hbCBTdHJpbmcgYXR0cmliSWQgPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0FUVFJJQl9JRCwgbnVsbCk7Ci0KLQkJCWlmIChpZE1hcC5jb250YWluc0tleShhdHRyaWJJZCkpIGNvbnRpbnVlOwotCQkJaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfQ0FURUdPUlkpKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9IGVsc2UgaWYgKGNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBVU5DSF9JVEVNU19YTUxfSVRFTSkpIHsKLQkJCQlmaW5hbCBTdHJpbmcgZW5hYmxlZCA9IGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX0VOQUJMRUQsIAotCQkJCQlMQVVOQ0hfSVRFTVNfWE1MX1ZBTFVFX1RSVUUpOwotCQkJCWlmIChlbmFibGVkLmVxdWFsc0lnbm9yZUNhc2UoTEFVTkNIX0lURU1TX1hNTF9WQUxVRV9GQUxTRSkpIGNvbnRpbnVlOwotCQkJCUl0ZW1EZXNjcmlwdG9yIHRoZURlc2NyaXB0b3IgPSBjcmVhdGVJdGVtRGVzY3JpcHRvcihjZSwgYXR0cmliSWQpOwkJCQkKLQkJCQotCQkJCWlmICh0aGVEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJZmluYWwgSXRlbVRyZWVOb2RlIHRoZU5vZGUgPSBuZXcgSXRlbVRyZWVOb2RlKHRoZURlc2NyaXB0b3IpOwotCQkJCQlhZGRJdGVtQnlDYXRlZ29yeShjZSwgY2F0ZWdvcnlUcmVlLCB0aGVOb2RlLCBpZE1hcCk7Ci0JCQkJCWlkTWFwLnB1dChhdHRyaWJJZCwgdGhlTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYXRlZ29yeVRyZWU7Ci0JfQotCi0JCQkJCi0JLyoqCi0JICogQWRkcyBhbiBpdGVtIHRvIHRoZSBjYXRlZ29yeSB0cmVlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSXRlbUJ5Q2F0ZWdvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBJdGVtVHJlZU5vZGUgcm9vdCwKLQkJSXRlbVRyZWVOb2RlIHRoZU5vZGUsIEhhc2hNYXAgaWRNYXApIHsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYkNhdGVnb3J5ID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9BVFRSSUJfQ0FURUdPUlksIG51bGwpOwotCQkJCQotCQkvLyBsb2NhdGUgdGhlIHBhcmVudCBub2RlCi0JCUl0ZW1UcmVlTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKGF0dHJpYkNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudE5vZGUgPSAoSXRlbVRyZWVOb2RlKSBpZE1hcC5nZXQoYXR0cmliQ2F0ZWdvcnkpOwotCQl9Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHBhcmVudE5vZGUgPSByb290OwotCQkJCQotCQkvLyBhZGQgdGhlIGl0ZW0KLQkJcGFyZW50Tm9kZS5hZGRTb3J0ZWROb2RlKHRoZU5vZGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gSXRlbURlc2NyaXB0b3IgZnJvbSBhbiBYTUwgZGVmaW5pdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHBhcmFtIGF0dHJpYklkIHRoZSBhdHRyaWJ1dGUgaWQKLQkgKiBAcmV0dXJuIGEgbmV3IEl0ZW1EZXNjcmlwdG9yLCBvciBudWxsIGlmIGFuIGVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZW1EZXNjcmlwdG9yIGNyZWF0ZUl0ZW1EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSwgU3RyaW5nIGF0dHJpYklkKSB7Ci0JCWZpbmFsIFN0cmluZyBhdHRyaWJOYW1lID0gZ2V0SXRlbU5hbWUoY2UpOwotCQlmaW5hbCBJbWFnZSAgYXR0cmliSWNvbiA9IGdldEl0ZW1JY29uKGNlKTsKLQkJZmluYWwgU3RyaW5nIGF0dHJpYkRlc2NyaXB0aW9uID0gZ2V0SXRlbURlc2NyaXB0aW9uKGNlKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdmlld0NFID0gZ2V0SXRlbUVsZW1lbnQoY2UsIExBVU5DSF9JVEVNU19YTUxfVklFVyk7Ci0JCWlmICh2aWV3Q0UgIT0gbnVsbCkgewotCQkJLy9JdGVtIGlzIGEgdmlldwotCQkJZmluYWwgU3RyaW5nIGF0dHJpYlZpZXcgPSBnZXRJdGVtQXR0cmlidXRlKHZpZXdDRSwgTEFVTkNIX0lURU1TX1hNTF9WSUVXX1ZJRVdJRCwgbnVsbCk7CQkKLQkJCWlmIChhdHRyaWJWaWV3ID09IG51bGwpIHsKLQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZVZpZXdMYXVuY2hJdGVtIiwKLQkJCQkJbmV3IE9iamVjdFtdIHsgYXR0cmliSWQgfSApLCBudWxsKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBuZXcgSXRlbURlc2NyaXB0b3IoYXR0cmliSWQsIGF0dHJpYk5hbWUsIGF0dHJpYkRlc2NyaXB0aW9uLAotCQkJCQlhdHRyaWJJY29uLCBhdHRyaWJWaWV3LCBudWxsLCBudWxsLCB2aWV3Q0UpOwotCQl9IGVsc2UgewotCQkJLy9JdGVtIGlzIGEgc3RhbmRhbG9uZQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHByb2dyYW1DRSA9IGdldEl0ZW1FbGVtZW50KGNlLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU0pOwotCQkJaWYgKHByb2dyYW1DRSAhPSBudWxsKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGF0dHJpYlBsdWdpbklkID0gZ2V0SXRlbUF0dHJpYnV0ZShwcm9ncmFtQ0UsIExBVU5DSF9JVEVNU19YTUxfUFJPR1JBTV9QTFVHSU4sIG51bGwpOwotCQkJCWZpbmFsIFN0cmluZyBhdHRyaWJDbGFzcyAgICA9IGdldEl0ZW1BdHRyaWJ1dGUocHJvZ3JhbUNFLCBMQVVOQ0hfSVRFTVNfWE1MX1BST0dSQU1fQ0xBU1MsIG51bGwpOwotCQkJCWlmIChhdHRyaWJDbGFzcyA9PSBudWxsIHx8IGF0dHJpYlBsdWdpbklkID09IG51bGwpIHsKLQkJCQkJbG9nRXJyb3IoZ2V0UmVzb3VyY2VTdHJpbmcoImVycm9yLkluY29tcGxldGVQcm9ncmFtTGF1bmNoSXRlbSIsCi0JCQkJCW5ldyBPYmplY3RbXSB7IGF0dHJpYklkIH0gKSwgbnVsbCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IEl0ZW1EZXNjcmlwdG9yKGF0dHJpYklkLCBhdHRyaWJOYW1lLCBhdHRyaWJEZXNjcmlwdGlvbiwKLQkJCQkJYXR0cmliSWNvbiwgbnVsbCwgYXR0cmliQ2xhc3MsIGF0dHJpYlBsdWdpbklkLCBwcm9ncmFtQ0UpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuSW5jb21wbGV0ZUxhdW5jaEl0ZW0iLAotCQkJCQluZXcgT2JqZWN0W10geyBhdHRyaWJJZCB9ICksIG51bGwpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGNoaWxkIFhNTCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBhcmVudAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZldGNoCi0JICogQHJldHVybiB0aGUgZWxlbWVudCdzIElDb25maWd1cmF0aW9uRWxlbWVudCwgb3IgbnVsbCBpZiBub3QgZm91bmQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0SXRlbUVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgZWxlbWVudCkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50Q0VzID0gY2UuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiAoZWxlbWVudENFcyAhPSBudWxsICYmIGVsZW1lbnRDRXMubGVuZ3RoICE9IDApID8gZWxlbWVudENFc1swXSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gWE1MIGF0dHJpYnV0ZSBmb3IgYW4gaXRlbS4KLQkgKiAKLQkgKiBAcGFyYW0gY2UgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjcmliaW5nIHRoZSBpdGVtCi0JICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIHRvIGZldGNoCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEl0ZW1BdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNlLCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGdpdmVuIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZm9yIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gYSBuZXdsaW5lLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhpcyBpdGVtLCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SXRlbURlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjZSkgewotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRJdGVtQXR0cmlidXRlKGNlLCBMQVVOQ0hfSVRFTVNfWE1MX0lURU1fREVTQ1JJUFRJT04sICIiKTsKLQkJcmV0dXJuIChkZXNjcmlwdGlvbi5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGFuIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGNlIHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzY3JpYmluZyB0aGUgaXRlbQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJdGVtTmFtZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJcmV0dXJuIGdldEl0ZW1BdHRyaWJ1dGUoY2UsIExBVU5DSF9JVEVNU19YTUxfQVRUUklCX05BTUUsCi0JCQlnZXRSZXNvdXJjZVN0cmluZygibGF1bmNoaXRlbS5NaXNzaW5nLm5hbWUiKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpY29uIGZvciBhbiBpdGVtLgotCSAqIAotCSAqIEBwYXJhbSBjZSB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2NyaWJpbmcgdGhlIGl0ZW0KLQkgKiBAcmV0dXJuIGFuIGljb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJdGVtSWNvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2UpIHsKLQkJU3RyaW5nIGljb25QYXRoID0gZ2V0SXRlbUF0dHJpYnV0ZShjZSwgTEFVTkNIX0lURU1TX1hNTF9JVEVNX0lDT04sICIiKTsKLQkJaWYgKGljb25QYXRoLmxlbmd0aCgpICE9IDApIHsKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBjZS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoc3ltYm9saWNOYW1lKTsKLQkJCUltYWdlIGljb24gPSBnZXRJbWFnZUZyb21QbHVnaW4oYnVuZGxlLCBpY29uUGF0aCk7Ci0JCQlpZiAoaWNvbiAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VbXSBuZXdJbWFnZXMgPSBuZXcgSW1hZ2VbaW1hZ2VzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VzLCAwLCBuZXdJbWFnZXMsIDAsIGltYWdlcy5sZW5ndGgpOwotCQkJCW5ld0ltYWdlc1tpbWFnZXMubGVuZ3RoXSA9IGljb247Ci0JCQkJaW1hZ2VzID0gbmV3SW1hZ2VzOwotCQkJCXJldHVybiBpY29uOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZXNbbGlHZW5lcmljRXhhbXBsZV07Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbiBpbWFnZSBmcm9tIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgZGlyZWN0b3J5LgotCSAqCi0JICogQHBhcmFtIGJ1bmRsZSB0aGUgcGx1Z2luIGRlc2NyaXB0b3IgZm9yIHRoZSBwbHVnaW4gd2l0aCB0aGUgaW1hZ2UKLQkgKiBAcGFyYW0gaWNvblBhdGggdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tUGx1Z2luKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpY29uUGF0aCkgewotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVybCwgaWNvblBhdGgpOwotCQkJaXMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJSW1hZ2VEYXRhIHNvdXJjZSA9IG5ldyBJbWFnZURhdGEoaXMpOwotCQkJSW1hZ2VEYXRhIG1hc2sgPSBzb3VyY2UuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgc291cmNlLCBtYXNrKTsKLQkJCXJldHVybiBpbWFnZTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIGlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9MYXVuY2hlclZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZWVhMjQ4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL0xhdW5jaGVyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi0vKioKLSAqIExhdW5jaGVyIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiAKLSAqIHRvIGxhdW5jaCB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBleGFtcGxlcy4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoZXJWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCXByaXZhdGUgU2hlbGwgd29ya2JlbmNoU2hlbGw7Ci0JCi0JcHJpdmF0ZSBUcmVlIGxhdW5jaFRyZWU7Ci0JcHJpdmF0ZSBUZXh0IGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBydW5CdXR0b247Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgTGF1bmNoZXJWaWV3LgotCSAqLwotCXB1YmxpYyBMYXVuY2hlclZpZXcoKSB7Ci0JCUxhdW5jaGVyUGx1Z2luLmluaXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXdvcmtiZW5jaFNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IFNwbGl0TGF5b3V0KCkpOwotCQkJCQotCQlHcm91cCBsYXVuY2hHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGF1bmNoR3JvdXAuc2V0VGV4dChMYXVuY2hlclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlldy5sYXVuY2hHcm91cC50ZXh0IikpOwotCQkKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF1bmNoR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCWxhdW5jaFRyZWUgPSBuZXcgVHJlZShsYXVuY2hHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhdW5jaFRyZWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxhdW5jaFRyZWUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBJdGVtRGVzY3JpcHRvciBpdGVtID0gZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJc2V0RGVzY3JpcHRpb25CeUl0ZW0oaXRlbSk7Ci0JCQkJaWYgKGl0ZW0uZ2V0TWFpblR5cGUoKSA9PSBudWxsICYmIGl0ZW0uZ2V0VmlldygpID09IG51bGwpIHsKLQkJCQkJLy8gQ2F0ZWdvcnkgc2VsZWN0ZWQsIHNvIGp1c3QgZXhwYW5kL2NvbGFwc2UgdGhlIG5vZGUKLQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCWJvb2xlYW4gZXhwYW5kZWQgPSB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpOwotCQkJCQlpZiAodHJlZUl0ZW0gIT0gbnVsbCkgdHJlZUl0ZW0uc2V0RXhwYW5kZWQoIWV4cGFuZGVkKTsKLQkJCQkJdHJlZUl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW2V4cGFuZGVkID8gTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXIgOiBMYXVuY2hlclBsdWdpbi5saU9wZW5Gb2xkZXJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYXVuY2hJdGVtKGdldFNlbGVjdGVkSXRlbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlsYXVuY2hUcmVlLmFkZFRyZWVMaXN0ZW5lcihuZXcgVHJlZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXZlbnQgZXZlbnQpIHsKLQkJCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQkJCQlpdGVtLnNldEltYWdlKExhdW5jaGVyUGx1Z2luLmltYWdlc1tMYXVuY2hlclBsdWdpbi5saUNsb3NlZEZvbGRlcl0pOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFdmVudCBldmVudCkgewotCQkJCWZpbmFsIFRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQkJCWl0ZW0uc2V0SW1hZ2UoTGF1bmNoZXJQbHVnaW4uaW1hZ2VzW0xhdW5jaGVyUGx1Z2luLmxpT3BlbkZvbGRlcl0pOwotCQkJfQotCQl9KTsKLQotCQlydW5CdXR0b24gPSBuZXcgQnV0dG9uKGxhdW5jaEdyb3VwLCBTV1QuUFVTSCk7Ci0JCXJ1bkJ1dHRvbi5zZXRUZXh0KExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2aWV3LmxhdW5jaEJ1dHRvbi50ZXh0IikpOwotCQlydW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlsYXVuY2hJdGVtKGdldFNlbGVjdGVkSXRlbSgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJfQotCQl9KTsKLQotCQlHcm91cCBkZXNjcmlwdGlvbkdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldFRleHQoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpZXcuZGVzY3JpcHRpb25Hcm91cC50ZXh0IikpOwotCQlkZXNjcmlwdGlvbkdyb3VwLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCWRlc2NyaXB0aW9uVGV4dCA9IG5ldyBUZXh0KGRlc2NyaXB0aW9uR3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfAotCQkJU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQotCQlzZXREZXNjcmlwdGlvbkJ5SXRlbShudWxsKTsKLQkJc2V0SXRlbURlc2NyaXB0b3JzKExhdW5jaGVyUGx1Z2luLmdldExhdW5jaEl0ZW1UcmVlKCkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCWxhdW5jaFRyZWUuc2V0Rm9jdXMoKTsKLQkJcnVuQnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihydW5CdXR0b24pOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXdvcmtiZW5jaFNoZWxsID0gbnVsbDsKLQkJbGF1bmNoVHJlZSA9IG51bGw7Ci0JCWRlc2NyaXB0aW9uVGV4dCA9IG51bGw7Ci0JCXJ1bkJ1dHRvbiA9IG51bGw7CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIGEgbmV3IGxhdW5jaCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBuZXdSb290IHRoZSBuZXcgdHJlZSBvZiBsYXVuY2ggaXRlbXMgZm9yIHRoZSBVSQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEl0ZW1EZXNjcmlwdG9ycyhmaW5hbCBJdGVtVHJlZU5vZGUgbmV3Um9vdCkgewotCQlpZiAod29ya2JlbmNoU2hlbGwgPT0gbnVsbCkgcmV0dXJuOwotCQl3b3JrYmVuY2hTaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICgobGF1bmNoVHJlZSA9PSBudWxsKSB8fCAobGF1bmNoVHJlZS5pc0Rpc3Bvc2VkKCkpKSByZXR1cm47Ci0JCQkJbGF1bmNoVHJlZS5yZW1vdmVBbGwoKTsKLQkJCQotCQkJCWZvciAoSXRlbVRyZWVOb2RlIG5vZGUgPSBuZXdSb290LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOwotCQkJCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWRvTm9kZShub2RlLCBuZXcgVHJlZUl0ZW0obGF1bmNoVHJlZSwgU1dULk5PTkUpKTsgLy8gdG9wLWxldmVsIFRyZWVJdGVtCi0JCQkJfQotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGFkZEdyb3VwKFRyZWVJdGVtIHBhcmVudCwgSXRlbVRyZWVOb2RlIG5vZGUpIHsKLQkJCQlmb3IgKDtub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJZG9Ob2RlKG5vZGUsIG5ldyBUcmVlSXRlbShwYXJlbnQsIFNXVC5OT05FKSk7IC8vIFRyZWVJdGVtIGF0IGRlcHRoID4gMAotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBkb05vZGUoSXRlbVRyZWVOb2RlIG5vZGUsIFRyZWVJdGVtIHRyZWVJdGVtKSB7Ci0JCQkJZmluYWwgSXRlbURlc2NyaXB0b3IgaXRlbSA9IG5vZGUuZ2V0RGVzY3JpcHRvcigpOwotCQkJCXRyZWVJdGVtLnNldFRleHQoaXRlbS5nZXROYW1lKCkpOwotCQkJCXRyZWVJdGVtLnNldERhdGEoaXRlbSk7Ci0JCQkJaWYgKG5vZGUuZ2V0RGVzY3JpcHRvcigpLmlzRm9sZGVyKCkpIHsKLQkJCQkJdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShMYXVuY2hlclBsdWdpbi5pbWFnZXNbTGF1bmNoZXJQbHVnaW4ubGlDbG9zZWRGb2xkZXJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0cmVlSXRlbS5zZXRJbWFnZShub2RlLmdldERlc2NyaXB0b3IoKS5nZXRJY29uKCkpOwotCQkJCX0KLQkJCQlhZGRHcm91cCh0cmVlSXRlbSwgbm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzcGVjaWZpZWQgbGF1bmNoIGl0ZW0uCi0JICogCi0JICogQHBhcmFtIGl0ZW1EZXNjcmlwdG9yIHRoZSBsYXVuY2ggaXRlbSB0byBleGVjdXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaEl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbURlc2NyaXB0b3IpIHsKLQkJLyogQ2FzZSAxOiBUaGUgbGF1bmNoIGl0ZW0gaXMgYSB2aWV3ICovCi0JCVN0cmluZyBwbHVnaW5WaWV3SWQgPSBpdGVtRGVzY3JpcHRvci5nZXRWaWV3ICgpOwotCQlpZiAocGx1Z2luVmlld0lkICE9IG51bGwpIHsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQgPSB0aGlzOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnRTaXRlIHdvcmtiZW5jaFBhcnRTaXRlID0gd29ya2JlbmNoUGFydC5nZXRTaXRlKCk7Ci0JCQlmaW5hbCBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoUGFydFNpdGUuZ2V0UGFnZSgpOwotCQkJdHJ5IHsKLQkJCQl3b3JrYmVuY2hQYWdlLnNob3dWaWV3KHBsdWdpblZpZXdJZCk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5JbnZvY2F0aW9uIiksIGUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIENhc2UgMjogVGhlIGxhdW5jaCBpdGVtIGlzIGEgc3RhbmRhbG9uZSBwcm9ncmFtICovCi0JCWlmICh3b3JrYmVuY2hTaGVsbCA9PSBudWxsKSByZXR1cm47Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaW5zdGFuY2UgPSBpdGVtRGVzY3JpcHRvci5jcmVhdGVJdGVtSW5zdGFuY2UoKTsKLQkJCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoU2hlbGwuZ2V0RGlzcGxheSgpOwotCQkJCU1ldGhvZCBvcGVuTWV0aG9kID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgib3BlbiIsIG5ldyBDbGFzc1tdIHtEaXNwbGF5LmNsYXNzfSk7Ci0JCQkJb3Blbk1ldGhvZC5pbnZva2UoaW5zdGFuY2UsIG5ldyBPYmplY3RbXSB7ZGlzcGxheX0pOwotCQkJfQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5Eb2VzTm90SW1wbGVtZW50TWV0aG9kIiksIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGF1bmNoZXJQbHVnaW4ubG9nRXJyb3IoTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bi5lcnJvci5Db3VsZE5vdEluc3RhbnRpYXRlQ2xhc3MiKSwgZSk7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIE9idGFpbnMgdGhlIHNlbGVjdGVkIGxhdW5jaCBpdGVtLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBJdGVtRGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgSXRlbURlc2NyaXB0b3IgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlmaW5hbCBUcmVlSXRlbVtdIHNlbGVjdGlvbnMgPSBsYXVuY2hUcmVlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9ucy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7Ci0JCWZpbmFsIEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yID0gKEl0ZW1EZXNjcmlwdG9yKSBzZWxlY3Rpb25zWzBdLmdldERhdGEoKTsKLQkJcmV0dXJuIGl0ZW1EZXNjcmlwdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBkZXNjcmlwdGlvbiB0ZXh0IHRvIHJlZmxlY3QgdGhhdCBvZiBhIHBhcnRpY3VsYXIgSXRlbURlc2NyaXB0b3IuCi0JICoKLQkgKiBAcGFyYW0gaXRlbURlc2NyaXB0b3IgdGhlIGxhdW5jaCBpdGVtIHdob3NlIGRlc2NyaXB0aW9uIGlzIHRvIGJlIGRpc3BsYXllZCwgb3IgbnVsbCBpZiBub25lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERlc2NyaXB0aW9uQnlJdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW1EZXNjcmlwdG9yKSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJaWYgKGl0ZW1EZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gTGF1bmNoZXJQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImxhdW5jaGl0ZW0uTnVsbC5kZXNjcmlwdGlvbiIpOwotCQkJaWYgKHJ1bkJ1dHRvbiAhPSBudWxsKSBydW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXNjcmlwdGlvbiA9IGl0ZW1EZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IExhdW5jaGVyUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJsYXVuY2hpdGVtLk1pc3NpbmcuZGVzY3JpcHRpb24iKTsKLQkJCWlmIChydW5CdXR0b24gIT0gbnVsbCkgewotCQkJCXJ1bkJ1dHRvbi5zZXRFbmFibGVkKGl0ZW1EZXNjcmlwdG9yLmdldFZpZXcoKSAhPSBudWxsIHx8IGl0ZW1EZXNjcmlwdG9yLmdldE1haW5UeXBlKCkgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXVuY2hlci9TcGxpdExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjM3YWYxLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xhdW5jaGVyL1NwbGl0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlcjsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQSBMYXlvdXQgY2xhc3MgdGhhdCBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzIGZyb20gYSBob3Jpem9udGFsIHNwbGl0IHRvIGEgdmVydGljYWwKLSAqIHNwbGl0IGxheW91dCB0byBhY2NvbW9kYXRlIGNoYW5naW5nIHNpemUgY29uZGl0aW9ucy4KLSAqIAotICogTGF0ZXIgb24gd2UgbWlnaHQgaW1wcm92ZSB0aGlzIGNsYXNzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSAicHJlZmVycmVkIiBzaXplIG9mCi0gKiB0aGUgd2lkZ2V0cy4KLSAqLwotcHVibGljIGNsYXNzIFNwbGl0TGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQKLQkJc3BsaXRIb3Jpem9udGFsbHkgPSAwLAotCQlzcGxpdFZlcnRpY2FsbHkgPSAxOwotCXByaXZhdGUgaW50IHNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0KLQlwdWJsaWMgaW50IHNwYWNpbmcgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luVG9wID0gMzsKLQlwdWJsaWMgaW50IG1hcmdpbkxlZnQgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luUmlnaHQgPSAzOwotCXB1YmxpYyBpbnQgbWFyZ2luQm90dG9tID0gMzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGF5b3V0Ci0JICovCi0JcHVibGljIFNwbGl0TGF5b3V0KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgTGF5b3V0I2NvbXB1dGVTaXplKENvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQlpZiAoaEhpbnQgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQlQb2ludCBoU3BsaXRTaXplID0gY29tcHV0ZUhTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCVBvaW50IHZTcGxpdFNpemUgPSBjb21wdXRlVlNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmFsc2UpOwotCQkJCWludCBoU3BsaXRBcmVhID0gaFNwbGl0U2l6ZS54ICogaFNwbGl0U2l6ZS55OwotCQkJCWludCB2U3BsaXRBcmVhID0gdlNwbGl0U2l6ZS54ICogdlNwbGl0U2l6ZS55OwotCQkJCS8vIENob29zZSBkaXJlY3Rpb24gY29uc3VtaW5nIGxlYXN0IGFyZWEKLQkJCQlpZiAoaFNwbGl0QXJlYSA8IHZTcGxpdEFyZWEpIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdEhvcml6b250YWxseTsKLQkJCQkJcmV0dXJuIGhTcGxpdFNpemU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJCXJldHVybiB2U3BsaXRTaXplOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQ29uc3RyYWluZWQgaW4gaGVpZ2h0OiBzcGxpdCB2ZXJ0aWNhbGx5Ci0JCQkJc3BsaXREaXJlY3Rpb24gPSBzcGxpdFZlcnRpY2FsbHk7Ci0JCQkJcmV0dXJuIGNvbXB1dGVWU3BsaXRTaXplKGNvbXBvc2l0ZSwgd0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCkgewotCQkJCS8vIENvbnN0cmFpbmVkIGluIHdpZHRoOiBzcGxpdCBob3Jpem9udGFsbHkKLQkJCQlzcGxpdERpcmVjdGlvbiA9IHNwbGl0SG9yaXpvbnRhbGx5OwotCQkJCXJldHVybiBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChoSGludCA8IHdIaW50KSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRWZXJ0aWNhbGx5OwotCQkJCQlyZXR1cm4gY29tcHV0ZVZTcGxpdFNpemUoY29tcG9zaXRlLCB3SGludCwgaEhpbnQsIGZsdXNoQ2FjaGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNwbGl0RGlyZWN0aW9uID0gc3BsaXRIb3Jpem9udGFsbHk7Ci0JCQkJCXJldHVybiBjb21wdXRlSFNwbGl0U2l6ZShjb21wb3NpdGUsIHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQkJfQkJCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBMYXlvdXQjbGF5b3V0KENvbXBvc2l0ZSwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkJY29tcHV0ZVNpemUoY29tcG9zaXRlLCBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCwgZmFsc2UpOwotCQkKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWNsaWVudEFyZWEueCArPSBtYXJnaW5MZWZ0OwotCQljbGllbnRBcmVhLnkgKz0gbWFyZ2luVG9wOwotCQljbGllbnRBcmVhLndpZHRoIC09IG1hcmdpblJpZ2h0ICsgbWFyZ2luTGVmdDsKLQkJY2xpZW50QXJlYS5oZWlnaHQgLT0gbWFyZ2luQm90dG9tICsgbWFyZ2luVG9wOwotCQlQb2ludCBwb3NpdGlvbiA9IG5ldyBQb2ludChjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCQkJZmluYWwgQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJZmluYWwgUmVjdGFuZ2xlIGJvdW5kczsKLQkJCWlmIChzcGxpdERpcmVjdGlvbiA9PSBzcGxpdEhvcml6b250YWxseSkgewotCQkJCWludCBoZWlnaHQgPSBjbGllbnRBcmVhLmhlaWdodCAvIGNoaWxkcmVuLmxlbmd0aDsKLQkJCQlib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIGNsaWVudEFyZWEud2lkdGgsIGhlaWdodCk7Ci0JCQkJcG9zaXRpb24ueSArPSBoZWlnaHQgKyBzcGFjaW5nOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgd2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC8gY2hpbGRyZW4ubGVuZ3RoOwotCQkJCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGNsaWVudEFyZWEuaGVpZ2h0KTsKLQkJCQlwb3NpdGlvbi54ICs9IHdpZHRoICsgc3BhY2luZzsKLQkJCX0KLQkJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KGJvdW5kcy53aWR0aCwgMCk7Ci0JCQlib3VuZHMuaGVpZ2h0ID0gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgMCk7Ci0JCQljaGlsZC5zZXRCb3VuZHMoYm91bmRzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZUhTcGxpdFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlQb2ludCBzaXplID0gbmV3IFBvaW50KG1hcmdpbkxlZnQgKyBtYXJnaW5SaWdodCwgbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tKTsKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWZpbmFsIENvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQotCQkJUG9pbnQgY2hpbGRTaXplID0gY2hpbGQuY29tcHV0ZVNpemUod0hpbnQsIGhIaW50LCBmbHVzaENhY2hlKTsKLQkJCXNpemUueCA9IE1hdGgubWF4KHNpemUueCwgY2hpbGRTaXplLngpOwotCQkJc2l6ZS55ICs9IGNoaWxkU2l6ZS55ICsgc3BhY2luZzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVWU3BsaXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUG9pbnQgc2l6ZSA9IG5ldyBQb2ludChtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQsIG1hcmdpblRvcCArIG1hcmdpbkJvdHRvbSk7Ci0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0KLQkJCVBvaW50IGNoaWxkU2l6ZSA9IGNoaWxkLmNvbXB1dGVTaXplKHdIaW50LCBoSGludCwgZmx1c2hDYWNoZSk7Ci0JCQlzaXplLnggKz0gY2hpbGRTaXplLnggKyBzcGFjaW5nOwotCQkJc2l6ZS55ID0gTWF0aC5tYXgoc2l6ZS55LCBjaGlsZFNpemUueSk7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZjMmNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjUzNjJlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjE0OjAzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGU1NWQ1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5sYXlvdXRzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL2RvYy1odG1sL3N3dF9sYXlvdXRfZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MjlmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9kb2MtaHRtbC9zd3RfbGF5b3V0X2V4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDAwLCAyMDA1LiBUaGlzIHBhZ2UgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgbGljZW5zZS4gRm9yIGZ1bGwgZGV0YWlscyBzZWUgdGhlIExFR0FMIGluIHRoZSBkb2N1bWVudGF0aW9uIGJvb2sgdGhhdCBjb250YWlucyB0aGlzIHBhZ2UuIiA+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDx0aXRsZT5TV1QgLSBMYXlvdXQgRXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gTGF5b3V0czwvaDI+Ci0KLTxwPgotVGhpcyBleGFtcGxlIGlzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgY29tbW9uIFNXVCBsYXlvdXRzLiAKLUl0IGNvbnNpc3RzIG9mIGEgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUgCi11c2VyIHRvIGludGVyYWN0IHdpdGggYSBkaWZmZXJlbnQgU1dUIGxheW91dC4KLVRoZSB1c2VyIGNhbiBpbnNlcnQgd2lkZ2V0cyBpbnRvIGEgbGF5b3V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgbGF5b3V0IGRhdGEKLXVzaW5nIGEgcHJvcGVydHkgc2hlZXQuICBXaGVuIHRoZSB1c2VyIGhhcyBhIHN1aXRhYmxlIGFycmFuZ2VtZW50LCB0aGUgdW5kZXJseWluZwotY29kZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNsaWNraW5nIG9uIHRoZSA8c3Ryb25nPkNvZGU8L3N0cm9uZz4gYnV0dG9uLgotPC9wPgotCi08aDM+UnVubmluZyB0aGUgZXhhbXBsZTwvaDM+Ci08cD4KLUZvbGxvdyB0aGUgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzL2RvYy1odG1sL3N3dF9tYW51YWxfc2V0dXAuaHRtbCI+U1dUIHN0YW5kYWxvbmUgZXhhbXBsZXMgc2V0dXA8L2E+IAotaW5zdHJ1Y3Rpb25zIHRvIGluc3RhbGwgYW5kIHJ1biB0aGUgZXhhbXBsZSBmcm9tIHlvdXIgd29ya3NwYWNlLgotPC9wPgotPHA+Ci1UaGUgIk1haW4iIGNsYXNzIGlzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlLkxheW91dEV4YW1wbGU8L2NvZGU+LgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPkxheW91dHM8L3N0cm9uZz4gaXRlbSBmcm9tIHRoZSA8c3Ryb25nPldvcmtiZW5jaCBWaWV3czwvc3Ryb25nPiBjYXRlZ29yeSBhbmQgY2xpY2sgPHN0cm9uZz5SdW48L3N0cm9uZz4uCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvaWNvbnMvbGF5b3V0c19leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NWRkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9pY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYmRiMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUTGF5b3V0RXhhbXBsZS5uYW1lID0gU1dUIExheW91dCBFeGFtcGxlIFBsdWdpbgotY2F0ZWdvcnkuU1dURXhhbXBsZXMubmFtZSA9IFNXVCBFeGFtcGxlcwotdmlldy5MYXlvdXRFeGFtcGxlLm5hbWUgPSBTV1QgTGF5b3V0cwotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLkxheW91dEV4YW1wbGUubmFtZSA9IExheW91dHMKLWxhdW5jaGl0ZW0uTGF5b3V0RXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbiBvZiBjb21tb24gU1dUIGxheW91dHMuIFxuXG5cCi0JSXQgY29uc2lzdHMgb2YgYSB0YWIgZm9sZGVyIHdoZXJlIGVhY2ggdGFiIGFsbG93cyB0aGUgXAotCXVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGRpZmZlcmVudCBTV1QgbGF5b3V0LlwKLQlUaGUgdXNlciBjYW4gaW5zZXJ0IHdpZGdldHMgaW50byBhIGxheW91dCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxheW91dCBkYXRhIFwKLQl1c2luZyBhIHByb3BlcnR5IHNoZWV0LiAgV2hlbiB0aGUgdXNlciBoYXMgYSBzdWl0YWJsZSBhcnJhbmdlbWVudCwgY29kZSBjYW4gYmUgXAotCWdlbmVyYXRlZCBieSBjbGlja2luZyBvbiB0aGUgQ29kZSBidXR0b24uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MjNiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cyIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUTGF5b3V0RXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzLkxheW91dFBsdWdpbiI+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTwhLS0gUnVudGltZSAtLT4KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ibGF5b3V0cy5qYXIiPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPCEtLSBSZXF1aXJlZCBwbHVnaW5zIC0tPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJXZpZXcuTGF5b3V0RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvbGF5b3V0c19leGFtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMuTGF5b3V0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci5sYXVuY2hJdGVtcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxpdGVtCi0gICAgICAgICAgICBuYW1lPSIlbGF1bmNoaXRlbS5MYXlvdXRFeGFtcGxlLm5hbWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9sYXlvdXRzX2V4YW1wbGUuZ2lmIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hpdGVtLkxheW91dEV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy52aWV3bGF1bmNoZXIiPgotICAgICAgICAgPHZpZXcKLSAgICAgICAgICAgICAgIHZpZXdJZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvaW1wb3J0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDFkYWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkMmRhMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL2xheW91dHMvTGF5b3V0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMYXlvdXRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRzL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvbGF5b3V0cy9MYXlvdXRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjliM2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxheW91dHMvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9sYXlvdXRzL0xheW91dFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF5b3V0czsKLQotIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXlvdXRleGFtcGxlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogPGNvZGU+TGF5b3V0czwvY29kZT4gaXMgYSBzaW1wbGUgZGVtb25zdHJhdGlvbgotICogb2YgdGhlIGxheW91dHMgZGVmaW5lZCBieSBTV1QuICBJdCBjb25zaXN0cyBvZiBhIHdvcmtiZW5jaAotICogdmlldyBhbmQgdGFiIGZvbGRlciB3aGVyZSBlYWNoIHRhYiBpbiB0aGUgZm9sZGVyIGFsbG93cyB0aGUKLSAqIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aCBhIGxheW91dC4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgTGF5b3V0VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlMYXlvdXRFeGFtcGxlIGluc3RhbmNlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGV4YW1wbGUKLQkgKiAKLQkgKiBAc2VlIFZpZXdQYXJ0I2NyZWF0ZVBhcnRDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGZyYW1lKSB7Ci0JCWluc3RhbmNlID0gbmV3IExheW91dEV4YW1wbGUoZnJhbWUpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgVmlldyBpcyB0byBiZSBkaXNwb3NlZAotCSAqLwkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbnN0YW5jZS5kaXNwb3NlKCk7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDBmNjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhZDg2OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjEzOjU0IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmZlNzYwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0gICAgICAgICAgICAKLXNvdXJjZS5vbGV3aW4zMi5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2RvYy1odG1sL3N3dF9vbGVfZXguaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjdkYThlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvZG9jLWh0bWwvc3d0X29sZV9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gT0xFIFdlYiBCcm93c2VyPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDI+U1dUIGV4YW1wbGUgLSBPTEUgV2ViIEJyb3dzZXI8L2gyPgotCi08cD4KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gZW1iZWQgYW4gQWN0aXZlIFggY29udHJvbCBpbnRvIGFuIFNXVCBhcHBsaWNhdGlvbiBvciBhbiBFY2xpcHNlIHZpZXcuCi08L3A+Ci08cD4KLVdoZW4gdGhlIHZpZXcgaXMgb3BlbmVkLCBpdCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgV2luZG93cyBJbnRlcm5ldCBFeHBsb3JlcgotY29udHJvbC4gIFRoZSBPTEUgd2ViIGJyb3dzZXIgaGFzCi08c3Ryb25nPkJhY2s8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Rm9yd2FyZDwvc3Ryb25nPiBidXR0b25zIHRvIHRha2UgeW91IHRvIHJlY2VudGx5IHZpc2l0ZWQgcGFnZXMuICBUaGUgYnJvd3NlciBhbHNvIGNvbnRhaW5zCi1hIDxzdHJvbmc+SG9tZTwvc3Ryb25nPiBidXR0b24gdG8gdGFrZSB5b3UgdG8gdGhlIHdlYiBicm93c2VyJ3MgaG9tZSBwYWdlLCBhIDxzdHJvbmc+U3RvcDwvc3Ryb25nPiBidXR0b24gd2hpY2ggc3RvcHMgdGhlIAotY3VycmVudCB0cmFuc2ZlciwgYSA8c3Ryb25nPlNlYXJjaDwvc3Ryb25nPiBidXR0b24gd2hpY2ggd2lsbCBzZWFyY2ggZm9yIHRleHQgdHlwZWQgaW4gdGhlIDxzdHJvbmc+QWRkcmVzczwvc3Ryb25nPiB0ZXh0IGZpZWxkLCBhbmQKLWEgPHN0cm9uZz5SZWZyZXNoPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCByZS1kcmF3cyB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZS4gVGhlcmUgaXMgYWxzbyBhCi08c3Ryb25nPkdvPC9zdHJvbmc+IGJ1dHRvbiB3aGljaCwgd2hlbiBjbGlja2VkLCB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgcGFnZSBzcGVjaWZpZWQgaW4gdGhlIDxzdHJvbmc+QWRkcmVzczwvc3Ryb25nPiBmaWVsZC4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+ICZndDsgPHN0cm9uZz5PdGhlcjwvc3Ryb25nPi4gIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QKLXRoZSB2aWV3IG5hbWVkIDxzdHJvbmc+T0xFIFdlYiBCcm93c2VyICh3aW4zMik8L3N0cm9uZz4uIEEgdmlldyBjb250YWluaW5nIGEgd2ViIGJyb3dzZXIgd2lsbCBhcHBlYXIuCi08L3A+Ci08cD4KLVRoaXMgZXhhbXBsZSBjYW4gYWxzbyBiZSBydW4gdXNpbmcgdGhlIDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hlci9kb2MtaHRtbC9zd3RfbGF1bmNoZXJfZXguaHRtbCI+RXhhbXBsZSBMYXVuY2hlcjwvYT4uCi1TZWxlY3QgdGhlIDxzdHJvbmc+T0xFIFdlYiBCcm93c2VyPC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5XaW4zMiBvbmx5PC9zdHJvbmc+IGNhdGVnb3J5IGFuZCBjbGljayA8c3Ryb25nPlJ1bjwvc3Ryb25nPi4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWZjZjQxYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2ZvcndhcmRfbmF2LmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjliNmFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvZm9yd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9ob21lX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdhMjMwNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvcmVmcmVzaF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyNzBlMTguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zZWFyY2hfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzNhYzkxYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3NlYXJjaF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9pY29ucy9zdG9wX25hdi5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUzZDM0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvaWNvbnMvd2ViYnJvd3Nlcl9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk1ZTIyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL2ljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTQzMjkzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLXBsdWdpbi5TV1RPTEVFeGFtcGxlLm5hbWUgPSBTV1QgT0xFIEV4YW1wbGUgUGx1Z2luIChXaW4zMikKLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSA9IE9MRSBXZWIgQnJvd3NlciAoV2luMzIpCi0KLWxhdW5jaGNhdGVnb3J5LlNXVFdpbjMyT25seUV4YW1wbGVzLm5hbWUgPSBXaW4zMiBvbmx5Ci1sYXVuY2hjYXRlZ29yeS5TV1RXaW4zMk9ubHlFeGFtcGxlcy5kZXNjcmlwdGlvbiA9IFwKLQlBIGNvbGxlY3Rpb24gb2YgU3RhbmRhcmQgV2lkZ2V0IFRvb2xraXQgZXhhbXBsZXMgZm9yIFdpbmRvd3Mgc3lzdGVtcyBvbmx5LgotCi1sYXVuY2hpdGVtLk9MRVdlYkJyb3dzZXJFeGFtcGxlLm5hbWUgPSBPTEUgV2ViIEJyb3dzZXIKLWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24gPSBcCi0JVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZW1iZWQgYW4gQWN0aXZlIFggY29udHJvbCBpbnRvIGFuIFNXVCBhcHBsaWNhdGlvbiBvciBhbiBFY2xpcHNlIHZpZXcuXG5cblwKLQlXaGVuIHRoZSB2aWV3IGlzIG9wZW5lZCwgaXQgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFdpbmRvd3MgSW50ZXJuZXQgRXhwbG9yZXIgXAotCWNvbnRyb2wuICBUaGUgT0xFIFdlYiBCcm93c2VyIGhhcyBcCi0JQmFjayBhbmQgRm9yd2FyZCBidXR0b25zIHRvIHRha2UgeW91IHRvIHJlY2VudGx5IHZpc2l0ZWQgcGFnZXMuICBUaGUgYnJvd3NlciBhbHNvIGNvbnRhaW5zIFwKLQlhIEhvbWUgYnV0dG9uIHRvIHRha2UgeW91IHRvIHRoZSB3ZWIgYnJvd3NlcidzIGhvbWUgcGFnZSwgYSBTdG9wIGJ1dHRvbiB3aGljaCBzdG9wcyB0aGUgXAotCWN1cnJlbnQgdHJhbnNmZXIsIGEgU2VhcmNoIGJ1dHRvbiB3aGljaCB3aWxsIHNlYXJjaCBmb3IgdGV4dCB0eXBlZCBpbiB0aGUgQWRkcmVzcyB0ZXh0IGZpZWxkLCBhbmQgXAotCWEgUmVmcmVzaCBidXR0b24gd2hpY2ggcmUtZHJhd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBhZ2UuIFRoZXJlIGlzIGFsc28gYSBcCi0JR28gYnV0dG9uIHdoaWNoLCB3aGVuIGNsaWNrZWQsIHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBwYWdlIHNwZWNpZmllZCBpbiB0aGUgQWRkcmVzcyBmaWVsZC4KLQotYnJvd3Nlci5CYWNrLnRleHQgPSBCYWNrd2FyZAotYnJvd3Nlci5CYWNrLnRvb2x0aXAgPSBHbyB0byBwcmV2aW91cyBXZWIgc2l0ZSBpbiB0aGUgaGlzdG9yeSBsaXN0Ci0KLWJyb3dzZXIuRm9yd2FyZC50ZXh0ID0gRm9yd2FyZAotYnJvd3Nlci5Gb3J3YXJkLnRvb2x0aXAgPSBHbyB0byBuZXh0IFdlYiBzaXRlIGluIHRoZSBoaXN0b3J5IGxpc3QKLQotYnJvd3Nlci5Ib21lLnRleHQgPSBIb21lCi1icm93c2VyLkhvbWUudG9vbHRpcCA9IEdvIHRvIGhvbWUgV2ViIHNpdGUKLQotYnJvd3Nlci5TdG9wLnRleHQgPSBTdG9wCi1icm93c2VyLlN0b3AudG9vbHRpcCA9IFN0b3AgbG9hZGluZyBjdXJyZW50IFdlYiBzaXRlCi0KLWJyb3dzZXIuUmVmcmVzaC50ZXh0ID0gUmVmcmVzaAotYnJvd3Nlci5SZWZyZXNoLnRvb2x0aXAgPSBSZWZyZXNoIGN1cnJlbnQgV2ViIHNpdGUKLQotYnJvd3Nlci5TZWFyY2gudGV4dCA9IFNlYXJjaAotYnJvd3Nlci5TZWFyY2gudG9vbHRpcCA9IFNlYXJjaCB0aGUgV2ViCi0KLWJyb3dzZXIuQWRkcmVzcy5sYWJlbCA9IEFkZHJlc3MgOgotCi1icm93c2VyLkdvLnRleHQgPSBHbwotCi1icm93c2VyLlN0YXRlLlVuaW5pdGlhbGl6ZWQudGV4dCA9IE5vdCByZWFkeS4KLWJyb3dzZXIuU3RhdGUuTG9hZGluZy50ZXh0ID0gTG9hZGluZyBXZWIgc2l0ZS4uLgotYnJvd3Nlci5TdGF0ZS5Mb2FkZWQudGV4dCA9IFJlYWR5LgotYnJvd3Nlci5TdGF0ZS5JbnRlcmFjdGl2ZS50ZXh0ID0gTG9hZGluZyBXZWIgc2l0ZS4uLgotYnJvd3Nlci5TdGF0ZS5Db21wbGV0ZS50ZXh0ID0gRG9uZS4KLQotZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzID0gVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2VzCi1lcnJvci5Db3VsZE5vdENyZWF0ZUJyb3dzZXJDb250cm9sID0gVW5hYmxlIHRvIGNyZWF0ZSA8PEJyb3dzZXIgQ29udHJvbD4+Ci0KLWxhdW5jaGl0ZW0uT0xFRXhhbXBsZS5uYW1lPU9MRSBFeGFtcGxlCi1sYXVuY2hpdGVtLk9MRUV4YW1wbGUuZGVzY3JpcHRpb249XAotCVRoZSBPTEUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGVtYmVkIGFuIEFjdGl2ZSBYIGNvbnRyb2wgaW50byBcCi0JYW4gU1dUIGFwcGxpY2F0aW9uLlxuXG5cCi0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4ZTdmNWUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gRmlsZSB3cml0dGVuIGJ5IFBERSAxLjAgLS0+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMiIKLSAgIG5hbWU9IiVwbHVnaW4uU1dUT0xFRXhhbXBsZS5uYW1lIgotICAgdmVyc2lvbj0iMy4xLjEwMC5xdWFsaWZpZXIiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuT2xlUGx1Z2luIj4KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLTxyZXF1aXJlcz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci08L3JlcXVpcmVzPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci08IS0tIFJ1bnRpbWUgLS0+Ci08cnVudGltZT4KLSAgIDxsaWJyYXJ5IG5hbWU9Im9sZXdpbjMyLmphciI+Ci0gICA8L2xpYnJhcnk+Ci08L3J1bnRpbWU+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICA8dmlldwotICAgICAgICAgbmFtZT0iJXZpZXcuT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgIGljb249Imljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuT2xlQnJvd3NlclZpZXciCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi5icm93c2VyVmlldyI+Ci0gICA8L3ZpZXc+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgPGNhdGVnb3J5Ci0gICAgICAgICBuYW1lPSIlbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoY2F0ZWdvcnkuU1dUV2luMzJPbmx5RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFdpbjMyT25seUNhdGVnb3J5Ij4KLSAgIDwvY2F0ZWdvcnk+Ci0gICA8aXRlbQotICAgICAgICAgbmFtZT0iJWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUubmFtZSIKLSAgICAgICAgIGljb249Imljb25zL3dlYmJyb3dzZXJfZXhhbXBsZS5naWYiCi0gICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uT0xFV2ViQnJvd3NlckV4YW1wbGUuZGVzY3JpcHRpb24iCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFdpbjMyT25seUNhdGVnb3J5IgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIudmlld2xhdW5jaGVyIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICB2aWV3SWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuYnJvd3NlclZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLk9MRUV4YW1wbGUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PTEVFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hXaW4zMk9ubHlDYXRlZ29yeSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIuT0xFRXhhbXBsZSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvaW1wb3J0LnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9pbXBvcnQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGVyc2lzdCBwcm9qZWN0IHNldHRpbmdzIGZvciBsYXRlciBpbXBvcnQgCi1uYXR1cmVzID0gb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTsgb3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZQotYnVpbGRlcnMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjsgb3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXIKLXZhci5FQ0xJUFNFX1BMVUdJTlMgPSA8PEVDTElQU0VfUExVR0lOUz4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09MRUV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT0xFRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE2YzllLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT0xFRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBPTEVFeGFtcGxlIGlzIGFuIGV4YW1wbGUgdGhhdCB1c2VzIDxjb2RlPm9yZy5lY2xpcHNlLnN3dDwvY29kZT4gCi0gKiBsaWJyYXJpZXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIFNXVCB3aW5kb3cgdGhhdCBjYW4gaG9zdCBkaWZmZXJlbnQgQWN0aXZlIFgKLSAqIGNvbnRyb2xzLgotICoKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLXB1YmxpYyBjbGFzcyBPTEVFeGFtcGxlIHsKLQotCU9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQlPbGVGcmFtZSBvbGVGcmFtZTsKLQlCdXR0b24gY2xvc2VCdXR0b247Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlPTEVFeGFtcGxlIGV4YW1wbGUgPSBuZXcgT0xFRXhhbXBsZSgpOwotCQlleGFtcGxlLm9wZW4oZGlzcGxheSk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCS8qKiAKLQkgKiBDcmVhdGUgYSBmaWxlIEV4aXQgbWVudSBpdGVtIAotCSAqLwotCXZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBzaGVsbC5nZXRNZW51QmFyKCk7Ci0JCWlmIChtZW51QmFyID09IG51bGwpIHsKLQkJCW1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQl9Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCQkKLQkJTWVudUl0ZW0gbWVudUZpbGVFeGl0ID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlRXhpdC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlRXhpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgZGlzcG9zZUNsaWVudCgpIHsKLQkJaWYgKGNsaWVudFNpdGUgIT0gbnVsbCkKLQkJCWNsaWVudFNpdGUuZGlzcG9zZSgpOwotCQljbGllbnRTaXRlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgZm9yIGEgZmlsZSBhbmQgdHJ5IHRvIG9wZW4gaXQgd2l0aCBzb21lIGtub3duIEFjdGl2ZVggY29udHJvbHMuCi0JICovCi0Jdm9pZCBmaWxlT3BlbigpIHsKLQkJU2hlbGwgc2hlbGwgPSBvbGVGcmFtZS5nZXRTaGVsbCgpOwotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKSByZXR1cm47Ci0KLQkJZGlzcG9zZUNsaWVudCgpOwotCi0JCS8vIHRyeSBvcGVuaW5nIGEgLmRvYyBmaWxlIHVzaW5nIFdvcmQKLQkJaWYgKGNsaWVudFNpdGUgPT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiZG9jIikgfHwgCi0JCQkJCQlmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInJ0ZiIpIHx8Ci0JCQkJCQlmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInR4dCIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiV29yZC5Eb2N1bWVudCIsIG5ldyBGaWxlKGZpbGVOYW1lKSk7Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRyeSBvcGVuaW5nIGEgeGxzIGZpbGUgd2l0aCBFeGNlbAotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4bHMiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIkV4Y2VsLlNoZWV0IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yMikgewotCQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gdHJ5IG9wZW5pbmcgYSBtZWRpYSBmaWxlIHdpdGggTVBsYXllcgotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJtcGEiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIk1QbGF5ZXIiLCBuZXcgRmlsZShmaWxlTmFtZSkpOwotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0cnkgb3BlbmluZyB3aXRoIHdtdiwgbXBnLCBtcGVnLCBhdmksIGFzZiwgd2F2IHdpdGggV01QbGF5ZXIKLQkJaWYgKGNsaWVudFNpdGUgPT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgid212IikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgibXBnIikKLQkJCQkJCXx8IGZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgibXBlZyIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImF2aSIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImFzZiIpCi0JCQkJCQl8fCBmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoIndhdiIpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiV01QbGF5ZXIuT0NYIik7Ci0JCQkJCQlPbGVBdXRvbWF0aW9uIHBsYXllciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotCQkJCQkJaW50IHBsYXlVUkxbXSA9IHBsYXllci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJVUkwiIH0pOwotCQkJCQkJaWYgKHBsYXlVUkwgIT0gbnVsbCkgewotCQkJCQkJCWJvb2xlYW4gc3VjZWVkZWQgPSBwbGF5ZXIuc2V0UHJvcGVydHkocGxheVVSTFswXSwgbmV3IFZhcmlhbnQoZmlsZU5hbWUpKTsKLQkJCQkJCQlpZiAoIXN1Y2VlZGVkKQotCQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJCX0KLQkJCQkJCXBsYXllci5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHRyeSBvcGVuaW5nIGEgUERGIGZpbGUgd2l0aCBBY3JvYmF0IHJlYWRlcgotCQlpZiAoY2xpZW50U2l0ZSA9PSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJwZGYiKSkgewotCQkJCQl0cnkgewotCQkJCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIlBERi5QZGZDdHJsLjUiKTsKLQkJCQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQkJCQkgICAgT2xlQXV0b21hdGlvbiBwZGYgPSBuZXcgT2xlQXV0b21hdGlvbiAoY2xpZW50U2l0ZSk7Ci0JCQkJCSAgICBpbnQgbG9hZEZpbGVbXSA9IHBkZi5nZXRJRHNPZk5hbWVzIChuZXcgU3RyaW5nIFtdIHsiTG9hZEZpbGUifSk7Ci0JCQkJCSAgICBpZiAobG9hZEZpbGUgIT0gbnVsbCkgewotCQkJCQkgICAgCVZhcmlhbnQgcmVzdWx0ID0gcGRmLmludm9rZShsb2FkRmlsZVswXSwgbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZmlsZU5hbWUpfSk7Ci0JCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXN1bHQuZGlzcG9zZSgpOwotCQkJCQkgICAgfSBlbHNlIHsKLQkJCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBwZGYuZGlzcG9zZSgpOwotCQkJCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXJyb3IyKSB7Ci0JCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0cnkgb3BlbmluZyB3aXRoIEV4cGxvcmVyCi0JCWlmIChjbGllbnRTaXRlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgIlNoZWxsLkV4cGxvcmVyIik7Ci0JCQkJT2xlQXV0b21hdGlvbiBleHBsb3JlciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNsaWVudFNpdGUpOwotCQkJCWludFtdIG5hdmlnYXRlID0gZXhwbG9yZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIn0pOyAKLQkJCQkKLQkJCQlpZiAobmF2aWdhdGUgIT0gbnVsbCkgewotCQkJCQlWYXJpYW50IHJlc3VsdCA9IGV4cGxvcmVyLmludm9rZShuYXZpZ2F0ZVswXSwgbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoZmlsZU5hbWUpfSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCWRpc3Bvc2VDbGllbnQoKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0LmRpc3Bvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQkJfQotCQkJCWV4cGxvcmVyLmRpc3Bvc2UoKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlcnJvcjIpIHsKLQkJCQlkaXNwb3NlQ2xpZW50KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY2xpZW50U2l0ZSAhPSBudWxsKXsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQl9Ci0JfQotCi0Jdm9pZCBuZXdDbGllbnRTaXRlKFN0cmluZyBwcm9nSUQpIHsKLQkJZGlzcG9zZUNsaWVudCgpOwotCQl0cnkgewotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKG9sZUZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lEKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGVycm9yKSB7Ci0KLQkJfQotCQlpZiAoY2xpZW50U2l0ZSAhPSBudWxsKQotCQkJY2xpZW50U2l0ZS5kb1ZlcmIoT0xFLk9MRUlWRVJCX1NIT1cpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oRGlzcGxheSBkaXNwbGF5KSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJPTEUgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCg0LCB0cnVlKSk7Ci0JCQotCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbXBvc2l0ZSBkaXNwbGF5QXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZGlzcGxheUFyZWEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDMsIDEpKTsKLQotCQlCdXR0b24gZXhjZWxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCWV4Y2VsQnV0dG9uLnNldFRleHQoIk5ldyBFeGVsIFNoZWV0Iik7Ci0JCWV4Y2VsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICgoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKQotCQkJCQluZXdDbGllbnRTaXRlKCJFeGNlbC5TaGVldCIpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIG1lZGlhUGxheWVyQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUkFESU8pOwotCQltZWRpYVBsYXllckJ1dHRvbi5zZXRUZXh0KCJOZXcgTVBsYXllciIpOwotCQltZWRpYVBsYXllckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJbmV3Q2xpZW50U2l0ZSgiTVBsYXllciIpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIHBvd2VyUG9pbnRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCXBvd2VyUG9pbnRCdXR0b24uc2V0VGV4dCgiTmV3IFBvd2VyUG9pbnQgU2xpZGUiKTsKLQkJcG93ZXJQb2ludEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJbmV3Q2xpZW50U2l0ZSgiUG93ZXJQb2ludC5TbGlkZSIpOwotCQkJfQotCQl9KTsKLQkJQnV0dG9uIHdvcmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCXdvcmRCdXR0b24uc2V0VGV4dCgiTmV3IFdvcmQgRG9jdW1lbnQiKTsKLQkJd29yZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJbmV3Q2xpZW50U2l0ZSgiV29yZC5Eb2N1bWVudCIpOwotCQkJfQotCQl9KTsKLQkJbmV3IExhYmVsKGJ1dHRvbnMsIFNXVC5OT05FKTsKLQkJQnV0dG9uIG9wZW5CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5SQURJTyk7Ci0JCW9wZW5CdXR0b24uc2V0VGV4dCgiT3BlbiBmaWxlLi4uIik7Ci0JCW9wZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTGFiZWwoYnV0dG9ucywgU1dULk5PTkUpOwotCQljbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlJBRElPKTsKLQkJY2xvc2VCdXR0b24uc2V0VGV4dCgiQ2xvc2UgZmlsZSIpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJZGlzcG9zZUNsaWVudCgpOwotCQkJfQotCQl9KTsJCi0JCWNsb3NlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCi0JCW9sZUZyYW1lID0gbmV3IE9sZUZyYW1lKGRpc3BsYXlBcmVhLCBTV1QuTk9ORSk7Ci0JCWFkZEZpbGVNZW51KG9sZUZyYW1lKTsKLQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVCcm93c2VyVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWJhNWQ0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlQnJvd3NlclZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lio7Ci0KLS8qKgotICogT2xlIHVzZXMgPGNvZGU+b3JnLmVjbGlwc2Uuc3d0PC9jb2RlPiB0byBkZW1vbnN0cmF0ZSBXaW4zMiBPTEUgLyBBY3RpdmVYCi0gKiBpbnRlZ3JhdGlvbi4KLSAqIAotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgT2xlQnJvd3NlclZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSAgICAgIGRpc3BsYXlBcmVhOwotCi0JcHJpdmF0ZSBPbGVGcmFtZSAgICAgICB3ZWJGcmFtZTsKLQlwcml2YXRlIE9sZVdlYkJyb3dzZXIgIHdlYkJyb3dzZXI7Ci0JcHJpdmF0ZSBUZXh0ICAgICAgICAgICB3ZWJVcmw7Ci0JcHJpdmF0ZSBPbGVDb250cm9sU2l0ZSB3ZWJDb250cm9sU2l0ZTsKLQlwcml2YXRlIFByb2dyZXNzQmFyICAgIHdlYlByb2dyZXNzOwotCXByaXZhdGUgTGFiZWwgICAgICAgICAgd2ViU3RhdHVzOwotCXByaXZhdGUgQnV0dG9uICAgICAgICAgd2ViTmF2aWdhdGVCdXR0b247Ci0JCi0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kQmFja3dhcmQ7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kRm9yd2FyZDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRIb21lOwotCXByaXZhdGUgVG9vbEl0ZW0gd2ViQ29tbWFuZFN0b3A7Ci0JcHJpdmF0ZSBUb29sSXRlbSB3ZWJDb21tYW5kUmVmcmVzaDsKLQlwcml2YXRlIFRvb2xJdGVtIHdlYkNvbW1hbmRTZWFyY2g7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFjdGl2YXRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1BJRF9BTUJJRU5UX0RMQ09OVFJPTCA9IC01NTEyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBETENUTF9OT19TQ1JJUFRTID0gMHg4MDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBPTEUgYnJvd3NlciB2aWV3LgotCSAqLwotCXB1YmxpYyBPbGVCcm93c2VyVmlldygpIHsKLQkJT2xlUGx1Z2luLmluaXRSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWRpc3BsYXlBcmVhID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlkaXNwbGF5QXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQotCQljcmVhdGVUb29sYmFyKCk7Ci0JCWNyZWF0ZUJyb3dzZXJGcmFtZSgpOwkJCi0JCWNyZWF0ZVN0YXR1c0FyZWEoKTsKLQkJY3JlYXRlQnJvd3NlckNvbnRyb2woKTsJCi0JfQotCQotCS8qKgotCSAqIENsZWFudXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYWN0aXZhdGVkKSB7Ci0JCQl3ZWJDb250cm9sU2l0ZS5kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCgpOwotCQkJYWN0aXZhdGVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHdlYkJyb3dzZXIgIT0gbnVsbCkgd2ViQnJvd3Nlci5kaXNwb3NlKCk7Ci0JCXdlYkJyb3dzZXIgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpICB7Ci0JCXdlYlVybC5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFdlYiBicm93c2VyIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xiYXIoKSB7Ci0JCS8vIEFkZCBhIHRvb2xiYXIKLQkJVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhcihkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCS8vIEFkZCBhIGJ1dHRvbiB0byBuYXZpZ2F0ZSBiYWNrd2FyZHMgdGhyb3VnaCBwcmV2aW91c2x5IHZpc2l0ZWQgd2ViIHNpdGVzCi0JCXdlYkNvbW1hbmRCYWNrd2FyZCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5CYWNrLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5CYWNrLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaUJhY2tdKTsKLQkJd2ViQ29tbWFuZEJhY2t3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kQmFja3dhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvQmFjaygpOwotCQkJfQotCQl9KTsKLQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIGZvcndhcmQgdGhyb3VnaCBwcmV2aW91c2x5IHZpc2l0ZWQgd2ViIHNpdGVzCi0JCXdlYkNvbW1hbmRGb3J3YXJkID0gbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuRm9yd2FyZC50b29sdGlwIikpOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5Gb3J3YXJkLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRGb3J3YXJkLnNldEltYWdlKE9sZVBsdWdpbi5pbWFnZXNbT2xlUGx1Z2luLmJpRm9yd2FyZF0pOwotCQl3ZWJDb21tYW5kRm9yd2FyZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZEZvcndhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLkdvRm9yd2FyZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBzZXBhcmF0b3IKLQkJbmV3IFRvb2xJdGVtKGJhciwgU1dULlNFUEFSQVRPUik7Ci0JCQotCQkvLyBBZGQgYSBidXR0b24gdG8gbmF2aWdhdGUgdG8gdGhlIEhvbWUgcGFnZQotCQl3ZWJDb21tYW5kSG9tZSA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkhvbWUudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuSG9tZS50ZXh0IikpOwotCQl3ZWJDb21tYW5kSG9tZS5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaUhvbWVdKTsKLQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRIb21lLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5Hb0hvbWUoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgYnV0dG9uIHRvIGFib3J0IHdlYiBwYWdlIGxvYWRpbmcKLQkJd2ViQ29tbWFuZFN0b3AgPSBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldFRvb2xUaXBUZXh0KE9sZVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiYnJvd3Nlci5TdG9wLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0b3AudGV4dCIpKTsKLQkJd2ViQ29tbWFuZFN0b3Auc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlTdG9wXSk7Ci0JCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQl3ZWJDb21tYW5kU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuU3RvcCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gcmVmcmVzaCB0aGUgY3VycmVudCB3ZWIgcGFnZQotCQl3ZWJDb21tYW5kUmVmcmVzaCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0VG9vbFRpcFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlJlZnJlc2gudG9vbHRpcCIpKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuUmVmcmVzaC50ZXh0IikpOwotCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRJbWFnZShPbGVQbHVnaW4uaW1hZ2VzW09sZVBsdWdpbi5iaVJlZnJlc2hdKTsKLQkJd2ViQ29tbWFuZFJlZnJlc2guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXdlYkNvbW1hbmRSZWZyZXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAod2ViQnJvd3NlciA9PSBudWxsKSByZXR1cm47Ci0JCQkJd2ViQnJvd3Nlci5SZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIEFkZCBhIHNlcGFyYXRvcgotCQluZXcgVG9vbEl0ZW0oYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQotCQkvLyBBZGQgYSBidXR0b24gdG8gc2VhcmNoIHRoZSB3ZWIKLQkJd2ViQ29tbWFuZFNlYXJjaCA9IG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRUb29sVGlwVGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU2VhcmNoLnRvb2x0aXAiKSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU2VhcmNoLnRleHQiKSk7Ci0JCXdlYkNvbW1hbmRTZWFyY2guc2V0SW1hZ2UoT2xlUGx1Z2luLmltYWdlc1tPbGVQbHVnaW4uYmlTZWFyY2hdKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJd2ViQ29tbWFuZFNlYXJjaC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKHdlYkJyb3dzZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJCXdlYkJyb3dzZXIuR29TZWFyY2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQWRkIGEgdGV4dCBhcmVhIGZvciBVc2VycyB0byBlbnRlciBhIHVybAotCQlDb21wb3NpdGUgYWRkcmVzc0JhciA9IG5ldyBDb21wb3NpdGUoZGlzcGxheUFyZWEsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJYWRkcmVzc0Jhci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJYWRkcmVzc0Jhci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJTGFiZWwgYWRkcmVzc0xhYmVsID0gbmV3IExhYmVsKGFkZHJlc3NCYXIsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWFkZHJlc3NMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYWRkcmVzc0xhYmVsLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLkFkZHJlc3MubGFiZWwiKSk7Ci0JCWFkZHJlc3NMYWJlbC5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCQotCQl3ZWJVcmwgPSBuZXcgVGV4dChhZGRyZXNzQmFyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXdlYlVybC5zZXRGb250KE9sZVBsdWdpbi5icm93c2VyRm9udCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQl3ZWJVcmwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXdlYlVybC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24od2ViTmF2aWdhdGVCdXR0b24pOwotCQkJfQotCQl9KTsKLQkKLQkJLy8gQWRkIGEgYnV0dG9uIHRvIG5hdmlnYXRlIHRvIHRoZSB3ZWIgc2l0ZSBzcGVjaWZpZWQgaW4gdGhlIFRleHQgYXJlYSBkZWZpbmVkIGFib3ZlCi0JCXdlYk5hdmlnYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihhZGRyZXNzQmFyLCBTV1QuUFVTSCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJd2ViTmF2aWdhdGVCdXR0b24uc2V0VGV4dChPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuR28udGV4dCIpKTsKLQkJd2ViTmF2aWdhdGVCdXR0b24uc2V0Rm9udChPbGVQbHVnaW4uYnJvd3NlckZvbnQpOwotCQl3ZWJOYXZpZ2F0ZUJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHJldHVybjsKLQkJCQl3ZWJCcm93c2VyLk5hdmlnYXRlKHdlYlVybC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBXZWIgYnJvd3NlciBPbGVGcmFtZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnJvd3NlckZyYW1lKCkgewotCQkvLyBFdmVyeSBjb250cm9sIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIE9sZUZyYW1lOgotCQl3ZWJGcmFtZSA9IG5ldyBPbGVGcmFtZShkaXNwbGF5QXJlYSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl3ZWJGcmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2ViIGJyb3dzZXIgc3RhdHVzIGFyZWEuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0YXR1c0FyZWEoKSB7Ci0JCS8vIEFkZCBhIHByb2dyZXNzIGJhciB0byBkaXNwbGF5IGRvd25sb2FkaW5nIHByb2dyZXNzIGluZm9ybWF0aW9uCi0JCXdlYlByb2dyZXNzID0gbmV3IFByb2dyZXNzQmFyKGRpc3BsYXlBcmVhLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl3ZWJQcm9ncmVzcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsJCQotCi0JCS8vIEFkZCBhIGxhYmVsIGZvciBkaXNwbGF5aW5nIHN0YXR1cyBtZXNzYWdlcyBhcyB0aGV5IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBjb250cm9sCi0JCXdlYlN0YXR1cyA9IG5ldyBMYWJlbChkaXNwbGF5QXJlYSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJd2ViU3RhdHVzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl3ZWJTdGF0dXMuc2V0Rm9udChPbGVQbHVnaW4uYnJvd3NlckZvbnQpOwotCX0JCi0KLQkvKioKLQkgKiBDcmVhdGVzIFdlYiBicm93c2VyIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZXJDb250cm9sKCkgewotCQl0cnkgewotCQkJLy8gQ3JlYXRlIGFuIEF1dG9tYXRpb24gb2JqZWN0IGZvciBhY2Nlc3MgdG8gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzCi0JCQl3ZWJDb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZSh3ZWJGcmFtZSwgU1dULk5PTkUsICJTaGVsbC5FeHBsb3JlciIpOwotCQkJVmFyaWFudCBkb3dubG9hZCA9IG5ldyBWYXJpYW50KERMQ1RMX05PX1NDUklQVFMpOwotCQkJd2ViQ29udHJvbFNpdGUuc2V0U2l0ZVByb3BlcnR5KERJU1BJRF9BTUJJRU5UX0RMQ09OVFJPTCwgZG93bmxvYWQpOwotCQkJT2xlQXV0b21hdGlvbiBvbGVBdXRvbWF0aW9uID0gbmV3IE9sZUF1dG9tYXRpb24od2ViQ29udHJvbFNpdGUpOwotCQkJd2ViQnJvd3NlciA9IG5ldyBPbGVXZWJCcm93c2VyKG9sZUF1dG9tYXRpb24pOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIENyZWF0aW9uIG1heSBoYXZlIGZhaWxlZCBiZWNhdXNlIGNvbnRyb2wgaXMgbm90IGluc3RhbGxlZCBvbiBtYWNoaW5lCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh3ZWJGcmFtZSwgU1dULkJPUkRFUik7Ci0JCQlPbGVQbHVnaW4ubG9nRXJyb3IoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdENyZWF0ZUJyb3dzZXJDb250cm9sIiksIGV4KTsKLQkJCWxhYmVsLnNldFRleHQoT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdENyZWF0ZUJyb3dzZXJDb250cm9sIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gUmVzcG9uZCB0byBQcm9ncmVzc0NoYW5nZSBldmVudHMgYnkgdXBkYXRpbmcgdGhlIFByb2dyZXNzIGJhcgotCQl3ZWJDb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKE9sZVdlYkJyb3dzZXIuUHJvZ3Jlc3NDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFyaWFudCBwcm9ncmVzcyA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlWYXJpYW50IG1heFByb2dyZXNzID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJCWlmIChwcm9ncmVzcyA9PSBudWxsIHx8IG1heFByb2dyZXNzID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQl3ZWJQcm9ncmVzcy5zZXRNYXhpbXVtKG1heFByb2dyZXNzLmdldEludCgpKTsKLQkJCQl3ZWJQcm9ncmVzcy5zZXRTZWxlY3Rpb24ocHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIFJlc3BvbmQgdG8gU3RhdHVzVGV4dENoYW5nZSBldmVudHMgYnkgdXBkYXRpbmcgdGhlIFN0YXR1cyBUZXh0IGxhYmVsCi0JCXdlYkNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoT2xlV2ViQnJvd3Nlci5TdGF0dXNUZXh0Q2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCVZhcmlhbnQgc3RhdHVzVGV4dCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlpZiAoc3RhdHVzVGV4dCA9PSBudWxsKQlyZXR1cm47Ci0JCQkJU3RyaW5nIHRleHQgPSBzdGF0dXNUZXh0LmdldFN0cmluZygpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwpCi0JCQkJCXdlYlN0YXR1cy5zZXRUZXh0KHRleHQpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcmVhZHkgc3RhdGUgYW5kIHByaW50IG91dCB0aGUgY3VycmVudCBzdGF0ZSAKLQkJd2ViQ29udHJvbFNpdGUuYWRkUHJvcGVydHlMaXN0ZW5lcihPbGVXZWJCcm93c2VyLkRJU1BJRF9SRUFEWVNUQVRFLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5kZXRhaWwgPT0gT0xFLlBST1BFUlRZX0NIQU5HSU5HKSByZXR1cm47Ci0JCQkJaW50IHN0YXRlID0gd2ViQnJvd3Nlci5nZXRSZWFkeVN0YXRlKCk7Ci0JCQkJc3dpdGNoIChzdGF0ZSkgewotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9VTklOSVRJQUxJWkVEOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLlVuaW5pdGlhbGl6ZWQudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRCYWNrd2FyZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXdlYkNvbW1hbmRTdG9wLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJd2ViQ29tbWFuZFNlYXJjaC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9MT0FESU5HOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkxvYWRpbmcudGV4dCIpKTsKLQkJCQkJCXdlYkNvbW1hbmRIb21lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl3ZWJDb21tYW5kUmVmcmVzaC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJd2ViQ29tbWFuZFN0b3Auc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCXdlYkNvbW1hbmRTZWFyY2guc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuUkVBRFlTVEFURV9MT0FERUQ6Ci0JCQkJCQl3ZWJTdGF0dXMuc2V0VGV4dCgKLQkJCQkJCQlPbGVQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZXIuU3RhdGUuTG9hZGVkLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0lOVEVSQUNUSVZFOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkludGVyYWN0aXZlLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5SRUFEWVNUQVRFX0NPTVBMRVRFOgotCQkJCQkJd2ViU3RhdHVzLnNldFRleHQoCi0JCQkJCQkJT2xlUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2VyLlN0YXRlLkNvbXBsZXRlLnRleHQiKSk7Ci0JCQkJCQl3ZWJDb21tYW5kU3RvcC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgY29tbWFuZCBzdGF0ZXMKLQkJd2ViQ29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihPbGVXZWJCcm93c2VyLkNvbW1hbmRTdGF0ZUNoYW5nZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQudHlwZSAhPSBPbGVXZWJCcm93c2VyLkNvbW1hbmRTdGF0ZUNoYW5nZSkgcmV0dXJuOwotCQkJCWZpbmFsIGludCBjb21tYW5kSUQgPQotCQkJCQkoZXZlbnQuYXJndW1lbnRzWzBdICE9IG51bGwpID8gZXZlbnQuYXJndW1lbnRzWzBdLmdldEludCgpIDogMDsKLQkJCQlmaW5hbCBib29sZWFuIGNvbW1hbmRFbmFibGVkID0KLQkJCQkJKGV2ZW50LmFyZ3VtZW50c1sxXSAhPSBudWxsKSA/IGV2ZW50LmFyZ3VtZW50c1sxXS5nZXRCb29sZWFuKCkgOiBmYWxzZTsKLQkJCQkKLQkJCQlzd2l0Y2ggKGNvbW1hbmRJRCkgewotCQkJCQljYXNlIE9sZVdlYkJyb3dzZXIuQ1NDX05BVklHQVRFQkFDSzoKLQkJCQkJIAl3ZWJDb21tYW5kQmFja3dhcmQuc2V0RW5hYmxlZChjb21tYW5kRW5hYmxlZCk7Ci0JCQkJCSAJYnJlYWs7Ci0JCQkJCWNhc2UgT2xlV2ViQnJvd3Nlci5DU0NfTkFWSUdBVEVGT1JXQVJEOgotCQkJCQkgCXdlYkNvbW1hbmRGb3J3YXJkLnNldEVuYWJsZWQoY29tbWFuZEVuYWJsZWQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyBpbiBwbGFjZSBhY3RpdmF0ZSB0aGUgQWN0aXZlWCBjb250cm9sCQkKLQkJYWN0aXZhdGVkID0gKHdlYkNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKSA9PSBPTEUuU19PSyk7Ci0JCWlmIChhY3RpdmF0ZWQpIHdlYkJyb3dzZXIuR29Ib21lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5vbGUud2luMzIvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9vbGUvd2luMzIvT2xlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1NWMyZTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIE9sZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBPbGVQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0Jc3RhdGljIGZpbmFsIGludAotCQliaUJhY2sgPSAwLAotCQliaUZvcndhcmQgPSAxLAotCQliaUhvbWUgPSAyLAotCQliaVN0b3AgPSAzLAotCQliaVJlZnJlc2ggPSA0LAotCQliaVNlYXJjaCA9IDU7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIGltYWdlTG9jYXRpb25zID0gewotCQkiaWNvbnMvYmFja3dhcmRfbmF2LmdpZiIsCi0JCSJpY29ucy9mb3J3YXJkX25hdi5naWYiLAotCQkiaWNvbnMvaG9tZV9uYXYuZ2lmIiwKLQkJImljb25zL3N0b3BfbmF2LmdpZiIsCi0JCSJpY29ucy9yZWZyZXNoX25hdi5naWYiLAotCQkiaWNvbnMvc2VhcmNoX25hdi5naWYiIH07Ci0Jc3RhdGljIEltYWdlIGltYWdlc1tdOwotCXN0YXRpYyBGb250ICBicm93c2VyRm9udDsKLSAgIAotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gT0xFIHBsdWdpbi4KLQkgKi8KLQlwdWJsaWMgT2xlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSk7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIENsZWFuIHVwCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlmcmVlUmVzb3VyY2VzKCk7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2xlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgYW5kIGJpbmRzIGl0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwKLQkgKiByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UmVzb3VyY2VzKCkgewotCQlpZiAoaW1hZ2VzID09IG51bGwpIHsKLQkJCWltYWdlcyA9IG5ldyBJbWFnZVtpbWFnZUxvY2F0aW9ucy5sZW5ndGhdOwotCQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZUxvY2F0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCWltYWdlc1tpXSA9IGdldEltYWdlRnJvbVBsdWdpbihwbHVnaW4uZ2V0QnVuZGxlKCksIGltYWdlTG9jYXRpb25zW2ldKTsKLQkJCQlpZiAoaW1hZ2VzW2ldID09IG51bGwpIHsKLQkJCQkJZnJlZVJlc291cmNlcygpOwotCQkJCQlsb2dFcnJvcihnZXRSZXNvdXJjZVN0cmluZygiZXJyb3IuQ291bGROb3RMb2FkUmVzb3VyY2VzIiksIG51bGwpOwotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChicm93c2VyRm9udCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWJyb3dzZXJGb250ID0gbmV3IEZvbnQgKG51bGwsICJNUyBTYW5zIFNlcmlmIiwgOCwgU1dULk5VTEwpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQl9Ci0JCX0KLQkJaWYgKGltYWdlcyA9PSBudWxsIHx8IGJyb3dzZXJGb250ID09IG51bGwpIHsKLQkJCWZyZWVSZXNvdXJjZXMoKTsKLQkJCWxvZ0Vycm9yKGdldFJlc291cmNlU3RyaW5nKCJlcnJvci5Db3VsZE5vdExvYWRSZXNvdXJjZXMiKSwgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGcmVlcyB0aGUgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyZWVSZXNvdXJjZXMoKSB7Ci0JCWlmIChpbWFnZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJaW1hZ2VzID0gbnVsbDsKLQkJfQotCQlpZiAoYnJvd3NlckZvbnQgIT0gbnVsbCkgYnJvd3NlckZvbnQuZGlzcG9zZSAoKTsKLQkJYnJvd3NlckZvbnQgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGFuIGltYWdlIGZyb20gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gcGQgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZvciB0aGUgcGx1Z2luIHdpdGggdGhlIGltYWdlCi0JICogQHBhcmFtIGljb25QYXRoIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBpbnN0YWxsIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlIGdldEltYWdlRnJvbVBsdWdpbihCdW5kbGUgYnVuZGxlLCBTdHJpbmcgaWNvblBhdGgpIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVcmwgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGluc3RhbGxVcmwsIGljb25QYXRoKTsKLQkJCWlzID0gdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCUltYWdlRGF0YSBzb3VyY2UgPSBuZXcgSW1hZ2VEYXRhKGlzKTsKLQkJCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKG51bGwsIHNvdXJjZSwgbWFzayk7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKSBpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL29sZS93aW4zMi9PbGVXZWJCcm93c2VyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDQ5ODgxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMub2xlLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvb2xlL3dpbjMyL09sZVdlYkJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLm9sZS53aW4zMjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotCi0vKioKLSAqIFdyYXBwZXIgZm9yIGFuIE9sZUF1dG9tYXRpb24gb2JqZWN0IHVzZWQgdG8gc2VuZCBjb21tYW5kcwotICogdG8gYSBXaW4zMiAiU2hlbGwuRXhwbG9yZXIiIE9MRSBjb250cm9sLgotICogCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtYW5hZ2UgdGhlIHNldHVwLCB0eXBpY2FsIHVzZSBhbmQgdGVhcmRvd24gb2YKLSAqIGEgc2ltcGxlIHdlYiBicm93c2VyLgotICovCi1jbGFzcyBPbGVXZWJCcm93c2VyIHsKLQkvKiBTZWUgdGhlIFdpbmRvd3MgUGxhdGZvcm0gU0RLIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICogT0xFIGNvbnRyb2wgdXNlZCBoZXJlIGFuZCBpdHMgdXNhZ2UuCi0JICovCi0JLy8gR2VuZXJhdGVkIGZyb20gdHlwZWxpYiBmaWxlbmFtZTogc2hkb2N2dy5kbGwKLQotCS8vIENvbnN0YW50cyBmb3IgV2ViQnJvd3NlciBDb21tYW5kU3RhdGVDaGFuZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU0NfVVBEQVRFQ09NTUFORFMgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU0NfTkFWSUdBVEVGT1JXQVJEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU0NfTkFWSUdBVEVCQUNLID0gMjsKLQotCS8vIENPbnN0YW50cyBmb3IgV2ViIEJyb3dzZXIgUmVhZHlTdGF0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FESU5HID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURFRCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9JTlRFUkFDVElWRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9DT01QTEVURSA9IDQ7Ci0JCi0JLy8gV2ViIEJyb3dzZXIgQ29udHJvbCBFdmVudHMgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQmVmb3JlTmF2aWdhdGUgICAgICAgID0gMTAwOyAvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmF2aWdhdGVDb21wbGV0ZSAgICAgID0gMTAxOyAvLyBGaXJlZCB3aGVuIHRoZSBkb2N1bWVudCBiZWluZyBuYXZpZ2F0ZWQgdG8gYmVjb21lcyB2aXNpYmxlIGFuZCBlbnRlcnMgdGhlIG5hdmlnYXRpb24gc3RhY2suCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU3RhdHVzVGV4dENoYW5nZSAgICAgID0gMTAyOyAvLyBTdGF0dXNiYXIgdGV4dCBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFByb2dyZXNzQ2hhbmdlICAgICAgICA9IDEwODsgLy8gRmlyZWQgd2hlbiBkb3dubG9hZCBwcm9ncmVzcyBpcyB1cGRhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvd25sb2FkQ29tcGxldGUgICAgICA9IDEwNDsgLy8gRG93bmxvYWQgb2YgcGFnZSBjb21wbGV0ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDb21tYW5kU3RhdGVDaGFuZ2UgICAgPSAxMDU7IC8vIFRoZSBlbmFibGVkIHN0YXRlIG9mIGEgY29tbWFuZCBjaGFuZ2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG93bmxvYWRCZWdpbiAgICAgICAgID0gMTA2OyAvLyBEb3dubG9hZCBvZiBhIHBhZ2Ugc3RhcnRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOZXdXaW5kb3cgICAgICAgICAgICAgPSAxMDc7IC8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRpdGxlQ2hhbmdlICAgICAgICAgICA9IDExMzsgLy8gRG9jdW1lbnQgdGl0bGUgY2hhbmdlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGcmFtZUJlZm9yZU5hdmlnYXRlICAgPSAyMDA7IC8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0byBpbiBhIGZyYW1lLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTmF2aWdhdGVDb21wbGV0ZSA9IDIwMTsgLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOZXdXaW5kb3cgICAgICAgID0gMjA0OyAvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRdWl0ICAgICAgICAgICAgICAgICAgPSAxMDM7IC8vIEZpcmVkIHdoZW4gYXBwbGljYXRpb24gaXMgcXVpdGluZy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaW5kb3dNb3ZlICAgICAgICAgICAgPSAxMDk7IC8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIG1vdmVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd1Jlc2l6ZSAgICAgICAgICA9IDExMDsgLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gc2l6ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93QWN0aXZhdGUgICAgICAgID0gMTExOyAvLyBGaXJlZCB3aGVuIHdpbmRvdyBoYXMgYmVlbiBhY3RpdmF0ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvcGVydHlDaGFuZ2UgICAgICAgID0gMTEyOyAvLyBGaXJlZCB3aGVuIHRoZSBQdXRQcm9wZXJ0eSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotCi0JLy8gV2ViIEJyb3dzZXIgcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BJRF9SRUFEWVNUQVRFID0gLTUyNTsKLQotCXByaXZhdGUgT2xlQXV0b21hdGlvbiAgb2xlQXV0b21hdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBXZWIgYnJvd3NlciBjb250cm9sLgotCSAqIDxwPgotCSAqIFR5cGljYWwgdXNlOjxicj4KLQkgKiA8Y29kZT4KLQkgKiBPbGVDb250cm9sU2l0ZSBvbGVDb250cm9sU2l0ZSA9IG5ldyBPbGVDb250cm9sU2l0ZShvbGVGcmFtZSwgc3R5bGUsICJTaGVsbC5FeHBsb3JlciIpOzxicj4KLQkgKiBPbGVBdXRvbWF0aW9uIG9sZUF1dG9tYXRpb24gPSBuZXcgT2xlQXV0b21hdGlvbihvbGVDb250cm9sU2l0ZSk7PGJyPgotCSAqIE9sZVdlYkJyb3dzZXIgd2ViQnJvd3NlciA9IG5ldyBPbGVXZWJCcm93c2VyKG9sZUNvbnRyb2xTaXRlLCBvbGVBdXRvbWF0aW9uKTs8YnI+Ci0JICogPC9jb2RlPgotCSAqIAotICAgICAqIEBwYXJhbSBvbGVBdXRvbWF0aW9uIHRoZSBPbGVBdXRvbWF0aW9uIG9iamVjdCBmb3IgdGhpcyBjb250cm9sLgotICAgICAqIEBwYXJhbSBvbGVDb250cm9sU2l0ZSB0aGUgT2xlQ29udHJvbFNpdGUgb2JqZWN0IGZvciB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIE9sZVdlYkJyb3dzZXIoT2xlQXV0b21hdGlvbiBvbGVBdXRvbWF0aW9uKSB7Ci0JCXRoaXMub2xlQXV0b21hdGlvbiA9IG9sZUF1dG9tYXRpb247Ci0JfQotCQotCQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoZSBXZWIgYnJvd3NlciBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChvbGVBdXRvbWF0aW9uICE9IG51bGwpIG9sZUF1dG9tYXRpb24uZGlzcG9zZSgpOwotCQlvbGVBdXRvbWF0aW9uID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBJbnRlcmFjdCB3aXRoIHRoZSBDb250cm9sIHZpYSBPTEUgQXV0b21hdGlvbgotCSAqIAotCSAqIE5vdGU6IFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSURzIGlmIHlvdSBrbm93IHRoZW0gYmVmb3JlaGFuZAotCSAqICAgICAgIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheSwgYnV0IHlvdSBpbmNyZWFzZSBjb3VwbGluZwotCSAqICAgICAgIHRvIHRoZSBjb250cm9sLgotCSAqLwotCSAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHdlYiBwYWdlIHRpdGxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgd2ViIHBhZ2UgdGl0bGUgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbk5hbWUoKSB7Ci0JCS8vIGRpc3BpZD0yMTAsIHR5cGU9UFJPUEdFVCwgbmFtZT0iTG9jYXRpb25OYW1lIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkxvY2F0aW9uTmFtZSJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlQXV0b21hdGlvbi5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9CU1RSKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0U3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgVVJMIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkwoKSB7Ci0JCS8vIGRpc3BpZD0yMTEsIHR5cGU9UFJPUEdFVCwgbmFtZT0iTG9jYXRpb25VUkwiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTG9jYXRpb25VUkwifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVBdXRvbWF0aW9uLmdldFByb3BlcnR5KGRpc3BJZE1lbWJlcik7Ci0JCWlmIChwVmFyUmVzdWx0ID09IG51bGwgfHwgcFZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0JTVFIpIHJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb250cm9sLCBvbmUgb2Y6Ci0JICogICAgICAgICBSRUFEWVNUQVRFX1VOSU5JVElBTElaRUQ7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0xPQURJTkc7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0xPQURFRDsKLQkgKiAgICAgICAgIFJFQURZU1RBVEVfSU5URVJBQ1RJVkU7Ci0JICogICAgICAgICBSRUFEWVNUQVRFX0NPTVBMRVRFLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVhZHlTdGF0ZSgpIHsKLQkJLy8gZGlzcGlkPTQyOTQ5NjY3NzEsIHR5cGU9UFJPUEdFVCwgbmFtZT0iUmVhZHlTdGF0ZSIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJSZWFkeVN0YXRlIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQkKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlQXV0b21hdGlvbi5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9JNCkgcmV0dXJuIC0xOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgR29CYWNrKCkgewotCQotCQkvLyBkaXNwaWQ9MTAwLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29CYWNrIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkdvQmFjayJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIGJhY2t3YXJkcyB0aHJvdWdoIHByZXZpb3VzbHkgdmlzaXRlZCB3ZWIgc2l0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgR29Gb3J3YXJkKCkgewotCQotCQkvLyBkaXNwaWQ9MTAxLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29Gb3J3YXJkIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IkdvRm9yd2FyZCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJb2xlQXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogTmF2aWdhdGVzIHRvIGhvbWUgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBHb0hvbWUoKSB7Ci0JCS8vIGRpc3BpZD0xMDIsIHR5cGU9TUVUSE9ELCBuYW1lPSJHb0hvbWUiCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29Ib21lIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0KLQkKLQkvKioKLQkgKiBOYXZpZ2F0ZXMgdG8gdXNlci1zcGVjaWZpZWQgV2ViIHNlYXJjaCBnYXRld2F5LgotCSAqLwotCXB1YmxpYyB2b2lkIEdvU2VhcmNoKCkgewotCQkvLyBkaXNwaWQ9MTAzLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29TZWFyY2giCi0JCWludFtdIHJnZGlzcGlkID0gb2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiR29TZWFyY2gifSk7IAotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JfQotCQotCS8qKgotCSAqIE5hdmlnYXRlcyB0byBhIHBhcnRpY3VsYXIgVVJMLgotCSAqLwotCXB1YmxpYyB2b2lkIE5hdmlnYXRlKFN0cmluZyB1cmwpIHsKLQkJLy8gZGlzcGlkPTEwNCwgdHlwZT1NRVRIT0QsIG5hbWU9Ik5hdmlnYXRlIgotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZUF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQkJCi0JCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFsxXTsKLQkJcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodXJsKTsKLQkJaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50WzFdOwotCQlyZ2Rpc3BpZE5hbWVkQXJnc1swXSA9IHJnZGlzcGlkWzFdOyAvLyBpZGVudGlmaWVyIG9mIGFyZ3VtZW50Ci0JCW9sZUF1dG9tYXRpb24uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgY3VycmVudGx5IHZpZXdlZCBwYWdlLgotCSAqCi0JICogQHJldHVybiB0aGUgcGxhdGZvcm0tZGVmaW5lZCByZXN1bHQgY29kZSBmb3IgdGhlICJSZWZyZXNoIiBtZXRob2QgaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIFJlZnJlc2goKXsKLQkJLy8gZGlzcGlkPSA0Mjk0OTY2NzQ2LCB0eXBlPU1FVEhPRCwgbmFtZT0iUmVmcmVzaCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJSZWZyZXNoIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZU5vUmVwbHkoZGlzcElkTWVtYmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQWJvcnRzIGxvYWRpbmcgb2YgdGhlIGN1cnJuZXQgcGFnZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHBsYXRmb3JtLWRlZmluZWQgcmVzdWx0IGNvZGUgZm9yIHRoZSAiU3RvcCIgbWV0aG9kIGludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBTdG9wKCkgewotCQkvLyBkaXNwaWQ9MTA2LCB0eXBlPU1FVEhPRCwgbmFtZT0iU3RvcCIKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVBdXRvbWF0aW9uLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJTdG9wIn0pOyAKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCQlvbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIpOwotCX0JCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzOWFmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzcxY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNNb24gRGVjIDExIDE1OjEzOjQ1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvYWJvdXQuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9idWlsZC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmMGFlMGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBkb2MtaHRtbC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAqLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS5wYWludC5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvZG9jLWh0bWwvc3d0X3BhaW50X2V4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0OGU3Y2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2RvYy1odG1sL3N3dF9wYWludF9leC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMgMjAwMCwgMjAwNS4gVGhpcyBwYWdlIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGxpY2Vuc2UuIEZvciBmdWxsIGRldGFpbHMgc2VlIHRoZSBMRUdBTCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBib29rIHRoYXQgY29udGFpbnMgdGhpcyBwYWdlLiIgPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+U1dUIC0gUGFpbnQgVG9vbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgyPlNXVCBleGFtcGxlIC0gUGFpbnQgVG9vbDwvaDI+Ci0KLTxwPgkKLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhCi1ydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBQYWludCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gCi1kZW1vbnN0cmF0ZXMgYSBtZWNoYW5pc20gZm9yIG1hbmFnaW5nIHRpbWVkIEdVSSBvcGVyYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kIAotdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHVzZXIgaW5wdXQuCi08L3A+Ci08cD4JCi1TZWxlY3QgYSB0b29sIHdpdGggd2hpY2ggdG8gZHJhdyBpbiB0aGUgZHJhd2luZyBhcmVhLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzCi10byBjaG9vc2UgZnJvbSBvbiB0aGUgdG9vbGJhci4gIFRvIGNoYW5nZSB0aGUgY29sb3Igc2VsZWN0aW9uLCBjbGljayBvbiBhIGNvbG9yIGluIHRoZQotcGFsZXR0ZSBiZWxvdyB0aGUgZHJhd2luZyBhcmVhOyBsZWZ0LWNsaWNrIHRvIHNldCB0aGUgZm9yZWdyb3VuZCBjb2xvciwgcmlnaHQtY2xpY2sgdG8gc2V0IHRoZQotYmFja2dyb3VuZCBjb2xvci4KLTwvcD4KLQotPGgzPlJ1bm5pbmcgdGhlIGV4YW1wbGU8L2gzPgotCi08cD4KLUZyb20gRWNsaXBzZSdzIDxzdHJvbmc+V2luZG93PC9zdHJvbmc+IG1lbnUgc2VsZWN0IDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+ICZndDsgPHN0cm9uZz5PdGhlcjwvc3Ryb25nPi4gIAotSW4gdGhlIDxzdHJvbmc+U2hvdyBWaWV3PC9zdHJvbmc+IGRpYWxvZywgZXhwYW5kIDxzdHJvbmc+U1dUIEV4YW1wbGVzPC9zdHJvbmc+IGFuZCBzZWxlY3QKLXRoZSB2aWV3IG5hbWVkIDxzdHJvbmc+UGFpbnQ8L3N0cm9uZz4uIEEgdmlldyBjb250YWluaW5nIHRoZSBwYWludCBwcm9ncmFtIHdpbGwgYXBwZWFyLgotPC9wPgotPHA+Ci1UaGlzIGV4YW1wbGUgY2FuIGFsc28gYmUgcnVuIHVzaW5nIHRoZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIvZG9jLWh0bWwvc3d0X2xhdW5jaGVyX2V4Lmh0bWwiPkV4YW1wbGUgTGF1bmNoZXI8L2E+LgotU2VsZWN0IHRoZSA8c3Ryb25nPlBhaW50PC9zdHJvbmc+IGl0ZW0gZnJvbSB0aGUgPHN0cm9uZz5Xb3JrYmVuY2ggVmlld3M8L3N0cm9uZz4gY2F0ZWdvcnkgYW5kIGNsaWNrIDxzdHJvbmc+UnVuPC9zdHJvbmc+LgotPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5NDVkZGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L2ljb25zL3BhaW50X2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZDc4NzU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1wbHVnaW4uU1dUUGFpbnRFeGFtcGxlLm5hbWUgPSBTV1QgUGFpbnQgRXhhbXBsZSBQbHVnaW4KLWNhdGVnb3J5LlNXVEV4YW1wbGVzLm5hbWUgPSBTV1QgRXhhbXBsZXMKLXZpZXcuUGFpbnRFeGFtcGxlLm5hbWUgPSBQYWludAotCi1sYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMubmFtZSA9IFdvcmtiZW5jaCBWaWV3cwotbGF1bmNoY2F0ZWdvcnkuU1dUVmlld0V4YW1wbGVzLmRlc2NyaXB0aW9uID0gXAotCUEgY29sbGVjdGlvbiBvZiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCBleGFtcGxlcyB0aGF0IHJ1biBhcyBWaWV3cyBpbnNpZGUgdGhlIFdvcmtiZW5jaC4gIFwKLQlUaGVzZSBleGFtcGxlcyB3aWxsIGNyZWF0ZSBhIG5ldyBWaWV3IGluIHRoZSBjdXJyZW50IFBlcnNwZWN0aXZlLgotCi1sYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5uYW1lID0gUGFpbnQKLWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLmRlc2NyaXB0aW9uID0gXAotCVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTV1QgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgZm9ybSBvZiBhIFwKLQlydWRpbWVudGFyeSBiaXRtYXAgcGFpbnRpbmcgcHJvZ3JhbS4gIFRoZSBBaXJicnVzaCBUb29sIGltcGxlbWVudGF0aW9uIGFsc28gXAotCWRlbW9uc3RyYXRlcyBhIG1lY2hhbmlzbSBmb3IgbWFuYWdpbmcgdGltZWQgR1VJIG9wZXJhdGlvbnMgaW4gdGhlIGJhY2tncm91bmQgXAotCXRoYXQgYXJlIHRyaWdnZXJlZCBieSB1c2VyIGlucHV0LlxuXG5cCi0JU2VsZWN0IGEgdG9vbCB3aXRoIHdoaWNoIHRvIGRyYXcgaW4gdGhlIGRyYXdpbmcgYXJlYS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0b29scyBcCi0JdG8gY2hvb3NlIGZyb20gb24gdGhlIHRvb2xiYXIuICBUbyBjaGFuZ2UgdGhlIGNvbG9yIHNlbGVjdGlvbiwgY2xpY2sgb24gYSBjb2xvciBpbiB0aGUgXAotCXBhbGV0dGUgYmVsb3cgdGhlIGRyYXdpbmcgYXJlYTogbGVmdC1jbGljayBmb3IgdGhlIGZvcmVncm91bmQgY29sb3IsIHJpZ2h0LWNsaWNrIGZvciB0aGUgXAotCWJhY2tncm91bmQgY29sb3IuXG5cblwKLQlVc2VzIFNXVCdzIEdDIGFuZCBGb250RGlhbG9nLCBhbmQgSkZhY2UncyBJbnB1dERpYWxvZyBhbmQgYWN0aW9uIHNldCBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3BsdWdpbi54bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdiOTZiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50IgotICAgbmFtZT0iJXBsdWdpbi5TV1RQYWludEV4YW1wbGUubmFtZSIKLSAgIHZlcnNpb249IjMuMS4xMDAucXVhbGlmaWVyIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQuUGFpbnRQbHVnaW4iPgotCi08IS0tIFJ1bnRpbWUgLS0+Ci0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBhaW50LmphciI+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci08IS0tIFJlcXVpcmVkIHBsdWdpbnMgLS0+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkudmlld3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcyIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tIEV4dGVuc2lvbiBwb2ludHMgLS0+Ci08IS0tIEV4dGVuc2lvbnMgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3LlBhaW50RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC5QYWludFZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LnZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaGVyLmxhdW5jaEl0ZW1zIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJWxhdW5jaGNhdGVnb3J5LlNXVFZpZXdFeGFtcGxlcy5uYW1lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVsYXVuY2hjYXRlZ29yeS5TV1RWaWV3RXhhbXBsZXMuZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLmxhdW5jaFZpZXdDYXRlZ29yeSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPGl0ZW0KLSAgICAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLlBhaW50RXhhbXBsZS5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcGFpbnRfZXhhbXBsZS5naWYiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWxhdW5jaGl0ZW0uUGFpbnRFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hWaWV3Q2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50LnZpZXdsYXVuY2hlciI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgdmlld0lkPSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQudmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L2l0ZW0+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9pbXBvcnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWRhYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL2ltcG9ydC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQZXJzaXN0IHByb2plY3Qgc2V0dGluZ3MgZm9yIGxhdGVyIGltcG9ydCAKLW5hdHVyZXMgPSBvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlOyBvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlCi1idWlsZGVycyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyOyBvcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcgotdmFyLkVDTElQU0VfUExVR0lOUyA9IDw8RUNMSVBTRV9QTFVHSU5TPj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50UGx1Z2luLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTQzN2ZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5wYWludC9zcmMvb3JnL2VjbGlwc2Uvc3d0L2V4YW1wbGVzL3BhaW50L1BhaW50UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBhaW50UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgUGFpbnRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyB0aGUgUGFpbnQgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBQYWludFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIGFuIGVycm9yIHRvIHRoZSBJTG9nIGZvciB0aGlzIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB0ZXh0Ci0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgYXNzb2NpYXRlZCBleGNlcHRpb24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZygKLQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50L3NyYy9vcmcvZWNsaXBzZS9zd3QvZXhhbXBsZXMvcGFpbnQvUGFpbnRWaWV3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTI1MGY0OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMucGFpbnQvc3JjL29yZy9lY2xpcHNlL3N3dC9leGFtcGxlcy9wYWludC9QYWludFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LmV4YW1wbGVzLnBhaW50OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKLQotLyoqCi0gKiBUaGUgdmlldyBmb3IgdGhlIHBhaW50IGFwcGxpY2F0aW9uLgotICogQWxsIHJlbmRlcmluZyBoYXBwZW5zIGluc2lkZSB0aGUgYXJlYSBjcmVhdGVkIGJ5IGNyZWF0ZVBhcnRDb250cm9sKCkuCi0gKiAKLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIFBhaW50VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlQYWludEV4YW1wbGUgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFBhaW50IHZpZXcuCi0JICovCi0JcHVibGljIFBhaW50VmlldygpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBleGFtcGxlLgotCSAqIAotCSAqIEBzZWUgVmlld1BhcnQjY3JlYXRlUGFydENvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluc3RhbmNlID0gbmV3IFBhaW50RXhhbXBsZShwYXJlbnQpOwotCQlpbnN0YW5jZS5jcmVhdGVHVUkocGFyZW50KTsKLQotCQkvKioqIEFkZCB0b29sYmFyIGNvbnRyaWJ1dGlvbnMgKioqLwotCQlmaW5hbCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCUlUb29sQmFyTWFuYWdlciB0b29sYmFyTWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJVG9vbCB0b29sc1tdID0gUGFpbnRFeGFtcGxlLnRvb2xzOwotCQlTdHJpbmcgZ3JvdXAgPSB0b29sc1swXS5ncm91cDsKLQkJdG9vbGJhck1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihncm91cCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb29sIHRvb2wgPSB0b29sc1tpXTsKLQkJCWlmICghdG9vbC5ncm91cC5lcXVhbHMoZ3JvdXApKSB7Ci0JCQkJdG9vbGJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJdG9vbGJhck1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcih0b29sLmdyb3VwKSk7Ci0JCQl9Ci0JCQlncm91cCA9IHRvb2wuZ3JvdXA7Ci0JCQlQYWludEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFpbnRBY3Rpb24odG9vbCk7Ci0JCQl0b29sYmFyTWFuYWdlci5hcHBlbmRUb0dyb3VwKGdyb3VwLCBhY3Rpb24pOwotCQkJaWYgKGkgPT0gUGFpbnRFeGFtcGxlLkRlZmF1bHRfdG9vbCB8fCBpID09IFBhaW50RXhhbXBsZS5EZWZhdWx0X2ZpbGwgfHwgaSA9PSBQYWludEV4YW1wbGUuRGVmYXVsdF9saW5lc3R5bGUpIHsKLQkJCQlhY3Rpb24uc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCX0KLQkJfQotCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQotCQlpbnN0YW5jZS5zZXREZWZhdWx0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBWaWV3IGlzIHRvIGJlIGRpc3Bvc2VkCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIERpc3BsYXkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGlzcGxheSB3ZSdyZSB1c2luZwotCSAqLwotCXB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBpbnN0YW5jZS5nZXREaXNwbGF5KCk7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHdlIG11c3QgZ3JhYiBmb2N1cy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaW5zdGFuY2Uuc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3Rpb24gc2V0IGdsdWUuCi0JICovCi0JY2xhc3MgUGFpbnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcml2YXRlIGludCBzdHlsZTsKLQkJcHJpdmF0ZSBSdW5uYWJsZSBhY3Rpb247Ci0JCXB1YmxpYyBQYWludEFjdGlvbihUb29sIHRvb2wpIHsKLQkJCXN1cGVyKCk7Ci0JCQlTdHJpbmcgaWQgPSB0b29sLmdyb3VwICsgJy4nICsgdG9vbC5uYW1lOwotCQkJc2V0SWQoaWQpOwotCQkJc3R5bGUgPSB0b29sLnR5cGUgPT0gU1dULlJBRElPID8gSUFjdGlvbi5BU19SQURJT19CVVRUT04gOiBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OOwotCQkJYWN0aW9uID0gdG9vbC5hY3Rpb247Ci0JCQlzZXRUZXh0KFBhaW50RXhhbXBsZS5nZXRSZXNvdXJjZVN0cmluZyhpZCArICIubGFiZWwiKSk7Ci0JCQlzZXRUb29sVGlwVGV4dChQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLnRvb2x0aXAiKSk7Ci0JCQlzZXREZXNjcmlwdGlvbihQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmRlc2NyaXB0aW9uIikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSgKLQkJCQkJUGFpbnRFeGFtcGxlLmNsYXNzLAotCQkJCQlQYWludEV4YW1wbGUuZ2V0UmVzb3VyY2VTdHJpbmcoaWQgKyAiLmltYWdlIikpKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldFN0eWxlKCkgeyByZXR1cm4gc3R5bGU7IH0KLQkJcHVibGljIHZvaWQgcnVuKCkgeyBhY3Rpb24ucnVuKCk7IH0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0IGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzMTZiNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmI5NmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OThkMTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZG9jLWh0bWwvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBnbGV4YW1wbGVzLmphcgotCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGRvYy1odG1sLyxcCi0gICAgICAgICAgICAgICBzcmMvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5nbGV4YW1wbGVzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1M2NlNjZjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotcGx1Z2luLk9wZW5HTEV4YW1wbGVTZXQubmFtZSA9IFNXVCBPcGVuR0wgRXhhbXBsZXMgUGx1Z2luCi0KLWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5uYW1lID0gT3BlbkdMIEV4YW1wbGUKLWxhdW5jaGl0ZW0uT3BlbkdMRXhhbXBsZS5kZXNjcmlwdGlvbiA9IFwKLQlUaGUgT3BlbkdMIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBtYW55IE9wZW5HTCBmZWF0dXJlcyBpbiBcCi0JYW4gU1dUIGFwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMTg3MjVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcyIKLSAgIG5hbWU9IiVwbHVnaW4uT3BlbkdMRXhhbXBsZVNldC5uYW1lIgotICAgdmVyc2lvbj0iMC41LjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9IiI+Ci0KLTwhLS0gUmVxdWlyZWQgcGx1Z2lucyAtLT4KLTxyZXF1aXJlcz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5vcGVuZ2wiIHZlcnNpb249IjAuNS4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLTwvcmVxdWlyZXM+Ci0KLTwhLS0gUnVudGltZSAtLT4KLTxydW50aW1lPgotICAgPGxpYnJhcnkgbmFtZT0iZ2xleGFtcGxlcy5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICA8L2xpYnJhcnk+Ci08L3J1bnRpbWU+Ci0KLTwhLS0gRXh0ZW5zaW9ucyAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50cyAtLT4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5zd3QuZXhhbXBsZXMubGF1bmNoZXIubGF1bmNoSXRlbXMiPgotICAgPGl0ZW0KLSAgICAgICAgIG5hbWU9IiVsYXVuY2hpdGVtLk9wZW5HTEV4YW1wbGUubmFtZSIKLSAgICAgICAgIGRlc2NyaXB0aW9uPSIlbGF1bmNoaXRlbS5PcGVuR0xFeGFtcGxlLmRlc2NyaXB0aW9uIgotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnN3dC5leGFtcGxlcy5sYXVuY2hTdGFuZGFsb25lQ2F0ZWdvcnkiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy5PcGVuR0xFeGFtcGxlLnN0YW5kYWxvbmVsYXVuY2hlciI+Ci0gICAgICA8cHJvZ3JhbQotICAgICAgICAgICAgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMiCi0gICAgICAgICAgICBtYWluQ2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMuT3BlbkdMRXhhbXBsZSI+Ci0gICAgICA8L3Byb2dyYW0+Ci0gICA8L2l0ZW0+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvZXhhbXBsZXNfb3BlbmdsLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkyNzEzMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9leGFtcGxlc19vcGVuZ2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWVycm9yLkNvdWxkTm90TG9hZFJlc291cmNlcyA9IFVuYWJsZSB0byBsb2FkIHJlc291cmNlcwotd2luZG93LnRpdGxlID0gU1dUIE9wZW5HTCBFeGFtcGxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9BbnRpYWxpYXNpbmdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYWNiOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FudGlhbGlhc2luZ1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQW50aWFsaWFzaW5nVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIEJ1dHRvbiBhbnRpQWxpYXNCdXR0b247Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZiwgeVBvcyA9IDAuMGYsIHpQb3MgPSAtNi4wZjsKLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMTsKLQkJCX0KLQkJfSk7Ci0KLQkJYW50aUFsaWFzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWFudGlBbGlhc0J1dHRvbi5zZXRUZXh0KCJBbnRpLUFsaWFzaW5nIik7Ci0JCWFudGlBbGlhc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWFudGlBbGlhc0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGFudGlBbGlhc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NNT09USCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0wuZ2xEZWxldGVMaXN0cygxLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJBbnRpLWFsaWFzaW5nIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlmaW5hbCBmbG9hdFtdIEJFWklFUl9QT0lOVFMgPSB7Ci0JCQktMS41ZiwgLTEuNWYsIDQuMGYsIC0wLjVmLCAtMS41ZiwgMi4wZiwgMC41ZiwgLTEuNWYsCi0JCQktMS4wZiwgMS41ZiwgLTEuNWYsIDIuMGYsIC0xLjVmLCAtMC41ZiwgMS4wZiwgLTAuNWYsCi0JCQktMC41ZiwgMy4wZiwgMC41ZiwgLTAuNWYsIDAuMGYsIDEuNWYsIC0wLjVmLCAtMS4wZiwKLQkJCS0xLjVmLCAwLjVmLCA0LjBmLCAtMC41ZiwgMC41ZiwgMC4wZiwgMC41ZiwgMC41ZiwKLQkJCTMuMGYsIDEuNWYsIDAuNWYsIDQuMGYsIC0xLjVmLCAxLjVmLCAtMi4wZiwgLTAuNWYsCi0JCQkxLjVmLCAtMi4wZiwgMC41ZiwgMS41ZiwgMC4wZiwgMS41ZiwgMS41ZiwgLTEuMGYsCi0JCX07Ci0JCUdMLmdsSGludChHTC5HTF9MSU5FX1NNT09USF9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfVkVSVEVYXzMsIDAsIDEsIDMsIDQsIDAsIDEsIDEyLCA0LCBCRVpJRVJfUE9JTlRTKTsKLQkJR0wuZ2xNYXBHcmlkMmYoMzAsIDAuMGYsIDEuMGYsIDMwLCAwLjBmLCAxLjBmKTsKLQotCQlHTC5nbEVuYWJsZShHTC5HTF9BVVRPX05PUk1BTCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJTkVfU01PT1RIKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TVElQUExFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQkxFTkQpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9NQVAyX1ZFUlRFWF8zKTsKLQotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwotCQlHTC5nbE5ld0xpc3QoMSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsRXZhbE1lc2gyKEdMLkdMX0xJTkUsIDAsIDMwLCAwLCAzMCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsQ2FsbExpc3QoMSk7CS8vIGRyYXcgdGhlIGJlaXplciBzdXJmYWNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9BcmVhVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1ZWU3Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0FyZWFUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEFyZWFUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCWFic3RyYWN0IGNsYXNzIFNoYXBlIHsKLQkJYWJzdHJhY3Qgdm9pZCBkcmF3KCk7Ci0JfQotCWNsYXNzIFN0YXRlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzdGF0ZQotCQkgKiBAcGFyYW0gaW5kZXggdGhlIGRpc3BsYXkgbGlzdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RhdGUKLQkJICovCi0JCVN0YXRlIChTdHJpbmcgbmFtZSwgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQl2b2lkIGRpc3BsYXkoKSB7Ci0JCQlHTC5nbENhbGxMaXN0KGluZGV4KTsKLQkJfQotCQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlHTC5nbERlbGV0ZUxpc3RzKGluZGV4LCAxKTsKLQkJfQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdGF0ZVtdIHN0YXRlczsKLQlwcml2YXRlIFN0YXRlIGN1cnJlbnRTdGF0ZTsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC0zMC4wZjsKLQlwcml2YXRlIGZsb2F0IHhSb3QgPSA5MC4wZiwgeVJvdCA9IDAuMGYsIHpSb3QgPSAwLjBmOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYywgZGlzazsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgyMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oMTApOwotCQl6TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelBvcyA9IHpNb3ZlLmdldFNlbGVjdGlvbigpIC0gNDA7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIHJvdGF0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvdGF0aW9uR3JvdXAuc2V0VGV4dCgiUm90YXRpb24iKTsKLQkJcm90YXRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJeFJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXhSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXhSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl4Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXhSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJeFJvdGF0aW9uLnNldFNlbGVjdGlvbig5MCk7Ci0JCXhSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFJvdCA9IHhSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeVJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl5Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl5Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeVJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl5Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXlSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXlSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVJvdCA9IHlSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgelJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl6Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl6Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJelJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl6Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXpSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29tcG9zaXRlIG9wdGlvbnNHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJbmV3IExhYmVsKG9wdGlvbnNHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlNoYXBlOiIpOwotCi0JCWZpbmFsIENvbWJvIHN0YXRlc0NvbWJvID0gbmV3IENvbWJvKG9wdGlvbnNHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzdGF0ZXNDb21iby5hZGQoc3RhdGVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJc3RhdGVzQ29tYm8uc2VsZWN0KDApOwotCQlzdGF0ZXNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFN0YXRlID0gc3RhdGVzW3N0YXRlc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCldOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gbGlnaHRzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWxpZ2h0c0J1dHRvbi5zZXRUZXh0KCJMaWdodHMiKTsKLQkJbGlnaHRzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJbGlnaHRzQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAobGlnaHRzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTC5nbERpc2FibGUoR0wuR0xfTElHSFRJTkcpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKGRpc2spOwotCQlpZiAoc3RhdGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RhdGVzIFtpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgbG9naWNhbCBBTkQgb2YgdHdvIHNoYXBlcy4KLQkgKgotCSAqIEBwYXJhbSBhIHNoYXBlIEEKLQkgKiBAcGFyYW0gYiBzaGFwZSBCCi0JICovCi0Jdm9pZCBkcmF3QWFuZEIoU2hhcGUgYSwgU2hhcGUgYikgewotCQkvLyBkcmF3IHBhcnRzIG9mIEIgdGhhdCBhcmUgaW5zaWRlIEEKLQkJZHJhd0FpbnNpZGVCKGEsIGIsIEdMLkdMX0JBQ0ssIEdMLkdMX05PVEVRVUFMKTsKLQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlIGZvbGxvd2luZyB0byBzaG93IHVwCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gdHVybiBvbiBkZXB0aCB0ZXN0aW5nCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9BTFdBWVMpOwotCQkvLyByZW5kZXIgdGhlIGZyb250IGZhY2Ugb2YgQgotCQliLmRyYXcoKTsKLQkJLy8gcmVzZXQgdGhlIGRlcHRoIGZ1bmN0aW9uCi0JCUdMLmdsRGVwdGhGdW5jKEdMLkdMX0xFU1MpOwotCQkvLyBkcmF3IHBhcnRzIG9mIEEgdGhhdCBhcmUgaW5zaWRlIEIKLQkJZHJhd0FpbnNpZGVCKGIsIGEsIEdMLkdMX0JBQ0ssIEdMLkdMX05PVEVRVUFMKTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgY29udGVudHMgb2Ygb25lIHNoYXBlIHRoYXQgYXBwZWFyIHdpdGhpbiBhbm90aGVyLgotCSAqCi0JICogQHBhcmFtIGEgdGhlIHNoYXBlIHRvIGRyYXcKLQkgKiBAcGFyYW0gYiB0aGUgY29uc3RyYWluaW5nIHNoYXBlCi0JICogQHBhcmFtIGZhY2UKLQkgKiBAcGFyYW0gdGVzdAotCSAqLwotCXZvaWQgZHJhd0FpbnNpZGVCKFNoYXBlIGEsIFNoYXBlIGIsIGludCBmYWNlLCBpbnQgdGVzdCkgewotCQkvLyB0dXJuIG9mZiB0aGUgY29sb3IgYnVmZmVyCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJLy8gY2xlYXIgdGhlIHN0ZW5jaWwgYnVmZmVyCi0JCUdMLmdsQ2xlYXJTdGVuY2lsKDApOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gc2V0IHRvIHByb3BlciBDdWxsaW5nCi0JCUdMLmdsQ3VsbEZhY2UoZmFjZSk7Ci0JCS8vIHJlbmRlciBzaGFwZSBBCi0JCWEuZHJhdygpOwotCQkvLyBzZXQgZGVwdGggbWFzawotCQlHTC5nbERlcHRoTWFzayhmYWxzZSk7Ci0JCS8vIGVuYWJsZSBzdGVuY2lsIHRlc3QKLQkJR0wuZ2xFbmFibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDAsIDApOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyIHRvIGluY3JlbWVudCBpZiB0aGUgZGVwdGggdGVzdCBwYXNzZXMKLQkJR0wuZ2xTdGVuY2lsT3AoR0wuR0xfS0VFUCwgR0wuR0xfS0VFUCwgR0wuR0xfSU5DUik7Ci0JCS8vIHR1cm4gb24gYmFjayBmYWNlIGN1bGxpbmcKLQkJR0wuZ2xDdWxsRmFjZShHTC5HTF9CQUNLKTsKLQkJLy8gcmVuZGVyIEIKLQkJYi5kcmF3KCk7Ci0JCS8vIHNldCB0aGUgc3RlbmNpbCBidWZmZXIgdG8gZGVjcmVtZW50IGlmIHRoZSBkZXB0aCB0ZXN0IHBhc3NlcwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9ERUNSKTsKLQkJLy8gY3VsbCB0aGUgZnJvbnQgZmFjZQotCQlHTC5nbEN1bGxGYWNlKEdMLkdMX0ZST05UKTsKLQkJLy8gcmVuZGVyIEIgYWdhaW4KLQkJYi5kcmF3KCk7Ci0JCS8vIHNldCBkZXB0aCBtYXNrCi0JCUdMLmdsRGVwdGhNYXNrKHRydWUpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJLy8gc2V0IHRoZSBzdGVuY2lsIGJ1ZmZlcgotCQlHTC5nbFN0ZW5jaWxGdW5jKHRlc3QsIDAsIDEpOwotCQkvLyB0dXJuIG9mZiBkZXB0aCB0ZXN0aW5nCi0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gc2V0IHRvIHByb3BlciBjdWxsaW5nCi0JCUdMLmdsQ3VsbEZhY2UoZmFjZSk7Ci0JCS8vIHJlbmRlciBBCi0JCWEuZHJhdygpOwotCQkvLyBkaXNhYmxlIHN0ZW5jaWwgdGVzdAotCQlHTC5nbERpc2FibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgbG9naWNhbCBPUiBvZiB0d28gc2hhcGVzLgotCSAqCi0JICogQHBhcmFtIGEgc2hhcGUgQQotCSAqIEBwYXJhbSBiIHNoYXBlIEIKLQkgKi8KLQl2b2lkIGRyYXdBb3JCKFNoYXBlIGEsIFNoYXBlIGIpIHsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCWEuZHJhdygpOwotCQliLmRyYXcoKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIG9uZSBzaGFwZSBzdWJ0cmFjdGVkIGZyb20gYW5vdGhlci4KLQkgKgotCSAqIEBwYXJhbSBhIHRoZSBiYXNlIHNoYXBlCi0JICogQHBhcmFtIGIgdGhlIHNoYXBlIHRvIHN1YnRyYWN0Ci0JICovCi0Jdm9pZCBkcmF3QXN1YkIoU2hhcGUgYSwgU2hhcGUgYikgewotCQkvLyBkcmF3IGJhY2sgcGFydHMgb2YgQiBpbnNpZGUgQQotCQlkcmF3QWluc2lkZUIoYiwgYSwgR0wuR0xfRlJPTlQsIEdMLkdMX05PVEVRVUFMKTsKLQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlIGZvbGxvd2luZyB0byBzaG93IHVwCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCS8vIGNoYW5nZSB0aGUgZGVwdGggdGVzdCB0byBHTF9BTFdBWVMKLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfQUxXQVlTKTsKLQkJLy8gcmVuZGVyIHRoZSBmcm9udCBmYWNlIG9mIEIKLQkJYS5kcmF3KCk7Ci0JCS8vIHJlc2V0IHRoZSBkZXB0aCBmdW5jdGlvbgotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVNTKTsKLQkJLy8gZHJhdyBmcm9udCBwYXJ0cyBvZiBBIG91dHNpZGUgQgotCQlkcmF3QWluc2lkZUIoYSwgYiwgR0wuR0xfQkFDSywgR0wuR0xfRVFVQUwpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBzcGVjaWZlZCBzaGFwZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hhcGUgdGhlIHNoYXBlIHRvIGRyYXcKLQkgKi8KLQl2b2lkIGRyYXdTaGFwZShTaGFwZSBzaGFwZSkgewotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJc2hhcGUuZHJhdygpOwotCQlHTC5nbERpc2FibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiQXJlYSI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0JCQotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCWZsb2F0W10gbGlnaHRQb3MgPSB7IDAuMGYsIDUuMGYsIC0xMC4wZiwgMS4wZiB9OwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgbGlnaHRQb3MpOwotCQlxdWFkcmF0aWMgPSBHTFUuZ2x1TmV3UXVhZHJpYygpOwotCQlkaXNrID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ1VMTF9GQUNFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElTVF9NT0RFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFRJTkcpOwotCQlHTC5nbExpZ2h0TW9kZWxpKEdMLkdMX0xJR0hUX01PREVMX1RXT19TSURFLCBHTC5HTF9UUlVFKTsKLQotCQlmaW5hbCBmbG9hdFtdIHNwaGVyZU1hdGVyaWFsID0geyAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmIH07Ci0JCWZpbmFsIGZsb2F0W10gY3lsaW5kZXJNYXRlcmlhbCA9IHsgMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiB9OwotCi0JCVNoYXBlIHNwaGVyZSA9IG5ldyBTaGFwZSgpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xNYXRlcmlhbGZ2KAotCQkJCQlHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfQU1CSUVOVF9BTkRfRElGRlVTRSwKLQkJCQkJc3BoZXJlTWF0ZXJpYWwpOwotCQkJCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMywgMzIsIDMyKTsKLQkJCX0KLQkJfTsKLQkJU2hhcGUgY3lsaW5kZXIgPSBuZXcgU2hhcGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsTWF0ZXJpYWxmdigKLQkJCQkJR0wuR0xfRlJPTlRfQU5EX0JBQ0ssCi0JCQkJCUdMLkdMX0FNQklFTlRfQU5EX0RJRkZVU0UsCi0JCQkJCWN5bGluZGVyTWF0ZXJpYWwpOwotCQkJCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJCQlHTFUuZ2x1UXVhZHJpY09yaWVudGF0aW9uKGRpc2ssIEdMVS5HTFVfSU5TSURFKTsKLQkJCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJCQlHTC5nbFRyYW5zbGF0ZWYoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCQkJR0xVLmdsdURpc2soZGlzaywgMCwgMywgMzIsIDMyKTsKLQkJCQlHTFUuZ2x1Q3lsaW5kZXIocXVhZHJhdGljLCAzLCAzLCA2LCAzMiwgMzIpOwotCQkJCUdMLmdsUHVzaE1hdHJpeCgpOwotCQkJCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCA2LjBmKTsKLQkJCQlHTFUuZ2x1UXVhZHJpY09yaWVudGF0aW9uKGRpc2ssIEdMVS5HTFVfT1VUU0lERSk7Ci0JCQkJR0xVLmdsdURpc2soZGlzaywgMCwgMywgMzIsIDMyKTsKLQkJCQlHTC5nbFBvcE1hdHJpeCgpOwotCQkJCUdMLmdsUG9wTWF0cml4KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gY3JlYXRlIHRoZSBkaXNwbGF5IGxpc3RzIGFuZCBzdGF0ZXMKLQkJc3RhdGVzID0gbmV3IFN0YXRlWzZdOwotCQlpbnQgaW5kZXggPSAxOwotCQkKLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd1NoYXBlKGN5bGluZGVyKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXN0YXRlc1swXSA9IG5ldyBTdGF0ZSgiQ3lsaW5kZXIiLGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdTaGFwZShzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzFdID0gbmV3IFN0YXRlKCJTcGhlcmUiLGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdBb3JCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzJdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBPUiBTcGhlcmUiLGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdBYW5kQihjeWxpbmRlciwgc3BoZXJlKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXN0YXRlc1szXSA9IG5ldyBTdGF0ZSgiQ3lsaW5kZXIgQU5EIFNwaGVyZSIsaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0FzdWJCKGN5bGluZGVyLCBzcGhlcmUpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc3RhdGVzWzRdID0gbmV3IFN0YXRlKCJDeWxpbmRlciBTVUIgU3BoZXJlIixpbmRleCsrKTsKLQkJCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdBc3ViQihzcGhlcmUsIGN5bGluZGVyKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXN0YXRlc1s1XSA9IG5ldyBTdGF0ZSgiU3BoZXJlIFNVQiBDeWxpbmRlciIsaW5kZXgrKyk7Ci0KLQkJY3VycmVudFN0YXRlID0gc3RhdGVzWzBdOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkCi0JICovCi0JYm9vbGVhbiBpc1N0ZW5jaWxTdXBwb3J0TmVlZGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcigKLQkJCUdMLkdMX0NPTE9SX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQKLQkJCQl8IEdMLkdMX1NURU5DSUxfQlVGRkVSX0JJVCk7Ci0KLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbFJvdGF0ZWYoeFJvdCwgMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih5Um90LCAwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHpSb3QsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0JCWN1cnJlbnRTdGF0ZS5kaXNwbGF5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9Db2xvclNlbGVjdGlvbkdyb3VwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkYmI1My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0NvbG9yU2VsZWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgQ29sb3JTZWxlY3Rpb25Hcm91cCBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZSBzdHlsZSBiaXRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbG9yIGdyb3VwCi0JICovCi0JQ29sb3JTZWxlY3Rpb25Hcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdENvbG9yKHBhcmVudC5nZXREaXNwbGF5KCkpOwotCi0JCUNvbXBvc2l0ZSBjb2xvckdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb2xvckdyb3VwLnNldExheW91dChsYXlvdXQpOwotLy8JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotLy8JCWNvbG9yR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGNvbG9yR3JvdXAsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWltYWdlID0gbmV3IEltYWdlKGJ1dHRvbi5nZXREaXNwbGF5KCksIDEyLCAxMik7Ci0JCWRyYXdCdXR0b25JbWFnZSgpOwotCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJaWYgKGNvbG9yICE9IG51bGwpIGNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb2xvckdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIkNvbG9yIik7Ci0vLwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBhcmd1bWVudCB0byB0aGlzIGdyb3VwJ3MgY29sbGVjdGlvbiBvZgotCSAqIGNvbG9yIHNlbGVjdGlvbiBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCBhZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKElDb2xvclNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGRFbGVtZW50KGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRHJhd3MgdGhlIGNvbG9yZWQgc3F1YXJlIG9uIHRoZSBzZWxlY3Rpb24gYnV0dG9uLgotCSAqLwotCXZvaWQgZHJhd0J1dHRvbkltYWdlKCkgewotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGggLSAxLCBib3VuZHMuaGVpZ2h0IC0gMSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJU2hlbGwgc2hlbGwgPSBidXR0b24uZ2V0U2hlbGwoKTsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IoCi0JCQluZXcgUkdCKGNvbG9yLmdldFJlZCgpLCBjb2xvci5nZXRHcmVlbigpLCBjb2xvci5nZXRCbHVlKCkpKTsKLQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJnYiA9PSBudWxsKSByZXR1cm47Ci0JCXNldFJHQihyZ2IpOwotCQlub3RpZnlMaXN0ZW5lcnMocmdiKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29sb3IgYnkgcXVlcnlpbmcgZm9yIHRoZSBjdXJyZW50IGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICovCi0Jdm9pZCBpbml0Q29sb3IoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWRvdWJsZVtdIGN1cnJlbnRDb2xvciA9IG5ldyBkb3VibGVbNF07Ci0JCUdMLmdsR2V0RG91YmxldihHTC5HTF9DVVJSRU5UX0NPTE9SLCBjdXJyZW50Q29sb3IpOwotCQlSR0IgcmdiID0KLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgY3VycmVudENvbG9yWzBdICogMjU1LAotCQkJCShpbnQpIGN1cnJlbnRDb2xvclsxXSAqIDI1NSwKLQkJCQkoaW50KSBjdXJyZW50Q29sb3JbMl0gKiAyNTUpOwotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhbGwgcmVnaXN0ZXJlZCBjb2xvciBzZWxlY3Rpb24gbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXZvaWQgbm90aWZ5TGlzdGVuZXJzKFJHQiByZ2IpIHsKLQkJSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnNBcnIgPQotCQkJbmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyW2xpc3RlbmVycy5zaXplKCldOwotCQlsaXN0ZW5lcnMuY29weUludG8obGlzdGVuZXJzQXJyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnNBcnIubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3RlbmVyc0FyciBbaV0uaGFuZGxlQ29sb3JTZWxlY3Rpb24ocmdiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGFyZ3VtZW50IGZyb20gdGhpcyBncm91cCdzIGNvbGxlY3Rpb24gb2YgY29sb3Igc2VsZWN0aW9uCi0JICogbGlzdGVuZXJzLiAgSWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHJlZ2lzdGVyZWQgbGlzdGVuZXIgdGhlbiBkb2VzCi0JICogbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgZm9yIHRoZSBncm91cCdzIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBuZXcgbGFiZWwgdGV4dAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgY29sb3IuCi0JICogCi0JICogQHBhcmFtIHJnYiB0aGUgcmdiIG9mIHRoZSBuZXcgY29sb3IKLQkgKi8KLQl2b2lkIHNldFJHQihSR0IgcmdiKSB7Ci0JCUNvbG9yIG9sZENvbG9yID0gY29sb3I7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGJ1dHRvbi5nZXREaXNwbGF5KCksIHJnYik7Ci0JCWRyYXdCdXR0b25JbWFnZSgpOwotCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgb2xkQ29sb3IuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0ZvZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzIwZDU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvRm9nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBGb2dUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCi0JcHJpdmF0ZSBmbG9hdCByb3RZID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHlQb3MgPSAwLjBmLCB4UG9zID0gMC4wZiwgelBvcyA9IC0xNS4wZjsKLQlwcml2YXRlIGludCBjdWJlTGlzdEluZGV4QmFzZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnRbXSBGT0dfVFlQRVMgPSB7IEdMLkdMX0xJTkVBUiwgR0wuR0xfRVhQLCBHTC5HTF9FWFAyIH07Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gRk9HX05BTUVTID0geyAiTElORUFSIiwgIkdMX0VYUCIsICJHTF9FWFAyIiB9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSAwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHlNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeU1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXlNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXlNb3ZlLnNldFRodW1iKDIpOwotCQl5TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl5TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXlNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5UG9zID0geU1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjQpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYig0KTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDI1OwotCQkJfQotCQl9KTsKLQotCQlDb21wb3NpdGUgZm9nVHlwZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWZvZ1R5cGVzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZvZ1R5cGVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJbmV3IExhYmVsKGZvZ1R5cGVzR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJGb2cgVHlwZXM6Iik7Ci0JCWZpbmFsIENvbWJvIGZvZ1R5cGVDb21ibyA9IG5ldyBDb21ibyhmb2dUeXBlc0dyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlmb2dUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZm9nVHlwZUNvbWJvLnNldEl0ZW1zKEZPR19OQU1FUyk7Ci0JCWZvZ1R5cGVDb21iby5zZWxlY3QoMCk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkZvZyBEZW5zaXR5OiIpOwotCQlmaW5hbCBTbGlkZXIgZm9nRGVuc2l0eVNsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldE1heGltdW0oMzIpOwotCQlmb2dEZW5zaXR5U2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0UGFnZUluY3JlbWVudCg1KTsKLQkJZm9nRGVuc2l0eVNsaWRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZvZ0RlbnNpdHlTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZsb2F0IGZvZ0RlbnNpdHkgPSAoKGZsb2F0KWZvZ0RlbnNpdHlTbGlkZXIuZ2V0U2VsZWN0aW9uKCkpIC8gMTAwOwotCQkJCUdMLmdsRm9nZihHTC5HTF9GT0dfREVOU0lUWSwgZm9nRGVuc2l0eSk7Ci0JCQl9Ci0JCX0pOwotCQlmb2dUeXBlQ29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludCBjdXJyZW50U2VsZWN0aW9uID0gZm9nVHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJLy8gZm9nIHR5cGUgR0wuR0xfTElORUFSIGRvZXMgbm90IHV0aWxpemUgZm9nRGVuc2l0eSwgYnV0IHRoZSBvdGhlciBmb2cgdHlwZXMgZG8KLQkJCQlmb2dEZW5zaXR5U2xpZGVyLnNldEVuYWJsZWQoY3VycmVudFNlbGVjdGlvbiAhPSAwKTsKLQkJCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX01PREUsIEZPR19UWVBFU1tjdXJyZW50U2VsZWN0aW9uXSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjdWJlIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICovCi0gCXZvaWQgY3JlYXRlQ3ViZSgpIHsKLQkJR0wuZ2xOZXdMaXN0KGN1YmVMaXN0SW5kZXhCYXNlLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZyb250Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgLTAuNWYsIDAuNWYpOwkvLyBib3R0b20gbGVmdCAKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7CS8vIHRvcCBsZWZ0Ci0JCS8vIGJhY2sKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgLTAuNWYpOwkvLyBib3R0b20gbGVmdCAKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIC0wLjVmLCAtMC41Zik7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgLTAuNWYpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAwLjVmLCAtMC41Zik7CS8vIHRvcCBsZWZ0Ci0JCS8vIGxlZnQKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgLTAuNWYpOwkvLyBib3R0b20gbGVmdAotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAwLjVmKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgMC41Zik7CS8vIHRvcCByaWdodAotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIGxlZnQJCi0JCS8vIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgMC41Zik7CS8vIGJvdHRvbSBsZWZ0Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAtMC41ZiwgLTAuNWYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuNWYsIDAuNWYsIC0wLjVmKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAwLjVmKTsJLy8gdG9wIGxlZnQKLQkJLy8gdG9wCi0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjVmLCAwLjVmLCAtMC41Zik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC41ZiwgMC41ZiwgLTAuNWYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIDAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgMC41ZiwgMC41Zik7Ci0JCS8vIGJvdHRvbQotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIDAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTAuNWYsIC0wLjVmLCAwLjVmKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0wLjVmLCAtMC41ZiwgLTAuNWYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC41ZiwgLTAuNWYsIC0wLjVmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoY3ViZUxpc3RJbmRleEJhc2UsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7CQotCX0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJGb2ciOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQkvLyBmb2cgY29sb3Igc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBjbGVhciBjb2xvcgotCQkvLyB0byBsb29rIGFwcHJvcHJpYXRlCi0JCWZsb2F0W10gZm9nQ29sb3IgPSB7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJR0wuZ2xGb2dmdihHTC5HTF9GT0dfQ09MT1IsIGZvZ0NvbG9yKTsKLQkJR0wuZ2xIaW50KEdMLkdMX0ZPR19ISU5ULCBHTC5HTF9ET05UX0NBUkUpOwotCQlHTC5nbEZvZ2YoR0wuR0xfRk9HX1NUQVJULCAwKTsKLQkJR0wuZ2xGb2dmKEdMLkdMX0ZPR19ERU5TSVRZLCAwLjBmKTsKLQkJLy8gc2V0IHRoZSBlbmQgb2YgdGhlIHN0YXJ0IGRpc3RhbmNlOyBhbnl0aGluZyA+IDE1Ci0JCS8vIHVuaXRzIGZyb20gdGhlIGNhbWVyYSB3aWxsIGJlIGNvdmVyZWQgaW4gZm9nCi0JCUdMLmdsRm9nZihHTC5HTF9GT0dfRU5ELCAxNSk7Ci0JCUdMLmdsRm9nZihHTC5HTF9GT0dfTU9ERSwgRk9HX1RZUEVTWzBdKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfRk9HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0KLQkJY3ViZUxpc3RJbmRleEJhc2UgPSBHTC5nbEdlbkxpc3RzKDEpOwotCQljcmVhdGVDdWJlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZihyb3RZLCAwLjBmLCAxLjBmLCAwLjBmKTsKLQotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDMsIDAsIC0zKTsKLQkJR0wuZ2xDYWxsTGlzdChjdWJlTGlzdEluZGV4QmFzZSk7Ci0JCUdMLmdsUG9wTWF0cml4KCk7Ci0KLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigtMywgMCwgLTMpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKDAsIDAsIDQpOwotCQlHTC5nbENhbGxMaXN0KGN1YmVMaXN0SW5kZXhCYXNlKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQlyb3RZICs9IDAuNmY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9HcmFkaWVudFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlkNWRmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvR3JhZGllbnRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIEdyYWRpZW50VGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLjBmLCB5UG9zID0gMC4wZiwgelBvcyA9IC03LjBmOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDE4MC4wZiwgeVJvdCA9IDE4MC4wZiwgelJvdCA9IDE4MC4wZjsKLQlwcml2YXRlIGludCBjdXJyZW50U2VsZWN0aW9uID0gMTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdFtdIEJFWklFUl9DT0xPUlMgPSB7Ci0JCTAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuM2YsIDAuNmYsIDAuMWYsIDAuMGYsCi0JCTAuOGYsIDAuMmYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCi0JCTAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuOGYsIDAuOGYsIDAuOGYsIDAuMGYKLQl9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGZsb2F0W10gQkVaSUVSX1BPSU5UUyA9IHsKLQkJLTEuNWYsIC0xLjVmLCA0LjBmLCAtMC41ZiwgLTEuNWYsIDIuMGYsIDAuNWYsIC0xLjVmLAotCQktMS4wZiwgMS41ZiwgLTEuNWYsIDIuMGYsIC0xLjVmLCAtMC41ZiwgMS4wZiwgLTAuNWYsCi0JCS0wLjVmLCAzLjBmLCAwLjVmLCAtMC41ZiwgMC4wZiwgMS41ZiwgLTAuNWYsIC0xLjBmLAotCQktMS41ZiwgMC41ZiwgNC4wZiwgLTAuNWYsIDAuNWYsIDAuMGYsIDAuNWYsIDAuNWYsCi0JCTMuMGYsIDEuNWYsIDAuNWYsIDQuMGYsIC0xLjVmLCAxLjVmLCAtMi4wZiwgLTAuNWYsCi0JCTEuNWYsIC0yLjBmLCAwLjVmLCAxLjVmLCAwLjBmLCAxLjVmLCAxLjVmLCAtMS4wZiwKLQl9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIE9CSkVDVF9OQU1FUyA9IHsgIkJlemllciIsICJTcXVhcmUiIH07Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMTIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl4TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFBvcyA9IHhNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeU1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeU1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl5TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeU1vdmUuc2V0TWluaW11bSgwKTsKLQkJeU1vdmUuc2V0VGh1bWIoMik7Ci0JCXlNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXlNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAxMjsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDE4MCk7Ci0JCXhSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFJvdCA9IHhSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeVJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl5Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl5Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeVJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl5Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXlSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMTgwKTsKLQkJeVJvdGF0aW9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl5Um90ID0geVJvdGF0aW9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocm90YXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6Um90YXRpb24gPSBuZXcgU2xpZGVyKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJelJvdGF0aW9uLnNldEluY3JlbWVudCgxMCk7Ci0JCXpSb3RhdGlvbi5zZXRNYXhpbXVtKDM2Mik7Ci0JCXpSb3RhdGlvbi5zZXRNaW5pbXVtKDApOwotCQl6Um90YXRpb24uc2V0VGh1bWIoMik7Ci0JCXpSb3RhdGlvbi5zZXRQYWdlSW5jcmVtZW50KDIwKTsKLQkJelJvdGF0aW9uLnNldFNlbGVjdGlvbigxODApOwotCQl6Um90YXRpb24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpSb3QgPSB6Um90YXRpb24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29tcG9zaXRlIG9iamVjdEdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJb2JqZWN0R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCW5ldyBMYWJlbChvYmplY3RHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIk9iamVjdDoiKTsKLQkJZmluYWwgQ29tYm8gb2JqZWN0Q29tYm8gPSBuZXcgQ29tYm8ob2JqZWN0R3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCW9iamVjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9iamVjdENvbWJvLnNldEl0ZW1zKE9CSkVDVF9OQU1FUyk7Ci0JCW9iamVjdENvbWJvLnNlbGVjdCgwKTsKLQkJb2JqZWN0Q29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBvYmplY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICsgMTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTC5nbERlbGV0ZUxpc3RzKDEsIDIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJHcmFkaWVudHMiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xIaW50KEdMLkdMX0xJTkVfU01PT1RIX0hJTlQsIEdMLkdMX05JQ0VTVCk7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCUdMLmdsUG9seWdvbk1vZGUoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0ZJTEwpOwotCQlHTC5nbE1hcDJmKEdMLkdMX01BUDJfVkVSVEVYXzMsIDAsIDEsIDMsIDQsIDAsIDEsIDEyLCA0LCBCRVpJRVJfUE9JTlRTKTsKLQkJR0wuZ2xNYXAyZihHTC5HTF9NQVAyX0NPTE9SXzQsIDAsIDEsIDQsIDEsIDAsIDEsIDQsIDYsIEJFWklFUl9DT0xPUlMpOwotCQlHTC5nbE1hcEdyaWQyZigyMCwgMC4wZiwgMS4wZiwgMjAsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFNoYWRlTW9kZWwoR0wuR0xfU01PT1RIKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9MSU5FX1NUSVBQTEUpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfQ09MT1JfNCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX01BUDJfVkVSVEVYXzMpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQkvLyBjcmVhdGUgZGlzcGxheSBsaXN0cwotCQlHTC5nbE5ld0xpc3QoMSwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsRXZhbE1lc2gyKEdMLkdMX0ZJTEwsIDAsIDIwLCAwLCAyMCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlHTC5nbE5ld0xpc3QoMiwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVfRkFOKTsKLQkJR0wuZ2xDb2xvcjNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMC4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ29sb3IzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChjdXJyZW50U2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0lDb2xvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOTM1NDEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JQ29sb3JTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb2xvclNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKTsKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvSW1hZ2VEYXRhVXRpbC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxNjZhZTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9JbWFnZURhdGFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLQotcHVibGljIGNsYXNzIEltYWdlRGF0YVV0aWwgewotCS8qKgotCSAqIEFscGhhIG1vZGUsIHZhbHVlcyAwIC0gMjU1IHNwZWNpZnkgZ2xvYmFsIGFscGhhIGxldmVsCi0JICovCi0Jc3RhdGljIGZpbmFsIGludAotCQlBTFBIQV9PUEFRVUUgPSAyNTUsICAgICAgICAgICAvLyBGdWxseSBvcGFxdWUgKGlnbm9yZXMgYW55IGFscGhhIGRhdGEpCi0JCUFMUEhBX1RSQU5TUEFSRU5UID0gMCwgICAgICAgIC8vIEZ1bGx5IHRyYW5zcGFyZW50IChpZ25vcmVzIGFueSBhbHBoYSBkYXRhKQotCQlBTFBIQV9DSEFOTkVMX1NFUEFSQVRFID0gLTEsICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBmcm9tIHNlcGFyYXRlIGFscGhhRGF0YQotCQlBTFBIQV9DSEFOTkVMX1NPVVJDRSA9IC0yLCAgICAvLyBVc2UgYWxwaGEgY2hhbm5lbCBlbWJlZGRlZCBpbiBzb3VyY2VEYXRhCi0JCUFMUEhBX01BU0tfVU5QQUNLRUQgPSAtMywgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgYnl0ZXMgaW4gYWxwaGFEYXRhIChub24temVybyBpcyBvcGFxdWUpCi0JCUFMUEhBX01BU0tfUEFDS0VEID0gLTQsICAgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgcGFja2VkIGJpdHMgaW4gYWxwaGFEYXRhCi0JCUFMUEhBX01BU0tfSU5ERVggPSAtNSwgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBwYWxldHRlIGluZGljZXMgdHJhbnNwYXJlbnQgaWYgaW4gYWxwaGFEYXRhIGFycmF5Ci0JCUFMUEhBX01BU0tfUkdCID0gLTY7ICAgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBSR0JzIHRyYW5zcGFyZW50IGlmIGluIFJHQjg4OCBmb3JtYXQgYWxwaGFEYXRhIGFycmF5Ci0JCQotCS8qKgotCSAqIERhdGEgdHlwZXMgKGludGVybmFsKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAotCQkvLyBkaXJlY3QgLyB0cnVlIGNvbG9yIGZvcm1hdHMgd2l0aCBhcmJpdHJhcnkgbWFza3MgJiBzaGlmdHMKLQkJVFlQRV9HRU5FUklDXzggPSAwLAotCQlUWVBFX0dFTkVSSUNfMTZfTVNCID0gMSwKLQkJVFlQRV9HRU5FUklDXzE2X0xTQiA9IDIsCi0JCVRZUEVfR0VORVJJQ18yNCA9IDMsCi0JCVRZUEVfR0VORVJJQ18zMl9NU0IgPSA0LAotCQlUWVBFX0dFTkVSSUNfMzJfTFNCID0gNTsKLQkJCi0JLyoqCi0JICogQnl0ZSBhbmQgYml0IG9yZGVyIGNvbnN0YW50cy4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IExTQl9GSVJTVCA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBNU0JfRklSU1QgPSAxOwotCQotCS8qKgotCSAqIEJsaXQgb3BlcmF0aW9uIGJpdHMgdG8gYmUgT1InZWQgdG9nZXRoZXIgdG8gc3BlY2lmeSB0aGUgZGVzaXJlZCBvcGVyYXRpb24uCi0JICovCi0Jc3RhdGljIGZpbmFsIGludAotCQlCTElUX1NSQyA9IDEsICAgICAvLyBjb3B5IHNvdXJjZSBkaXJlY3RseSwgZWxzZSBhcHBsaWVzIGxvZ2ljIG9wZXJhdGlvbnMKLQkJQkxJVF9BTFBIQSA9IDIsICAgLy8gZW5hYmxlIGFscGhhIGJsZW5kaW5nCi0JCUJMSVRfRElUSEVSID0gNDsgIC8vIGVuYWJsZSBkaXRoZXJpbmcgaW4gbG93IGNvbG9yIG1vZGVzCi0JCQotCS8qKgotCSAqIEFyYml0cmFyeSBjaGFubmVsIHdpZHRoIGRhdGEgdG8gOC1iaXQgY29udmVyc2lvbiB0YWJsZS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgYnl0ZVtdW10gQU5ZX1RPX0VJR0hUID0gbmV3IGJ5dGVbOV1bXTsKLQlzdGF0aWMgewotCQlmb3IgKGludCBiID0gMDsgYiA8IDk7ICsrYikgewotCQkJYnl0ZVtdIGRhdGEgPSBBTllfVE9fRUlHSFRbYl0gPSBuZXcgYnl0ZVsxIDw8IGJdOwotCQkJaWYgKGIgPT0gMCkgY29udGludWU7Ci0JCQlpbnQgaW5jID0gMDsKLQkJCWZvciAoaW50IGJpdCA9IDB4MTAwMDA7IChiaXQgPj49IGIpICE9IDA7KSBpbmMgfD0gYml0OwotCQkJZm9yIChpbnQgdiA9IDAsIHAgPSAwOyB2IDwgMHgxMDAwMDsgdis9IGluYykgZGF0YVtwKytdID0gKGJ5dGUpKHYgPj4gOCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCbGl0cyBhIGRpcmVjdCBwYWxldHRlIGltYWdlIGludG8gYSBkaXJlY3QgcGFsZXR0ZSBpbWFnZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBXaGVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRlcHRoLCBvcmRlciBhbmQgbWFza3MKLQkgKiBhcmUgcGFpcndpc2UgZXF1YWwgYW5kIHRoZSBibGl0dGVyIG9wZXJhdGlvbiBpcyBCTElUX1NSQywKLQkgKiB0aGUgbWFza3MgYXJlIGlnbm9yZWQuICBIZW5jZSB3aGVuIG5vdCBjaGFuZ2luZyB0aGUgaW1hZ2UKLQkgKiBkYXRhIGZvcm1hdCwgMCBtYXkgYmUgc3BlY2lmaWVkIGZvciB0aGUgbWFza3MuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBvcCB0aGUgYmxpdHRlciBvcGVyYXRpb246IGEgY29tYmluYXRpb24gb2YgQkxJVF94eHggZmxhZ3MKLQkgKiAgICAgICAgKHNlZSBCTElUX3h4eCBjb25zdGFudHMpCi0JICogQHBhcmFtIHNyY0RhdGEgdGhlIHNvdXJjZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotCSAqIEBwYXJhbSBzcmNEZXB0aCB0aGUgc291cmNlIGRlcHRoOiBvbmUgb2YgOCwgMTYsIDI0LCAzMgotCSAqIEBwYXJhbSBzcmNTdHJpZGUgdGhlIHNvdXJjZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKLQkgKiBAcGFyYW0gc3JjT3JkZXIgdGhlIHNvdXJjZSBieXRlIG9yZGVyaW5nOiBvbmUgb2YgTVNCX0ZJUlNUIG9yIExTQl9GSVJTVDsKLQkgKiAgICAgICAgaWdub3JlZCBpZiBzcmNEZXB0aCBpcyBub3QgMTYgb3IgMzIKLQkgKiBAcGFyYW0gc3JjWCB0aGUgdG9wLWxlZnQgeC1jb29yZCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1kgdGhlIHRvcC1sZWZ0IHktY29vcmQgb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBzcmNXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHNvdXJjZSBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBzcmNIZWlnaHQgdGhlIGhlaWdodCBvZiB0aGUgc291cmNlIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIHNyY1JlZE1hc2sgdGhlIHNvdXJjZSByZWQgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIHNyY0dyZWVuTWFzayB0aGUgc291cmNlIGdyZWVuIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBzcmNCbHVlTWFzayB0aGUgc291cmNlIGJsdWUgY2hhbm5lbCBtYXNrCi0JICogQHBhcmFtIGFscGhhTW9kZSB0aGUgYWxwaGEgYmxlbmRpbmcgb3IgbWFzayBtb2RlLCBtYXkgYmUKLQkgKiAgICAgICAgYW4gaW50ZWdlciAwLTI1NSBmb3IgZ2xvYmFsIGFscGhhOyBpZ25vcmVkIGlmIEJMSVRfQUxQSEEKLQkgKiAgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgYmxpdHRlciBvcGVyYXRpb25zCi0JICogICAgICAgIChzZWUgQUxQSEFfTU9ERV94eHggY29uc3RhbnRzKQotCSAqIEBwYXJhbSBhbHBoYURhdGEgdGhlIGFscGhhIGJsZW5kaW5nIG9yIG1hc2sgZGF0YSwgdmFyaWVzIGRlcGVuZGluZwotCSAqICAgICAgICBvbiB0aGUgdmFsdWUgb2YgYWxwaGFNb2RlIGFuZCBzb21ldGltZXMgaWdub3JlZAotCSAqIEBwYXJhbSBhbHBoYVN0cmlkZSB0aGUgYWxwaGEgZGF0YSBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKLQkgKiBAcGFyYW0gYWxwaGFYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBhbHBoYSBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBhbHBoYVkgdGhlIHRvcC1sZWZ0IHktY29vcmQgb2YgdGhlIGFscGhhIGJsaXQgcmVnaW9uCi0JICogQHBhcmFtIGRlc3REYXRhIHRoZSBkZXN0aW5hdGlvbiBieXRlIGFycmF5IGNvbnRhaW5pbmcgaW1hZ2UgZGF0YQotCSAqIEBwYXJhbSBkZXN0RGVwdGggdGhlIGRlc3RpbmF0aW9uIGRlcHRoOiBvbmUgb2YgOCwgMTYsIDI0LCAzMgotCSAqIEBwYXJhbSBkZXN0U3RyaWRlIHRoZSBkZXN0aW5hdGlvbiBudW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUKLQkgKiBAcGFyYW0gZGVzdE9yZGVyIHRoZSBkZXN0aW5hdGlvbiBieXRlIG9yZGVyaW5nOiBvbmUgb2YgTVNCX0ZJUlNUIG9yIExTQl9GSVJTVDsKLQkgKiAgICAgICAgaWdub3JlZCBpZiBkZXN0RGVwdGggaXMgbm90IDE2IG9yIDMyCi0JICogQHBhcmFtIGRlc3RYIHRoZSB0b3AtbGVmdCB4LWNvb3JkIG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0WSB0aGUgdG9wLWxlZnQgeS1jb29yZCBvZiB0aGUgZGVzdGluYXRpb24gYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdFdpZHRoIHRoZSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gYmxpdCByZWdpb24KLQkgKiBAcGFyYW0gZGVzdEhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBkZXN0aW5hdGlvbiBibGl0IHJlZ2lvbgotCSAqIEBwYXJhbSBkZXN0UmVkTWFzayB0aGUgZGVzdGluYXRpb24gcmVkIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBkZXN0R3JlZW5NYXNrIHRoZSBkZXN0aW5hdGlvbiBncmVlbiBjaGFubmVsIG1hc2sKLQkgKiBAcGFyYW0gZGVzdEJsdWVNYXNrIHRoZSBkZXN0aW5hdGlvbiBibHVlIGNoYW5uZWwgbWFzawotCSAqIEBwYXJhbSBmbGlwWCBpZiB0cnVlIHRoZSByZXN1bHRpbmcgaW1hZ2UgaXMgZmxpcHBlZCBhbG9uZyB0aGUgdmVydGljYWwgYXhpcwotCSAqIEBwYXJhbSBmbGlwWSBpZiB0cnVlIHRoZSByZXN1bHRpbmcgaW1hZ2UgaXMgZmxpcHBlZCBhbG9uZyB0aGUgaG9yaXpvbnRhbCBheGlzCi0JICovCi0Jc3RhdGljIHZvaWQgYmxpdChpbnQgb3AsCi0JCWJ5dGVbXSBzcmNEYXRhLCBpbnQgc3JjRGVwdGgsIGludCBzcmNTdHJpZGUsIGludCBzcmNPcmRlciwKLQkJaW50IHNyY1gsIGludCBzcmNZLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCi0JCWludCBzcmNSZWRNYXNrLCBpbnQgc3JjR3JlZW5NYXNrLCBpbnQgc3JjQmx1ZU1hc2ssCi0JCWludCBhbHBoYU1vZGUsIGJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYVN0cmlkZSwgaW50IGFscGhhWCwgaW50IGFscGhhWSwKLQkJYnl0ZVtdIGRlc3REYXRhLCBpbnQgZGVzdERlcHRoLCBpbnQgZGVzdFN0cmlkZSwgaW50IGRlc3RPcmRlciwKLQkJaW50IGRlc3RYLCBpbnQgZGVzdFksIGludCBkZXN0V2lkdGgsIGludCBkZXN0SGVpZ2h0LAotCQlpbnQgZGVzdFJlZE1hc2ssIGludCBkZXN0R3JlZW5NYXNrLCBpbnQgZGVzdEJsdWVNYXNrLAotCQlib29sZWFuIGZsaXBYLCBib29sZWFuIGZsaXBZKSB7Ci0JCWlmICgoZGVzdFdpZHRoIDw9IDApIHx8IChkZXN0SGVpZ2h0IDw9IDApIHx8IChhbHBoYU1vZGUgPT0gQUxQSEFfVFJBTlNQQVJFTlQpKSByZXR1cm47Ci0KLQkJLy8gdGhlc2Ugc2hvdWxkIGJlIHN1cHBsaWVkIGFzIHBhcmFtcyBsYXRlcgotCQlmaW5hbCBpbnQgc3JjQWxwaGFNYXNrID0gMCwgZGVzdEFscGhhTWFzayA9IDA7Ci0KLQkJLyoqKiBQcmVwYXJlIHNjYWxpbmcgZGF0YSAqKiovCi0JCWZpbmFsIGludCBkd20xID0gZGVzdFdpZHRoIC0gMTsKLQkJZmluYWwgaW50IHNmeGkgPSAoZHdtMSAhPSAwKSA/IChpbnQpKCgoKGxvbmcpc3JjV2lkdGggPDwgMTYpIC0gMSkgLyBkd20xKSA6IDA7Ci0JCWZpbmFsIGludCBkaG0xID0gZGVzdEhlaWdodCAtIDE7Ci0JCWZpbmFsIGludCBzZnlpID0gKGRobTEgIT0gMCkgPyAoaW50KSgoKChsb25nKXNyY0hlaWdodCA8PCAxNikgLSAxKSAvIGRobTEpIDogMDsKLQotCQkvKioqIFByZXBhcmUgc291cmNlLXJlbGF0ZWQgZGF0YSAqKiovCi0JCWZpbmFsIGludCBzYnBwLCBzdHlwZTsKLQkJc3dpdGNoIChzcmNEZXB0aCkgewotCQkJY2FzZSA4OgotCQkJCXNicHAgPSAxOwotCQkJCXN0eXBlID0gVFlQRV9HRU5FUklDXzg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2OgotCQkJCXNicHAgPSAyOwotCQkJCXN0eXBlID0gKHNyY09yZGVyID09IE1TQl9GSVJTVCkgPyBUWVBFX0dFTkVSSUNfMTZfTVNCIDogVFlQRV9HRU5FUklDXzE2X0xTQjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjQ6Ci0JCQkJc2JwcCA9IDM7Ci0JCQkJc3R5cGUgPSBUWVBFX0dFTkVSSUNfMjQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDMyOgotCQkJCXNicHAgPSA0OwotCQkJCXN0eXBlID0gKHNyY09yZGVyID09IE1TQl9GSVJTVCkgPyBUWVBFX0dFTkVSSUNfMzJfTVNCIDogVFlQRV9HRU5FUklDXzMyX0xTQjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNvdXJjZSB0eXBlIik7Ci0JCQkJcmV0dXJuOwotCQl9CQkJCi0JCWludCBzcHIgPSBzcmNZICogc3JjU3RyaWRlICsgc3JjWCAqIHNicHA7Ci0KLQkJLyoqKiBQcmVwYXJlIGRlc3RpbmF0aW9uLXJlbGF0ZWQgZGF0YSAqKiovCi0JCWZpbmFsIGludCBkYnBwLCBkdHlwZTsKLQkJc3dpdGNoIChkZXN0RGVwdGgpIHsKLQkJCWNhc2UgODoKLQkJCQlkYnBwID0gMTsKLQkJCQlkdHlwZSA9IFRZUEVfR0VORVJJQ184OwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNjoKLQkJCQlkYnBwID0gMjsKLQkJCQlkdHlwZSA9IChkZXN0T3JkZXIgPT0gTVNCX0ZJUlNUKSA/IFRZUEVfR0VORVJJQ18xNl9NU0IgOiBUWVBFX0dFTkVSSUNfMTZfTFNCOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyNDoKLQkJCQlkYnBwID0gMzsKLQkJCQlkdHlwZSA9IFRZUEVfR0VORVJJQ18yNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzI6Ci0JCQkJZGJwcCA9IDQ7Ci0JCQkJZHR5cGUgPSAoZGVzdE9yZGVyID09IE1TQl9GSVJTVCkgPyBUWVBFX0dFTkVSSUNfMzJfTVNCIDogVFlQRV9HRU5FUklDXzMyX0xTQjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRlc3RpbmF0aW9uIHR5cGUiKTsKLQkJCQlyZXR1cm47Ci0JCX0JCQkKLQkJaW50IGRwciA9ICgoZmxpcFkpID8gZGVzdFkgKyBkaG0xIDogZGVzdFkpICogZGVzdFN0cmlkZSArICgoZmxpcFgpID8gZGVzdFggKyBkd20xIDogZGVzdFgpICogZGJwcDsKLQkJZmluYWwgaW50IGRwcnhpID0gKGZsaXBYKSA/IC1kYnBwIDogZGJwcDsKLQkJZmluYWwgaW50IGRwcnlpID0gKGZsaXBZKSA/IC1kZXN0U3RyaWRlIDogZGVzdFN0cmlkZTsKLQotCQkvKioqIFByZXBhcmUgc3BlY2lhbCBwcm9jZXNzaW5nIGRhdGEgKioqLwotCQlpbnQgYXByOwotCQlpZiAoKG9wICYgQkxJVF9BTFBIQSkgIT0gMCkgewotCQkJc3dpdGNoIChhbHBoYU1vZGUpIHsKLQkJCQljYXNlIEFMUEhBX01BU0tfVU5QQUNLRUQ6Ci0JCQkJY2FzZSBBTFBIQV9DSEFOTkVMX1NFUEFSQVRFOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFwciA9IGFscGhhWSAqIGFscGhhU3RyaWRlICsgYWxwaGFYOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFMUEhBX01BU0tfUEFDS0VEOgotCQkJCQlpZiAoYWxwaGFEYXRhID09IG51bGwpIGFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQkJCWFscGhhU3RyaWRlIDw8PSAzOwotCQkJCQlhcHIgPSBhbHBoYVkgKiBhbHBoYVN0cmlkZSArIGFscGhhWDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBTFBIQV9NQVNLX0lOREVYOgotCQkJCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYWxwaGEgdHlwZSIpOwotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBBTFBIQV9NQVNLX1JHQjoKLQkJCQkJaWYgKGFscGhhRGF0YSA9PSBudWxsKSBhbHBoYU1vZGUgPSAweDEwMDAwOwotCQkJCQlhcHIgPSAwOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlhbHBoYU1vZGUgPSAoYWxwaGFNb2RlIDw8IDE2KSAvIDI1NTsgLy8gcHJlc2NhbGUKLQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU09VUkNFOgotCQkJCQlhcHIgPSAwOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFscGhhTW9kZSA9IDB4MTAwMDA7Ci0JCQlhcHIgPSAwOwotCQl9Ci0KLQkJLyoqKiBCbGl0ICoqKi8KLQkJaW50IGRwID0gZHByOwotCQlpbnQgc3AgPSBzcHI7Ci0JCWlmICgoYWxwaGFNb2RlID09IDB4MTAwMDApICYmIChzdHlwZSA9PSBkdHlwZSkgJiYKLQkJCShzcmNSZWRNYXNrID09IGRlc3RSZWRNYXNrKSAmJiAoc3JjR3JlZW5NYXNrID09IGRlc3RHcmVlbk1hc2spICYmCi0JCQkoc3JjQmx1ZU1hc2sgPT0gZGVzdEJsdWVNYXNrKSAmJiAoc3JjQWxwaGFNYXNrID09IGRlc3RBbHBoYU1hc2spKSB7Ci0JCQkvKioqIEZhc3QgYmxpdCAoc3RyYWlnaHQgY29weSkgKioqLwotCQkJc3dpdGNoIChzYnBwKSB7Ci0JCQkJY2FzZSAxOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwkJCQkJCi0JCQkJY2FzZSAyOgotCQkJCQlmb3IgKGludCBkeSA9IGRlc3RIZWlnaHQsIHNmeSA9IHNmeWk7IGR5ID4gMDsgLS1keSwgc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLCBzZnkgPSAoc2Z5ICYgMHhmZmZmKSArIHNmeWksIGRwID0gZHByICs9IGRwcnlpKSB7Ci0JCQkJCQlmb3IgKGludCBkeCA9IGRlc3RXaWR0aCwgc2Z4ID0gc2Z4aTsgZHggPiAwOyAtLWR4LCBkcCArPSBkcHJ4aSwgc2Z4ID0gKHNmeCAmIDB4ZmZmZikgKyBzZnhpKSB7Ci0JCQkJCQkJZGVzdERhdGFbZHBdID0gc3JjRGF0YVtzcF07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IHNyY0RhdGFbc3AgKyAxXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJZm9yIChpbnQgZHkgPSBkZXN0SGVpZ2h0LCBzZnkgPSBzZnlpOyBkeSA+IDA7IC0tZHksIHNwID0gc3ByICs9IChzZnkgPj4+IDE2KSAqIHNyY1N0cmlkZSwgc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLCBkcCA9IGRwciArPSBkcHJ5aSkgewotCQkJCQkJZm9yIChpbnQgZHggPSBkZXN0V2lkdGgsIHNmeCA9IHNmeGk7IGR4ID4gMDsgLS1keCwgZHAgKz0gZHByeGksIHNmeCA9IChzZnggJiAweGZmZmYpICsgc2Z4aSkgewotCQkJCQkJCWRlc3REYXRhW2RwXSA9IHNyY0RhdGFbc3BdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSBzcmNEYXRhW3NwICsgMV07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IHNyY0RhdGFbc3AgKyAyXTsKLQkJCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiAzOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDoKLQkJCQkJZm9yIChpbnQgZHkgPSBkZXN0SGVpZ2h0LCBzZnkgPSBzZnlpOyBkeSA+IDA7IC0tZHksIHNwID0gc3ByICs9IChzZnkgPj4+IDE2KSAqIHNyY1N0cmlkZSwgc2Z5ID0gKHNmeSAmIDB4ZmZmZikgKyBzZnlpLCBkcCA9IGRwciArPSBkcHJ5aSkgewotCQkJCQkJZm9yIChpbnQgZHggPSBkZXN0V2lkdGgsIHNmeCA9IHNmeGk7IGR4ID4gMDsgLS1keCwgZHAgKz0gZHByeGksIHNmeCA9IChzZnggJiAweGZmZmYpICsgc2Z4aSkgewotCQkJCQkJCWRlc3REYXRhW2RwXSA9IHNyY0RhdGFbc3BdOwotCQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSBzcmNEYXRhW3NwICsgMV07Ci0JCQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IHNyY0RhdGFbc3AgKyAyXTsKLQkJCQkJCQlkZXN0RGF0YVtkcCArIDNdID0gc3JjRGF0YVtzcCArIDNdOwotCQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoqKiBDb21wcmVoZW5zaXZlIGJsaXQgKGFwcGx5IHRyYW5zZm9ybWF0aW9ucykgKioqLwotCQlmaW5hbCBpbnQgc3JjUmVkU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoc3JjUmVkTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNSZWRzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNSZWRNYXNrLCBzcmNSZWRTaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjR3JlZW5TaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNHcmVlbk1hc2spOwotCQlmaW5hbCBieXRlW10gc3JjR3JlZW5zID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNHcmVlbk1hc2ssIHNyY0dyZWVuU2hpZnQpXTsKLQkJZmluYWwgaW50IHNyY0JsdWVTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNCbHVlTWFzayk7Ci0JCWZpbmFsIGJ5dGVbXSBzcmNCbHVlcyA9IEFOWV9UT19FSUdIVFtnZXRDaGFubmVsV2lkdGgoc3JjQmx1ZU1hc2ssIHNyY0JsdWVTaGlmdCldOwotCQlmaW5hbCBpbnQgc3JjQWxwaGFTaGlmdCA9IGdldENoYW5uZWxTaGlmdChzcmNBbHBoYU1hc2spOwotCQlmaW5hbCBieXRlW10gc3JjQWxwaGFzID0gQU5ZX1RPX0VJR0hUW2dldENoYW5uZWxXaWR0aChzcmNBbHBoYU1hc2ssIHNyY0FscGhhU2hpZnQpXTsKLQotCQlmaW5hbCBpbnQgZGVzdFJlZFNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KGRlc3RSZWRNYXNrKTsKLQkJZmluYWwgaW50IGRlc3RSZWRXaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0UmVkTWFzaywgZGVzdFJlZFNoaWZ0KTsKLQkJZmluYWwgYnl0ZVtdIGRlc3RSZWRzID0gQU5ZX1RPX0VJR0hUW2Rlc3RSZWRXaWR0aF07Ci0JCWZpbmFsIGludCBkZXN0UmVkUHJlU2hpZnQgPSA4IC0gZGVzdFJlZFdpZHRoOwotCQlmaW5hbCBpbnQgZGVzdEdyZWVuU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdEdyZWVuTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0R3JlZW5XaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0R3JlZW5NYXNrLCBkZXN0R3JlZW5TaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0R3JlZW5zID0gQU5ZX1RPX0VJR0hUW2Rlc3RHcmVlbldpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RHcmVlblByZVNoaWZ0ID0gOCAtIGRlc3RHcmVlbldpZHRoOwotCQlmaW5hbCBpbnQgZGVzdEJsdWVTaGlmdCA9IGdldENoYW5uZWxTaGlmdChkZXN0Qmx1ZU1hc2spOwotCQlmaW5hbCBpbnQgZGVzdEJsdWVXaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0Qmx1ZU1hc2ssIGRlc3RCbHVlU2hpZnQpOwotCQlmaW5hbCBieXRlW10gZGVzdEJsdWVzID0gQU5ZX1RPX0VJR0hUW2Rlc3RCbHVlV2lkdGhdOwotCQlmaW5hbCBpbnQgZGVzdEJsdWVQcmVTaGlmdCA9IDggLSBkZXN0Qmx1ZVdpZHRoOwotCQlmaW5hbCBpbnQgZGVzdEFscGhhU2hpZnQgPSBnZXRDaGFubmVsU2hpZnQoZGVzdEFscGhhTWFzayk7Ci0JCWZpbmFsIGludCBkZXN0QWxwaGFXaWR0aCA9IGdldENoYW5uZWxXaWR0aChkZXN0QWxwaGFNYXNrLCBkZXN0QWxwaGFTaGlmdCk7Ci0JCWZpbmFsIGJ5dGVbXSBkZXN0QWxwaGFzID0gQU5ZX1RPX0VJR0hUW2Rlc3RBbHBoYVdpZHRoXTsKLQkJZmluYWwgaW50IGRlc3RBbHBoYVByZVNoaWZ0ID0gOCAtIGRlc3RBbHBoYVdpZHRoOwotCi0JCWludCBhcCA9IGFwciwgYWxwaGEgPSBhbHBoYU1vZGU7Ci0JCWludCByID0gMCwgZyA9IDAsIGIgPSAwLCBhID0gMDsKLQkJaW50IHJxID0gMCwgZ3EgPSAwLCBicSA9IDAsIGFxID0gMDsKLQkJZm9yIChpbnQgZHkgPSBkZXN0SGVpZ2h0LCBzZnkgPSBzZnlpOyBkeSA+IDA7IC0tZHksCi0JCQkJc3AgPSBzcHIgKz0gKHNmeSA+Pj4gMTYpICogc3JjU3RyaWRlLAotCQkJCWFwID0gYXByICs9IChzZnkgPj4+IDE2KSAqIGFscGhhU3RyaWRlLAotCQkJCXNmeSA9IChzZnkgJiAweGZmZmYpICsgc2Z5aSwKLQkJCQlkcCA9IGRwciArPSBkcHJ5aSkgewotCQkJZm9yIChpbnQgZHggPSBkZXN0V2lkdGgsIHNmeCA9IHNmeGk7IGR4ID4gMDsgLS1keCwKLQkJCQkJZHAgKz0gZHByeGksCi0JCQkJCXNmeCA9IChzZnggJiAweGZmZmYpICsgc2Z4aSkgewotCQkJCS8qKiogUkVBRCBORVhUIFBJWEVMICoqKi8KLQkJCQlzd2l0Y2ggKHN0eXBlKSB7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzg6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gc3JjRGF0YVtzcF0gJiAweGZmOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpOwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMTZfTVNCOiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8IChzcmNEYXRhW3NwICsgMV0gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDI7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9MU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChzcmNEYXRhW3NwICsgMV0gJiAweGZmKSA8PCA4KSB8IChzcmNEYXRhW3NwXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMjsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzI0OiB7Ci0JCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoc3JjRGF0YVtzcF0gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpOwotCQkJCQkJc3AgKz0gKHNmeCA+Pj4gMTYpICogMzsKLQkJCQkJCXIgPSBzcmNSZWRzWyhkYXRhICYgc3JjUmVkTWFzaykgPj4+IHNyY1JlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlnID0gc3JjR3JlZW5zWyhkYXRhICYgc3JjR3JlZW5NYXNrKSA+Pj4gc3JjR3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJYiA9IHNyY0JsdWVzWyhkYXRhICYgc3JjQmx1ZU1hc2spID4+PiBzcmNCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCWEgPSBzcmNBbHBoYXNbKGRhdGEgJiBzcmNBbHBoYU1hc2spID4+PiBzcmNBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX01TQjogewotCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKHNyY0RhdGFbc3BdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCShzcmNEYXRhW3NwICsgMV0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCShzcmNEYXRhW3NwICsgMl0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCShzcmNEYXRhW3NwICsgM10gJiAweGZmKTsKLQkJCQkJCXNwICs9IChzZnggPj4+IDE2KSAqIDQ7Ci0JCQkJCQlyID0gc3JjUmVkc1soZGF0YSAmIHNyY1JlZE1hc2spID4+PiBzcmNSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJZyA9IHNyY0dyZWVuc1soZGF0YSAmIHNyY0dyZWVuTWFzaykgPj4+IHNyY0dyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCWIgPSBzcmNCbHVlc1soZGF0YSAmIHNyY0JsdWVNYXNrKSA+Pj4gc3JjQmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQlhID0gc3JjQWxwaGFzWyhkYXRhICYgc3JjQWxwaGFNYXNrKSA+Pj4gc3JjQWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18zMl9MU0I6IHsKLQkJCQkJCWZpbmFsIGludCBkYXRhID0gKCggKCggKChzcmNEYXRhW3NwICsgM10gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3AgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJKHNyY0RhdGFbc3BdICYgMHhmZik7Ci0JCQkJCQlzcCArPSAoc2Z4ID4+PiAxNikgKiA0OwotCQkJCQkJciA9IHNyY1JlZHNbKGRhdGEgJiBzcmNSZWRNYXNrKSA+Pj4gc3JjUmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCWcgPSBzcmNHcmVlbnNbKGRhdGEgJiBzcmNHcmVlbk1hc2spID4+PiBzcmNHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQliID0gc3JjQmx1ZXNbKGRhdGEgJiBzcmNCbHVlTWFzaykgPj4+IHNyY0JsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJYSA9IHNyY0FscGhhc1soZGF0YSAmIHNyY0FscGhhTWFzaykgPj4+IHNyY0FscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJfSBicmVhazsKLQkJCQl9Ci0KLQkJCQkvKioqIERPIFNQRUNJQUwgUFJPQ0VTU0lORyBJRiBSRVFVSVJFRCAqKiovCi0JCQkJc3dpdGNoIChhbHBoYU1vZGUpIHsKLQkJCQkJY2FzZSBBTFBIQV9DSEFOTkVMX1NFUEFSQVRFOgotCQkJCQkJYWxwaGEgPSAoKGFscGhhRGF0YVthcF0gJiAweGZmKSA8PCAxNikgLyAyNTU7Ci0JCQkJCQlhcCArPSAoc2Z4ID4+IDE2KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFMUEhBX0NIQU5ORUxfU09VUkNFOgotCQkJCQkJYWxwaGEgPSAoYSA8PCAxNikgLyAyNTU7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBTFBIQV9NQVNLX1VOUEFDS0VEOgotCQkJCQkJYWxwaGEgPSAoYWxwaGFEYXRhW2FwXSAhPSAwKSA/IDB4MTAwMDAgOiAwOwotCQkJCQkJYXAgKz0gKHNmeCA+PiAxNik7Ci0JCQkJCQlicmVhazsJCQkJCQkKLQkJCQkJY2FzZSBBTFBIQV9NQVNLX1BBQ0tFRDoKLQkJCQkJCWFscGhhID0gKGFscGhhRGF0YVthcCA+PiAzXSA8PCAoKGFwICYgNykgKyA5KSkgJiAweDEwMDAwOwotCQkJCQkJYXAgKz0gKHNmeCA+PiAxNik7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBTFBIQV9NQVNLX1JHQjoKLQkJCQkJCWFscGhhID0gMHgxMDAwMDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxwaGFEYXRhLmxlbmd0aDsgaSArPSAzKSB7Ci0JCQkJCQkJaWYgKChyID09IGFscGhhRGF0YVtpXSkgJiYgKGcgPT0gYWxwaGFEYXRhW2kgKyAxXSkgJiYgKGIgPT0gYWxwaGFEYXRhW2kgKyAyXSkpIHsKLQkJCQkJCQkJYWxwaGEgPSAweDAwMDA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoYWxwaGEgIT0gMHgxMDAwMCkgewotCQkJCQlpZiAoYWxwaGEgPT0gMHgwMDAwKSBjb250aW51ZTsKLQkJCQkJc3dpdGNoIChkdHlwZSkgewotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfODogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gZGVzdERhdGFbZHBdICYgMHhmZjsKLQkJCQkJCQlycSA9IGRlc3RSZWRzWyhkYXRhICYgZGVzdFJlZE1hc2spID4+PiBkZXN0UmVkU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlncSA9IGRlc3RHcmVlbnNbKGRhdGEgJiBkZXN0R3JlZW5NYXNrKSA+Pj4gZGVzdEdyZWVuU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlicSA9IGRlc3RCbHVlc1soZGF0YSAmIGRlc3RCbHVlTWFzaykgPj4+IGRlc3RCbHVlU2hpZnRdICYgMHhmZjsKLQkJCQkJCQlhcSA9IGRlc3RBbHBoYXNbKGRhdGEgJiBkZXN0QWxwaGFNYXNrKSA+Pj4gZGVzdEFscGhhU2hpZnRdICYgMHhmZjsKLQkJCQkJCX0gYnJlYWs7Ci0JCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfCAoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpOwotCQkJCQkJCXJxID0gZGVzdFJlZHNbKGRhdGEgJiBkZXN0UmVkTWFzaykgPj4+IGRlc3RSZWRTaGlmdF0gJiAweGZmOwotCQkJCQkJCWdxID0gZGVzdEdyZWVuc1soZGF0YSAmIGRlc3RHcmVlbk1hc2spID4+PiBkZXN0R3JlZW5TaGlmdF0gJiAweGZmOwotCQkJCQkJCWJxID0gZGVzdEJsdWVzWyhkYXRhICYgZGVzdEJsdWVNYXNrKSA+Pj4gZGVzdEJsdWVTaGlmdF0gJiAweGZmOwotCQkJCQkJCWFxID0gZGVzdEFscGhhc1soZGF0YSAmIGRlc3RBbHBoYU1hc2spID4+PiBkZXN0QWxwaGFTaGlmdF0gJiAweGZmOwotCQkJCQkJfSBicmVhazsKLQkJCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJCWZpbmFsIGludCBkYXRhID0gKChkZXN0RGF0YVtkcCArIDFdICYgMHhmZikgPDwgOCkgfCAoZGVzdERhdGFbZHBdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCQlmaW5hbCBpbnQgZGF0YSA9ICgoICgoZGVzdERhdGFbZHBdICYgMHhmZikgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAxXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTVNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKGRlc3REYXRhW2RwXSAmIDB4ZmYpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHAgKyAyXSAmIDB4ZmYpKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDNdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTFNCOiB7Ci0JCQkJCQkJZmluYWwgaW50IGRhdGEgPSAoKCAoKCAoKGRlc3REYXRhW2RwICsgM10gJiAweGZmKSA8PCA4KSB8Ci0JCQkJCQkJCShkZXN0RGF0YVtkcCArIDJdICYgMHhmZikpIDw8IDgpIHwKLQkJCQkJCQkJKGRlc3REYXRhW2RwICsgMV0gJiAweGZmKSkgPDwgOCkgfAotCQkJCQkJCQkoZGVzdERhdGFbZHBdICYgMHhmZik7Ci0JCQkJCQkJcnEgPSBkZXN0UmVkc1soZGF0YSAmIGRlc3RSZWRNYXNrKSA+Pj4gZGVzdFJlZFNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJZ3EgPSBkZXN0R3JlZW5zWyhkYXRhICYgZGVzdEdyZWVuTWFzaykgPj4+IGRlc3RHcmVlblNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYnEgPSBkZXN0Qmx1ZXNbKGRhdGEgJiBkZXN0Qmx1ZU1hc2spID4+PiBkZXN0Qmx1ZVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQkJYXEgPSBkZXN0QWxwaGFzWyhkYXRhICYgZGVzdEFscGhhTWFzaykgPj4+IGRlc3RBbHBoYVNoaWZ0XSAmIDB4ZmY7Ci0JCQkJCQl9IGJyZWFrOwotCQkJCQl9Ci0JCQkJCS8vIFBlcmZvcm0gYWxwaGEgYmxlbmRpbmcKLQkJCQkJYSA9IGFxICsgKChhIC0gYXEpICogYWxwaGEgPj4gMTYpOwotCQkJCQlyID0gcnEgKyAoKHIgLSBycSkgKiBhbHBoYSA+PiAxNik7Ci0JCQkJCWcgPSBncSArICgoZyAtIGdxKSAqIGFscGhhID4+IDE2KTsKLQkJCQkJYiA9IGJxICsgKChiIC0gYnEpICogYWxwaGEgPj4gMTYpOwotCQkJCX0KLQotCQkJCS8qKiogV1JJVEUgTkVYVCBQSVhFTCAqKiovCi0JCQkJZmluYWwgaW50IGRhdGEgPSAKLQkJCQkJKHIgPj4+IGRlc3RSZWRQcmVTaGlmdCA8PCBkZXN0UmVkU2hpZnQpIHwKLQkJCQkJKGcgPj4+IGRlc3RHcmVlblByZVNoaWZ0IDw8IGRlc3RHcmVlblNoaWZ0KSB8Ci0JCQkJCShiID4+PiBkZXN0Qmx1ZVByZVNoaWZ0IDw8IGRlc3RCbHVlU2hpZnQpIHwKLQkJCQkJKGEgPj4+IGRlc3RBbHBoYVByZVNoaWZ0IDw8IGRlc3RBbHBoYVNoaWZ0KTsKLQkJCQlzd2l0Y2ggKGR0eXBlKSB7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzg6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSBkYXRhOwotCQkJCQl9IGJyZWFrOwotCQkJCQljYXNlIFRZUEVfR0VORVJJQ18xNl9NU0I6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhICYgMHhmZik7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzE2X0xTQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhICYgMHhmZik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMjQ6IHsKLQkJCQkJCWRlc3REYXRhW2RwXSA9IChieXRlKSAoZGF0YSA+Pj4gMTYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAxXSA9IChieXRlKSAoZGF0YSA+Pj4gOCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhICYgMHhmZik7Ci0JCQkJCX0gYnJlYWs7Ci0JCQkJCWNhc2UgVFlQRV9HRU5FUklDXzMyX01TQjogewotCQkJCQkJZGVzdERhdGFbZHBdID0gKGJ5dGUpIChkYXRhID4+PiAyNCk7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDFdID0gKGJ5dGUpIChkYXRhID4+PiAxNik7Ci0JCQkJCQlkZXN0RGF0YVtkcCArIDJdID0gKGJ5dGUpIChkYXRhID4+PiA4KTsKLQkJCQkJCWRlc3REYXRhW2RwICsgM10gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJfSBicmVhazsKLQkJCQkJY2FzZSBUWVBFX0dFTkVSSUNfMzJfTFNCOiB7Ci0JCQkJCQlkZXN0RGF0YVtkcF0gPSAoYnl0ZSkgKGRhdGEgJiAweGZmKTsKLQkJCQkJCWRlc3REYXRhW2RwICsgMV0gPSAoYnl0ZSkgKGRhdGEgPj4+IDgpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAyXSA9IChieXRlKSAoZGF0YSA+Pj4gMTYpOwotCQkJCQkJZGVzdERhdGFbZHAgKyAzXSA9IChieXRlKSAoZGF0YSA+Pj4gMjQpOwotCQkJCQl9IGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHNoaWZ0IGZyb20gYSBtYXNrLgotCSAqLwotCXN0YXRpYyBpbnQgZ2V0Q2hhbm5lbFNoaWZ0KGludCBtYXNrKSB7Ci0JCWlmIChtYXNrID09IDApIHJldHVybiAwOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgKChtYXNrICYgMSkgPT0gMCkgJiYgKGkgPCAzMik7ICsraSkgewotCQkJbWFzayA+Pj49IDE7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSByZXF1aXJlZCBjaGFubmVsIHdpZHRoIChkZXB0aCkgZnJvbSBhIG1hc2suCi0JICovCi0Jc3RhdGljIGludCBnZXRDaGFubmVsV2lkdGgoaW50IG1hc2ssIGludCBzaGlmdCkgewotCQlpZiAobWFzayA9PSAwKSByZXR1cm4gMDsKLQkJaW50IGk7Ci0JCW1hc2sgPj4+PSBzaGlmdDsKLQkJZm9yIChpID0gc2hpZnQ7ICgobWFzayAmIDEpICE9IDApICYmIChpIDwgMzIpOyArK2kpIHsKLQkJCW1hc2sgPj4+PSAxOwotCQl9Ci0JCXJldHVybiBpIC0gc2hpZnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURhdGEgY29udmVydEltYWdlRGF0YSAoSW1hZ2VEYXRhIHNvdXJjZSkgewotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhICgweGZmMDAwMCwgMHhmZjAwLCAweGZmKTsKLQkJSW1hZ2VEYXRhIG5ld1NvdXJjZSA9IG5ldyBJbWFnZURhdGEgKHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgMjQsIHBhbGV0dGUpOwotCi0JCUltYWdlRGF0YVV0aWwuYmxpdCAoCi0JCQkxLAotCQkJc291cmNlLmRhdGEsCi0JCQlzb3VyY2UuZGVwdGgsCi0JCQlzb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKHNvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCXNvdXJjZS53aWR0aCwKLQkJCXNvdXJjZS5oZWlnaHQsCi0JCQlzb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJc291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJc291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQkyNTUsCi0JCQludWxsLAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJbmV3U291cmNlLmRhdGEsCi0JCQluZXdTb3VyY2UuZGVwdGgsCi0JCQluZXdTb3VyY2UuYnl0ZXNQZXJMaW5lLAotCQkJKG5ld1NvdXJjZS5kZXB0aCAhPSAxNikgPyBNU0JfRklSU1QgOiBMU0JfRklSU1QsCi0JCQkwLAotCQkJMCwKLQkJCW5ld1NvdXJjZS53aWR0aCwKLQkJCW5ld1NvdXJjZS5oZWlnaHQsCi0JCQluZXdTb3VyY2UucGFsZXR0ZS5yZWRNYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuZ3JlZW5NYXNrLAotCQkJbmV3U291cmNlLnBhbGV0dGUuYmx1ZU1hc2ssCi0JCQlmYWxzZSwKLQkJCXRydWUpOwotCi0JCXJldHVybiBuZXdTb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvTFdKR0xFeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDFjMjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MV0pHTEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTERhdGE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTDExOwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuR0xDb250ZXh0OwotaW1wb3J0IG9yZy5sd2pnbC5vcGVuZ2wuZ2x1LkdMVTsKLWltcG9ydCBvcmcubHdqZ2wuTFdKR0xFeGNlcHRpb247Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IHVzZSBMV0pHTCB0byBkcmF3IHRvIGFuIFNXVCBHTENhbnZhcwotICovCi1wdWJsaWMgY2xhc3MgTFdKR0xFeGFtcGxlIHsKLQlzdGF0aWMgdm9pZCBkcmF3VG9ydXMoZmxvYXQgciwgZmxvYXQgUiwgaW50IG5zaWRlcywgaW50IHJpbmdzKSB7Ci0JCWZsb2F0IHJpbmdEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyByaW5nczsKLQkJZmxvYXQgc2lkZURlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIG5zaWRlczsKLQkJZmxvYXQgdGhldGEgPSAwLjBmLCBjb3NUaGV0YSA9IDEuMGYsIHNpblRoZXRhID0gMC4wZjsKLQkJZm9yIChpbnQgaSA9IHJpbmdzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWZsb2F0IHRoZXRhMSA9IHRoZXRhICsgcmluZ0RlbHRhOwotCQkJZmxvYXQgY29zVGhldGExID0gKGZsb2F0KSBNYXRoLmNvcyh0aGV0YTEpOwotCQkJZmxvYXQgc2luVGhldGExID0gKGZsb2F0KSBNYXRoLnNpbih0aGV0YTEpOwotCQkJR0wxMS5nbEJlZ2luKEdMMTEuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YTEgKiBjb3NQaGksIC1zaW5UaGV0YTEgKiBjb3NQaGksIHNpblBoaSk7Ci0JCQkJR0wxMS5nbFZlcnRleDNmKGNvc1RoZXRhMSAqIGRpc3QsIC1zaW5UaGV0YTEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCQlHTDExLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGEgKiBkaXN0LCAtc2luVGhldGEgKiBkaXN0LCByICogc2luUGhpKTsKLQkJCX0KLQkJCUdMMTEuZ2xFbmQoKTsKLQkJCXRoZXRhID0gdGhldGExOwotCQkJY29zVGhldGEgPSBjb3NUaGV0YTE7Ci0JCQlzaW5UaGV0YSA9IHNpblRoZXRhMTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhICgpOwotCQlkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0JCWZpbmFsIEdMQ2FudmFzIGNhbnZhcyA9IG5ldyBHTENhbnZhcyhjb21wLCBTV1QuTk9ORSwgZGF0YSk7Ci0KLQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJdHJ5IHsKLSAgICAgICAJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0gICAgICAgIH0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0gICAgICAgIAotICAgICAgICBjYW52YXMuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotICAgICAgICAJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldEJvdW5kcygpOwotICAgICAgICAJCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIGJvdW5kcy53aWR0aCAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCSAgICAgICAgfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLSAgICAgICAgCQlHTDExLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOwotICAgICAgICAJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0gICAgICAgIAkJR0wxMS5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOwotICAgICAgICAJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0KLQkJR0wxMS5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMMTEuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTDExLmdsSGludChHTDExLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wxMS5HTF9OSUNFU1QpOwotCQlHTDExLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlHTDExLmdsTGluZVdpZHRoKDIpOwotCQlHTDExLmdsRW5hYmxlKEdMMTEuR0xfREVQVEhfVEVTVCk7Ci0KLQkJc2hlbGwuc2V0VGV4dCgiU1dUL0xXSkdMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCSAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JICAgIAlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkgICAgICAgIH0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJCUdMMTEuZ2xDbGVhcihHTDExLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDExLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlHTDExLmdsQ2xlYXJDb2xvciguM2YsIC41ZiwgLjhmLCAxLjBmKTsKLQkJCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlHTDExLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlHTDExLmdsUm90YXRlZigwLjE1ZiAqIHJvdCwgMi4wZiAqIGZyb3QsIDEwLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlHTDExLmdsUG9seWdvbk1vZGUoR0wxMS5HTF9GUk9OVF9BTkRfQkFDSywgR0wxMS5HTF9MSU5FKTsKLQkJCQkJR0wxMS5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cygxLCAxLjlmICsgKChmbG9hdCkgTWF0aC5zaW4oKDAuMDA0ZiAqIGZyb3QpKSksIDE1LCAxNSk7Ci0JCQkJCWNhbnZhcy5zd2FwQnVmZmVycygpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0KLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL0xpZ2h0VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWU5NDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9MaWdodFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgTGlnaHRUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXRbXSBtYXRlcmlhbFNoaW5pbmVzcyA9IHsgMjUuMGYgfTsKLQlwcml2YXRlIGZsb2F0W10gbGlnaHRQb3NpdGlvbiA9IHsgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiB9OwotCXByaXZhdGUgZmxvYXRbXVtdIGNvbG9yVmFsdWVzID0gewotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbGlnaHQgZGlmZnVzZQotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbGlnaHQgYW1iaWVudAotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbGlnaHQgc3BlY3VsYXIKLQkJeyAwLjVmLCAwLjVmLCAwLjVmLCAxLjBmIH0sCS8vIGxpZ2h0IG1haW4gYW1iaWVudAotCQl7IDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYgfSwJLy8gbWF0ZXJpYWwgZGlmZnVzZQotCQl7IDAuM2YsIDAuM2YsIDAuM2YsIDEuMGYgfSwJLy8gbWF0ZXJpYWwgYW1iaWVudAotCQl7IDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfQkvLyBtYXRlcmlhbCBzcGVjdWxhcgotCX07Ci0JcHJpdmF0ZSBmbG9hdCB5UG9zID0gMC4wZiwgeFBvcyA9IDAuMGYsIHpQb3MgPSAtMjAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljLCBzcGhlcmU7Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNjcmVhdGVDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0Jdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiVHJhbnNsYXRpb24iKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciB4TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl4TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXhNb3ZlLnNldE1heGltdW0oMjIpOwotCQl4TW92ZS5zZXRNaW5pbXVtKDApOwotCQl4TW92ZS5zZXRUaHVtYigyKTsKLQkJeE1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeE1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMjIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJeU1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSB5TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciB6TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl6TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXpNb3ZlLnNldE1heGltdW0oMjIpOwotCQl6TW92ZS5zZXRNaW5pbXVtKDApOwotCQl6TW92ZS5zZXRUaHVtYigyKTsKLQkJek1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJek1vdmUuc2V0U2VsZWN0aW9uKDEwKTsKLQkJek1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSB6TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDMwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBwb3NpdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwb3NpdGlvbkdyb3VwLnNldFRleHQoIkxpZ2h0IFBvc2l0aW9uIik7Ci0JCXBvc2l0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgbGlnaHRYID0gbmV3IFNsaWRlcihwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0WC5zZXRJbmNyZW1lbnQoMSk7Ci0JCWxpZ2h0WC5zZXRNYXhpbXVtKDIyKTsKLQkJbGlnaHRYLnNldE1pbmltdW0oMCk7Ci0JCWxpZ2h0WC5zZXRUaHVtYigyKTsKLQkJbGlnaHRYLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWxpZ2h0WC5zZXRTZWxlY3Rpb24oMTApOwotCQlsaWdodFguYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWxpZ2h0UG9zaXRpb25bMF0gPSAoKGZsb2F0KSBsaWdodFguZ2V0U2VsZWN0aW9uKCkgKiAxMCkgLSAxMDA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChwb3NpdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIGxpZ2h0WSA9IG5ldyBTbGlkZXIocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlsaWdodFkuc2V0SW5jcmVtZW50KDEpOwotCQlsaWdodFkuc2V0TWF4aW11bSgyMik7Ci0JCWxpZ2h0WS5zZXRNaW5pbXVtKDApOwotCQlsaWdodFkuc2V0VGh1bWIoMik7Ci0JCWxpZ2h0WS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlsaWdodFkuc2V0U2VsZWN0aW9uKDEwKTsKLQkJbGlnaHRZLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlsaWdodFBvc2l0aW9uWzFdID0gKChmbG9hdCkgbGlnaHRZLmdldFNlbGVjdGlvbigpICogMTApIC0gMTAwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwocG9zaXRpb25Hcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlo6Iik7Ci0JCWZpbmFsIFNsaWRlciBsaWdodFogPSBuZXcgU2xpZGVyKHBvc2l0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJbGlnaHRaLnNldEluY3JlbWVudCgxKTsKLQkJbGlnaHRaLnNldE1heGltdW0oMjIpOwotCQlsaWdodFouc2V0TWluaW11bSgwKTsKLQkJbGlnaHRaLnNldFRodW1iKDIpOwotCQlsaWdodFouc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJbGlnaHRaLnNldFNlbGVjdGlvbigxMCk7Ci0JCWxpZ2h0Wi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbGlnaHRQb3NpdGlvblsyXSA9ICgoZmxvYXQpIGxpZ2h0Wi5nZXRTZWxlY3Rpb24oKSAqIDEwKSAtIDIwOwotCQkJfQotCQl9KTsKLQotCQlHcm91cCBsaWdodENvbG9yc0dyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsaWdodENvbG9yc0dyb3VwLnNldFRleHQoIkxpZ2h0IENvbG9ycyIpOwotCQlsaWdodENvbG9yc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlsaWdodENvbG9yc0dyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBsaWdodERpZmZ1c2VCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobGlnaHRDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQlsaWdodERpZmZ1c2VCdXR0b24uc2V0VGV4dCgiRGlmZnVzZSIpOwotCQlsaWdodERpZmZ1c2VCdXR0b24uc2V0UkdCKAotCQkJbmV3IFJHQigKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMF1bMF0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1swXVsxXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzBdWzJdICogMjU1KSkpOwotCQlsaWdodERpZmZ1c2VCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1swXVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzBdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1swXVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0QW1iaWVudEJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0QW1iaWVudEJ1dHRvbi5zZXRUZXh0KCJBbWJpZW50Iik7Ci0JCWxpZ2h0QW1iaWVudEJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1sxXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzFdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMV1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0QW1iaWVudEJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzFdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbMV1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzFdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbGlnaHRTcGVjdWxhckJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChsaWdodENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxpZ2h0U3BlY3VsYXJCdXR0b24uc2V0VGV4dCgiU3BlY3VsYXIiKTsKLQkJbGlnaHRTcGVjdWxhckJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1syXVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzJdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbMl1bMl0gKiAyNTUpKSk7Ci0JCWxpZ2h0U3BlY3VsYXJCdXR0b24KLQkJCS5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQljb2xvclZhbHVlc1syXVswXSA9ICgoZmxvYXQpIHJnYi5yZWQpIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzJdWzFdID0gKChmbG9hdCkgcmdiLmdyZWVuKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1syXVsyXSA9ICgoZmxvYXQpIHJnYi5ibHVlKSAvIDI1NTsKLQkJCQlzZXRDb2xvclZhbHVlcygpOwotCQkJfQotCQl9KTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIGxpZ2h0TWFpbkFtYmllbnRCdXR0b24gPQotCQkJbmV3IENvbG9yU2VsZWN0aW9uR3JvdXAobGlnaHRDb2xvcnNHcm91cCwgU1dULk5PTkUpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uLnNldFRleHQoIk1haW4gQW1iaWVudCIpOwotCQlsaWdodE1haW5BbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzNdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbM11bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1szXVsyXSAqIDI1NSkpKTsKLQkJbGlnaHRNYWluQW1iaWVudEJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzNdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbM11bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzNdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG1hdGVyaWFsQ29sb3JzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1hdGVyaWFsQ29sb3JzR3JvdXAuc2V0VGV4dCgiTWF0ZXJpYWwgQ29sb3JzIik7Ci0JCW1hdGVyaWFsQ29sb3JzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCW1hdGVyaWFsQ29sb3JzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb2xvclNlbGVjdGlvbkdyb3VwIG1hdGVyaWFsRGlmZnVzZUJ1dHRvbiA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChtYXRlcmlhbENvbG9yc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCW1hdGVyaWFsRGlmZnVzZUJ1dHRvbi5zZXRUZXh0KCJEaWZmdXNlIik7Ci0JCW1hdGVyaWFsRGlmZnVzZUJ1dHRvbi5zZXRSR0IoCi0JCQluZXcgUkdCKAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s0XVswXSAqIDI1NSksCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzRdWzFdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNF1bMl0gKiAyNTUpKSk7Ci0JCW1hdGVyaWFsRGlmZnVzZUJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzRdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNF1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzRdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgbWF0ZXJpYWxBbWJpZW50QnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxBbWJpZW50QnV0dG9uLnNldFRleHQoIkFtYmllbnQiKTsKLQkJbWF0ZXJpYWxBbWJpZW50QnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzVdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNV1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s1XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxBbWJpZW50QnV0dG9uCi0JCQkuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJY29sb3JWYWx1ZXNbNV1bMF0gPSAoKGZsb2F0KSByZ2IucmVkKSAvIDI1NTsKLQkJCQljb2xvclZhbHVlc1s1XVsxXSA9ICgoZmxvYXQpIHJnYi5ncmVlbikgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNV1bMl0gPSAoKGZsb2F0KSByZ2IuYmx1ZSkgLyAyNTU7Ci0JCQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBtYXRlcmlhbFNwZWN1bGFyQnV0dG9uID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKG1hdGVyaWFsQ29sb3JzR3JvdXAsIFNXVC5OT05FKTsKLQkJbWF0ZXJpYWxTcGVjdWxhckJ1dHRvbi5zZXRUZXh0KCJTcGVjdWxhciIpOwotCQltYXRlcmlhbFNwZWN1bGFyQnV0dG9uLnNldFJHQigKLQkJCW5ldyBSR0IoCi0JCQkJKGludCkgKGNvbG9yVmFsdWVzWzZdWzBdICogMjU1KSwKLQkJCQkoaW50KSAoY29sb3JWYWx1ZXNbNl1bMV0gKiAyNTUpLAotCQkJCShpbnQpIChjb2xvclZhbHVlc1s2XVsyXSAqIDI1NSkpKTsKLQkJbWF0ZXJpYWxTcGVjdWxhckJ1dHRvbgotCQkJLmFkZENvbG9yU2VsZWN0aW9uTGlzdGVuZXIobmV3IElDb2xvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlQ29sb3JTZWxlY3Rpb24oUkdCIHJnYikgewotCQkJCWNvbG9yVmFsdWVzWzZdWzBdID0gKChmbG9hdCkgcmdiLnJlZCkgLyAyNTU7Ci0JCQkJY29sb3JWYWx1ZXNbNl1bMV0gPSAoKGZsb2F0KSByZ2IuZ3JlZW4pIC8gMjU1OwotCQkJCWNvbG9yVmFsdWVzWzZdWzJdID0gKChmbG9hdCkgcmdiLmJsdWUpIC8gMjU1OwotCQkJCXNldENvbG9yVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRUZXh0KCJNYXRlcmlhbCBTaGluaW5lc3M6Iik7Ci0JCWZpbmFsIFNsaWRlciBzaGluZVNsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXNoaW5lU2xpZGVyLnNldEluY3JlbWVudCg1KTsKLQkJc2hpbmVTbGlkZXIuc2V0TWF4aW11bSgxMDIpOwotCQlzaGluZVNsaWRlci5zZXRNaW5pbXVtKDApOwotCQlzaGluZVNsaWRlci5zZXRUaHVtYigyKTsKLQkJc2hpbmVTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgxMCk7Ci0JCXNoaW5lU2xpZGVyLnNldFNlbGVjdGlvbigyNSk7Ci0JCXNoaW5lU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQltYXRlcmlhbFNoaW5pbmVzc1swXSA9IHNoaW5lU2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywKLQkJCQkJR0wuR0xfU0hJTklORVNTLAotCQkJCQltYXRlcmlhbFNoaW5pbmVzcyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCQlHTC5nbERlbGV0ZUxpc3RzKHNwaGVyZSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiTGlnaHQiOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wKTsKLQkJc2V0Q29sb3JWYWx1ZXMoKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TSElOSU5FU1MsIG1hdGVyaWFsU2hpbmluZXNzKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbEhpbnQoR0wuR0xfTElORV9TTU9PVEhfSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xIaW50KEdMLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wuR0xfTklDRVNUKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xQb2ludFNpemUoMi4wZik7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCXNwaGVyZSA9IEdMLmdsR2VuTGlzdHMoMSk7Ci0JCUdMLmdsTmV3TGlzdChzcGhlcmUsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMywgMzIsIDMyKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbExpZ2h0ZnYoR0wuR0xfTElHSFQwLCBHTC5HTF9QT1NJVElPTiwgbGlnaHRQb3NpdGlvbik7Ci0JCUdMLmdsVHJhbnNsYXRlZih4UG9zLCB5UG9zLCB6UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdChzcGhlcmUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgY29sb3IgdmFsdWVzIGludG8gdGhlIHJlbmRlcmVkIGRpc3BsYXkuCi0JICovCi0Jdm9pZCBzZXRDb2xvclZhbHVlcygpIHsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfRElGRlVTRSwgY29sb3JWYWx1ZXNbMF0pOwotCQlHTC5nbE1hdGVyaWFsZnYoR0wuR0xfRlJPTlRfQU5EX0JBQ0ssIEdMLkdMX0RJRkZVU0UsIGNvbG9yVmFsdWVzWzRdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9BTUJJRU5ULCBjb2xvclZhbHVlc1s1XSk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX0FNQklFTlQsIGNvbG9yVmFsdWVzWzFdKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfU1BFQ1VMQVIsIGNvbG9yVmFsdWVzWzJdKTsKLQkJR0wuZ2xNYXRlcmlhbGZ2KEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9TUEVDVUxBUiwgY29sb3JWYWx1ZXNbNl0pOwotCQlHTC5nbExpZ2h0TW9kZWxmdihHTC5HTF9MSUdIVF9NT0RFTF9BTUJJRU5ULCBjb2xvclZhbHVlc1szXSk7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfU0hJTklORVNTLCBtYXRlcmlhbFNoaW5pbmVzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9OdXJiVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzZjA0Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL051cmJUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIE51cmJUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgeFBvcyA9IC01LjBmLCB5UG9zID0gLTUuMGYsIHpQb3MgPSAtMjUuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB4Um90ID0gMzMwLjBmLCB5Um90ID0gMC4wZiwgelJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgbnVyYjsKLQotCS8qKgotCSAqIFJldHVybnMgYSAzIGRpbWVuc2lvbmFsIGFycmF5IHRvIHN0b3JlIHZlcnRleCBwb2ludHMgZm9yIHRoZSBudXJiCi0JICogc3VyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcnJheQotCSAqLwotCWZsb2F0W11bXVtdIGJ1aWxkTnVyYigpIHsKLQkJZmxvYXRbXVtdW10gY3RybCA9IG5ldyBmbG9hdFs0XVs0XVszXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJLy8gc2V0IHRoZSB4IHZhbHVlCi0JCQkJY3RybFtpXVtqXVswXSA9IDIgKiAoaSArIChmbG9hdCkgTWF0aC5jb3MoaSArIGopKTsKLQkJCQkvLyBzZXQgdGhlIHkgdmFsdWUKLQkJCQljdHJsW2ldW2pdWzFdID0gMiAqIChqICsgKGZsb2F0KSBNYXRoLmNvcyhpICsgaikpOwotCQkJCS8vIHNldCB0aGUgeiB2YWx1ZQotCQkJCWlmICgoaSA9PSAxICYmIGogPT0gMSkgfHwgKGkgPT0gMiAmJiBqID09IDIpKSB7Ci0JCQkJCS8vIHRoaXMgbWFrZXMgdGhlIGhpbGwKLQkJCQkJY3RybFtpXVtqXVsyXSA9IDYuMGY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybFtpXVtqXVsyXSA9IDAuMGY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHNldHMgdGhpcyBwYXJ0aWN1bGFyIHogdmFsdWUgdG8gYSBsYXJnZSBudW1iZXIgdG8gbWFrZSBhIGhpZ2gKLQkJLy8gaGlsbAotCQljdHJsWzJdWzJdWzJdID0gOC4wZjsKLQotCQlyZXR1cm4gY3RybDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIDEgZGltZW5zaW9uYWwgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSAzIGRpbWVuc2lvbmFsCi0JICogYXJndW1lbnQuICBUaGlzIHJlc3VsdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBudXJiIHJlbmRlcmVyCi0JICogCi0JICogQHBhcmFtIGN0cmwgc291cmNlIDNEIGFycmF5Ci0JICogQHJldHVybiAxRCBhcnJheQotCSAqLwotCWZsb2F0W10gY29udmVydChmbG9hdFtdW11bXSBjdHJsKSB7Ci0JCWZsb2F0W10gcHRzID0KLQkJCW5ldyBmbG9hdFtjdHJsLmxlbmd0aCAqIGN0cmxbMF0ubGVuZ3RoICogY3RybFswXVswXS5sZW5ndGhdOwotCQlpbnQgcm93ID0gMDsKLQkJaW50IGNvbCA9IDA7Ci0JCS8vIHNldCByb3dJbmNyIHRvIG51bWJlciBvZiBjb2x1bW5zICogZGVwdGggCi0JCWludCByb3dJbmNyID0gY3RybFswXS5sZW5ndGggKiBjdHJsWzBdWzBdLmxlbmd0aDsKLQkJLy8gc2V0IGNvbEluY3IgdG8gZGVwdGggCi0JCWludCBjb2xJbmNyID0gY3RybFswXVswXS5sZW5ndGg7Ci0JCS8vIGxvb3AgdGhyb3VnaCByb3dzIAotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmwubGVuZ3RoOyBpKyspIHsKLQkJCWNvbCA9IDA7Ci0JCQkvLyBsb29wIHRocm91Z2ggY29sdW1ucwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdHJsWzBdLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gbG9vcCB0aHJvdWdoIHRvIGdldCB0aGUgZGVwdGggdmFsdWVzCi0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjdHJsWzBdWzBdLmxlbmd0aDsgaysrKSB7Ci0JCQkJCXB0c1tyb3cgKyBjb2wgKyBrXSA9IGN0cmxbaV1bal1ba107Ci0JCQkJfQotCQkJCWNvbCArPSBjb2xJbmNyOwotCQkJfQotCQkJcm93ICs9IHJvd0luY3I7Ci0JCX0KLQkJcmV0dXJuIHB0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBtb3ZlbWVudEdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltb3ZlbWVudEdyb3VwLnNldFRleHQoIlRyYW5zbGF0aW9uIik7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJYOiIpOwotCQlmaW5hbCBTbGlkZXIgeE1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJeE1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl4TW92ZS5zZXRNYXhpbXVtKDEyKTsKLQkJeE1vdmUuc2V0TWluaW11bSgwKTsKLQkJeE1vdmUuc2V0VGh1bWIoMik7Ci0JCXhNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXhNb3ZlLnNldFNlbGVjdGlvbig1KTsKLQkJeE1vdmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSB4TW92ZS5nZXRTZWxlY3Rpb24oKSAtIDEwOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gMTA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHpNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJek1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXpNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXpNb3ZlLnNldFRodW1iKDIpOwotCQl6TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl6TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAzMDsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgcm90YXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm90YXRpb25Hcm91cC5zZXRUZXh0KCJSb3RhdGlvbiIpOwotCQlyb3RhdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhSb3RhdGlvbiA9IG5ldyBTbGlkZXIocm90YXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQl4Um90YXRpb24uc2V0SW5jcmVtZW50KDEwKTsKLQkJeFJvdGF0aW9uLnNldE1heGltdW0oMzYyKTsKLQkJeFJvdGF0aW9uLnNldE1pbmltdW0oMCk7Ci0JCXhSb3RhdGlvbi5zZXRUaHVtYigyKTsKLQkJeFJvdGF0aW9uLnNldFBhZ2VJbmNyZW1lbnQoMjApOwotCQl4Um90YXRpb24uc2V0U2VsZWN0aW9uKDMzMCk7Ci0JCXhSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeFJvdCA9IHhSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJZOiIpOwotCQlmaW5hbCBTbGlkZXIgeVJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXlSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl5Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl5Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJeVJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl5Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXlSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXlSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVJvdCA9IHlSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKHJvdGF0aW9uR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgelJvdGF0aW9uID0gbmV3IFNsaWRlcihyb3RhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCXpSb3RhdGlvbi5zZXRJbmNyZW1lbnQoMTApOwotCQl6Um90YXRpb24uc2V0TWF4aW11bSgzNjIpOwotCQl6Um90YXRpb24uc2V0TWluaW11bSgwKTsKLQkJelJvdGF0aW9uLnNldFRodW1iKDIpOwotCQl6Um90YXRpb24uc2V0UGFnZUluY3JlbWVudCgyMCk7Ci0JCXpSb3RhdGlvbi5zZXRTZWxlY3Rpb24oMCk7Ci0JCXpSb3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJelJvdCA9IHpSb3RhdGlvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNhbXBsaW5nIFRvbGVyYW5jZToiKTsKLQkJZmluYWwgU2xpZGVyIHNTbGlkZXIgPSBuZXcgU2xpZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJc1NsaWRlci5zZXRNYXhpbXVtKDEwMSk7Ci0JCXNTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzU2xpZGVyLnNldFNlbGVjdGlvbig3NSk7Ci0JCXNTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQludXJiLAotCQkJCQlHTFUuR0xVX1NBTVBMSU5HX1RPTEVSQU5DRSwKLQkJCQkJc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDEpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBCdXR0b24gZmlsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmaWxsQnV0dG9uLnNldFRleHQoIkZpbGwiKTsKLQkJZmlsbEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWZpbGxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChmaWxsQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUdMVS5nbHVOdXJic1Byb3BlcnR5KAotCQkJCQkJbnVyYiwKLQkJCQkJCUdMVS5HTFVfRElTUExBWV9NT0RFLAotCQkJCQkJR0xVLkdMVV9GSUxMKTsKLQkJCQl9IGVsc2UgewotCQkJCQlHTFUuZ2x1TnVyYnNQcm9wZXJ0eSgKLQkJCQkJCW51cmIsCi0JCQkJCQlHTFUuR0xVX0RJU1BMQVlfTU9ERSwKLQkJCQkJCUdMVS5HTFVfT1VUTElORV9QT0xZR09OKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQ29sb3JTZWxlY3Rpb25Hcm91cCBjb2xvckdyb3VwID0KLQkJCW5ldyBDb2xvclNlbGVjdGlvbkdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljb2xvckdyb3VwLnNldFRleHQoIkZvcmVncm91bmQgY29sb3IiKTsKLQkJY29sb3JHcm91cC5hZGRDb2xvclNlbGVjdGlvbkxpc3RlbmVyKG5ldyBJQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUNvbG9yU2VsZWN0aW9uKFJHQiByZ2IpIHsKLQkJCQlHTC5nbENvbG9yM3ViKChieXRlKSByZ2IucmVkLCAoYnl0ZSkgcmdiLmdyZWVuLCAoYnl0ZSkgcmdiLmJsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVOdXJic1JlbmRlcmVyKG51cmIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJOdXJiIjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQ29sb3IzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJLy8gc2V0IHVwIG1hdGVyaWFsIGNvbG9yIHdoaWNoIGhlbHBzIHNob3cgY3VydmVzCi0JCWZsb2F0IG1hdF9zcGVjdWxhcltdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0JCWZsb2F0IG1hdF9zaGluaW5lc3NbXSA9IHsgMTAwLjBmIH07Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfU1BFQ1VMQVIsIG1hdF9zcGVjdWxhcik7Ci0JCUdMLmdsTWF0ZXJpYWxmdihHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfU0hJTklORVNTLCBtYXRfc2hpbmluZXNzKTsKLQkJR0wuZ2xDb2xvck1hdGVyaWFsKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9BTUJJRU5UX0FORF9ESUZGVVNFKTsKLQkJCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElHSFQwKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ09MT1JfTUFURVJJQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQVVUT19OT1JNQUwpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9OT1JNQUxJWkUpOwotCQkKLQkJbnVyYiA9IEdMVS5nbHVOZXdOdXJic1JlbmRlcmVyKCk7Ci0KLQkJR0xVLmdsdU51cmJzUHJvcGVydHkoCi0JCQludXJiLAotCQkJR0xVLkdMVV9TQU1QTElOR19NRVRIT0QsCi0JCQlHTFUuR0xVX1BBVEhfTEVOR1RIKTsKLQkJLy8gc2FtcGxpbmcgdG9sZXJhbmNlIGlzIHNwZWNpZmljIGZvciBHTFUuR0xVX1BBVEhfTEVOR1RICi0JCUdMVS5nbHVOdXJic1Byb3BlcnR5KG51cmIsIEdMVS5HTFVfU0FNUExJTkdfVE9MRVJBTkNFLCA3NS4wZik7Ci0JCUdMVS5nbHVOdXJic1Byb3BlcnR5KG51cmIsIEdMVS5HTFVfRElTUExBWV9NT0RFLCBHTFUuR0xVX0ZJTEwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCS8vIGRvIHRyYW5zbGF0aW9uIGFuZCByb3RhdGlvbgotCQlHTC5nbFRyYW5zbGF0ZWYoeFBvcywgeVBvcywgelBvcyk7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xSb3RhdGVmKHlSb3QsIDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFJvdGF0ZWYoelJvdCwgMC4wZiwgMC4wZiwgMS4wZik7Ci0JCS8vIGRlZmluZSBudXJicyBzdXJmYWNlCi0JCWZsb2F0W10ga25vdHMgPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLQkJR0xVLmdsdUJlZ2luU3VyZmFjZShudXJiKTsKLQkJR0xVLmdsdU51cmJzU3VyZmFjZSgKLQkJCW51cmIsIDgsIGtub3RzLCA4LCBrbm90cywgMTIsIDMsCi0JCQljb252ZXJ0KGJ1aWxkTnVyYigpKSwgNCwgNCwgR0wuR0xfTUFQMl9WRVJURVhfMyk7Ci0JCUdMVS5nbHVFbmRTdXJmYWNlKG51cmIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT2JqZWN0c1RhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTFlMGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PYmplY3RzVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1jbGFzcyBPYmplY3RzVGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGNsYXNzIFNoYXBlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5kZXg7Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzaGFwZQotCQkgKiBAcGFyYW0gaW5kZXggdGhlIGRpc3BsYXkgbGlzdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2hhcGUKLQkJICovCi0JCVNoYXBlKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXZvaWQgZGlzcG9zZSgpIHsKLQkJCUdMLmdsRGVsZXRlTGlzdHMoaW5kZXgsIDEpOwotCQl9Ci0JCXZvaWQgZHJhdygpIHsKLQkJCUdMLmdsQ2FsbExpc3QoaW5kZXgpOwotCQl9Ci0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNoYXBlW10gc2hhcGVzOwotCXByaXZhdGUgU2hhcGUgY3VycmVudFNoYXBlOwotCXByaXZhdGUgZmxvYXQgeFJvdCA9IDAuMGYsIHlSb3QgPSAwLjBmOwotCXByaXZhdGUgYm9vbGVhbiBmaWxsID0gdHJ1ZTsKLQlwcml2YXRlIGludCBxdWFkcmF0aWM7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNMRUVQX0xFTkdUSCA9IDUwOwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29udHJvbHMuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQluZXcgTGFiZWwoY29udHJvbHMsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIG9iamVjdHNDb21ibyA9IG5ldyBDb21ibyhjb250cm9scywgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlvYmplY3RzQ29tYm8uYWRkKHNoYXBlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0JCW9iamVjdHNDb21iby5zZWxlY3QoMCk7Ci0JCW9iamVjdHNDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3VycmVudFNoYXBlID0gc2hhcGVzW29iamVjdHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmluYWwgQnV0dG9uIGZpbGxUb2dnbGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRyb2xzLCBTV1QuQ0hFQ0spOwotCQlmaWxsVG9nZ2xlQnV0dG9uLnNldFRleHQoIkZpbGwiKTsKLQkJZmlsbFRvZ2dsZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWZpbGxUb2dnbGVCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZpbGwgPSBmaWxsVG9nZ2xlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCUNvbG9yU2VsZWN0aW9uR3JvdXAgY29sb3JHcm91cCA9Ci0JCQluZXcgQ29sb3JTZWxlY3Rpb25Hcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29sb3JHcm91cC5zZXRUZXh0KCJGb3JlZ3JvdW5kIGNvbG9yIik7Ci0JCWNvbG9yR3JvdXAuYWRkQ29sb3JTZWxlY3Rpb25MaXN0ZW5lcihuZXcgSUNvbG9yU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVDb2xvclNlbGVjdGlvbihSR0IgcmdiKSB7Ci0JCQkJR0wuZ2xDb2xvcjN1YigoYnl0ZSkgcmdiLnJlZCwgKGJ5dGUpIHJnYi5ncmVlbiwgKGJ5dGUpIHJnYi5ibHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZGlzcG9zZSgpCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCUdMVS5nbHVEZWxldGVRdWFkcmljKHF1YWRyYXRpYyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzaGFwZXMgW2ldLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY2lyY2xlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHJhZGl1cwotCSAqIEBwYXJhbSB4U2hyaW5rCi0JICogQHBhcmFtIHlTaHJpbmsKLQkgKi8KLQl2b2lkIGRyYXdDaXJjbGUoZmxvYXQgcmFkaXVzLCBmbG9hdCB4U2hyaW5rLCBmbG9hdCB5U2hyaW5rKSB7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUE9MWUdPTik7Ci0JCWZsb2F0IGRpYSA9IChmbG9hdCkgMi4wICogKGZsb2F0KSBNYXRoLlBJOwotCQlmb3IgKGZsb2F0IGFuZ2xlID0gMC4wZjsgYW5nbGUgPD0gZGlhOyBhbmdsZSArPSAwLjFmKSB7Ci0JCQlHTC5nbFZlcnRleDJkKHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKSwgcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpKTsKLQkJfQotCQlHTC5nbEVuZCgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY3ViZSBjZW50ZXJlZCBhdCAwLDAgaW4gdGhlIHZpZXdwb3J0LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKi8KLQl2b2lkIGRyYXdDdWJlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQsIGZsb2F0IGRlcHRoKSB7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBib3R0b20gbGVmdCAJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCBsZWZ0Ci0JCS8vIGJhY2sKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJvdHRvbSBsZWZ0IAkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gdG9wIGxlZnQKLQkJLy8gbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIGxlZnQJCQkJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGJvdHRvbSByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyB0b3AgbGVmdAkKLQkJLy8gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBib3R0b20gbGVmdAkJCQkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYm90dG9tIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIGhlaWdodCwgLWRlcHRoKTsJLy8gdG9wIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIGhlaWdodCwgZGVwdGgpOwkvLyB0b3AgbGVmdAotCQkvLyB0b3AKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCBoZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IHJpZ2h0Ci0JCS8vIGJvdHRvbQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IHJpZ2h0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGJhY2sgbGVmdAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIHJpZ2h0Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBweXJhbWlkIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBkZXB0aAotCSAqLwotCXZvaWQgZHJhd1B5cmFtaWQoZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgZmxvYXQgZGVwdGgpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkvLyBmcm9udAotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyB0b3AJCQkJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gcmlnaHQKLQkJLy8gbGVmdAotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyB0b3AJCQkJCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBsZWZ0CQotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyByaWdodAkKLQkJLy8gZnJvbnQKLQkJR0wuZ2xWZXJ0ZXgzZigtd2lkdGgsIC1oZWlnaHQsIC1kZXB0aCk7CS8vIGxlZnQJCi0JCUdMLmdsVmVydGV4M2YoMC4wZiwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcAkJCQkJCQotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyByaWdodAotCQkvLyByaWdodAotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyB0b3AJCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIGRlcHRoKTsJLy8gbGVmdAkKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gcmlnaHQJCQkKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGJvdHRvbQotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgLWhlaWdodCwgZGVwdGgpOwkvLyBmcm9udCBsZWZ0Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAtZGVwdGgpOwkvLyBiYWNrIGxlZnQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgLWRlcHRoKTsJLy8gYmFjayByaWdodAotCQlHTC5nbFZlcnRleDNmKHdpZHRoLCAtaGVpZ2h0LCBkZXB0aCk7CS8vIGZyb250IHJpZ2h0Ci0JCUdMLmdsRW5kKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzcXVhcmUgY2VudGVyZWQgYXQgMCwwIGluIHRoZSB2aWV3cG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICovCi0Jdm9pZCBkcmF3U3F1YXJlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gYm90dG9tIGxlZnQgCQkJCi0JCUdMLmdsVmVydGV4M2Yod2lkdGgsIC1oZWlnaHQsIDAuMGYpOwkvLyBib3R0b20gcmlnaHQKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgaGVpZ2h0LCAwLjBmKTsJCS8vIHRvcCByaWdodAotCQlHTC5nbFZlcnRleDNmKC13aWR0aCwgaGVpZ2h0LCAwLjBmKTsJLy8gdG9wIGxlZnQKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZnJvbSBnbHV0X3NoYXBlcy5jIC4KLQkgKiAKLQkgKiBAcGFyYW0gcgotCSAqIEBwYXJhbSBSCi0JICogQHBhcmFtIG5zaWRlcwotCSAqIEBwYXJhbSByaW5ncwotCSAqLwotCXZvaWQgZHJhd1RvcnVzKGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZjsKLQkJZmxvYXQgY29zVGhldGEgPSAxLjBmOwotCQlmbG9hdCBzaW5UaGV0YSA9IDAuMGY7Ci0JCQotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURfU1RSSVApOwotCQkJZmxvYXQgcGhpID0gMC4wZjsKLQkJCQotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCUdMLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTC5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQkKLQkJCUdMLmdsRW5kKCk7Ci0JCQl0aGV0YSA9IHRoZXRhMTsKLQkJCWNvc1RoZXRhID0gY29zVGhldGExOwotCQkJc2luVGhldGEgPSBzaW5UaGV0YTE7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRyaWFuZ2xlIGNlbnRlcmVkIGF0IDAsMCBpbiB0aGUgdmlld3BvcnQuCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqLwotCXZvaWQgZHJhd1RyaWFuZ2xlKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIGhlaWdodCwgMC4wZik7CQkvLyBtaWRkbGUgCi0JCUdMLmdsVmVydGV4M2YoLXdpZHRoLCAtaGVpZ2h0LCAwLjBmKTsJLy8gbGVmdCAKLQkJR0wuZ2xWZXJ0ZXgzZih3aWR0aCwgLWhlaWdodCwgMC4wZik7CS8vIHJpZ2h0CQkgCQkKLQkJR0wuZ2xFbmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsJCi0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIk9iamVjdHMiOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wKTsKLQkJcXVhZHJhdGljID0gR0xVLmdsdU5ld1F1YWRyaWMoKTsKLQkJR0xVLmdsdVF1YWRyaWNOb3JtYWxzKHF1YWRyYXRpYywgR0xVLkdMVV9TTU9PVEgpOwotCQlHTC5nbExpbmVXaWR0aCgyKTsKLQotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQotCQkvLyBjcmVhdGUgdGhlIGRpc3BsYXkgbGlzdHMgYW5kIHNoYXBlcwotCQlzaGFwZXMgPSBuZXcgU2hhcGVbMTFdOwotCQlpbnQgaW5kZXggPSAxOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdUcmlhbmdsZSgyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1swXSA9IG5ldyBTaGFwZSgiVHJpYW5nbGUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3UHlyYW1pZCgyLjBmLCAyLjBmLCAyLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1sxXSA9IG5ldyBTaGFwZSgiUHlyYW1pZCIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdTcXVhcmUoMi4wZiwgMi4wZik7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbMl0gPSBuZXcgU2hhcGUoIlNxdWFyZSIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCWRyYXdDdWJlKDIuMGYsIDIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzNdID0gbmV3IFNoYXBlKCJDdWJlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJZHJhd0NpcmNsZSgyLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s0XSA9IG5ldyBTaGFwZSgiQ2lyY2xlIiwgaW5kZXgrKyk7Ci0KLQkJR0wuZ2xOZXdMaXN0KGluZGV4LCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdVBhcnRpYWxEaXNrKHF1YWRyYXRpYywgMC41LCAyLjAsIDE4LCAxOCwgOTAsIDEyNSk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbNV0gPSBuZXcgU2hhcGUoIlBhcnRpYWwgRGlzayIsIGluZGV4KyspOwotCi0JCUdMLmdsTmV3TGlzdChpbmRleCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMC41LCAyLjAsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbNl0gPSBuZXcgU2hhcGUoIkRpc2siLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlkcmF3VG9ydXMoMSwgMiwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s3XSA9IG5ldyBTaGFwZSgiVG9ydXMiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMi4wLCAxOCwgMTgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJc2hhcGVzWzhdID0gbmV3IFNoYXBlKCJTcGhlcmUiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1Q3lsaW5kZXIocXVhZHJhdGljLCAyLjAsIDIuMCwgNCwgMTgsIDE4KTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JCXNoYXBlc1s5XSA9IG5ldyBTaGFwZSgiQ3lsaW5kZXIiLCBpbmRleCsrKTsKLQotCQlHTC5nbE5ld0xpc3QoaW5kZXgsIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1Q3lsaW5kZXIocXVhZHJhdGljLCAwLCAyLjAsIDQsIDE4LCAxOCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCQlzaGFwZXNbMTBdID0gbmV3IFNoYXBlKCJDb25lIiwgaW5kZXgrKyk7Ci0KLQkJY3VycmVudFNoYXBlID0gc2hhcGVzWzBdOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNyZW5kZXJTY2VuZSgpCi0JICovCi0Jdm9pZCByZW5kZXJTY2VuZSgpIHsKLQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUIHwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTQuMGYpOwotCQkvLyByb3RhdGUgYXJvdW5kIFggYW5kIFkgYXhpcwotCQlHTC5nbFJvdGF0ZWYoeVJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih4Um90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJLy8gc2V0cyBwb2x5Z29uIGZpbGwgbW9kZQotCQlpZiAoZmlsbCkgewotCQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVF9BTkRfQkFDSywgR0wuR0xfRklMTCk7Ci0JCX0gZWxzZSB7Ci0JCQlHTC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9MSU5FKTsKLQkJfQotCQljdXJyZW50U2hhcGUuZHJhdygpOwotCQl5Um90ICs9IDEuNTsKLQkJeFJvdCArPSAxLjU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xFeGFtcGxlLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzZGEyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL09wZW5HTEV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE9wZW5HTEV4YW1wbGUgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0KLQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJleGFtcGxlc19vcGVuZ2wiKTsKLQlwcml2YXRlIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0JcHJpdmF0ZSBPcGVuR0xUYWJbXSB0YWJzOwotCXByaXZhdGUgaW50IHNsZWVwOwotCQotCXB1YmxpYyBPcGVuR0xFeGFtcGxlKCkge30KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYW4gT3BlbkdMRXhhbXBsZSBlbWJlZGRlZCBpbnNpZGUKLQkgKiB0aGUgc3VwcGxpZWQgcGFyZW50IENvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluZXIgb2YgdGhlIGV4YW1wbGUKLQkgKi8KLQlwdWJsaWMgT3BlbkdMRXhhbXBsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRhYnMgPQotCQkJbmV3IE9wZW5HTFRhYltdIHsKLQkJCQluZXcgQW50aWFsaWFzaW5nVGFiKCksCi0JCQkJbmV3IEFyZWFUYWIoKSwKLQkJCQluZXcgRm9nVGFiKCksCi0JCQkJbmV3IEdyYWRpZW50VGFiKCksCi0JCQkJbmV3IExpZ2h0VGFiKCksCi0JCQkJbmV3IE51cmJUYWIoKSwKLQkJCQluZXcgT2JqZWN0c1RhYigpLAotCQkJCW5ldyBSZWZsZWN0aW9uVGFiKCksCi0JCQkJbmV3IFN0ZW5jaWxUYWIoKSwKLQkJCQluZXcgVGV4dHVyZVRhYigpLAotCQkJCW5ldyBUcmFuc3BhcmVuY3lUYWIoKQotCQkJfTsKLQkJCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCh0YWJzW2ldLmdldFRhYlRleHQoKSk7Ci0JCQlpdGVtLnNldENvbnRyb2wodGFic1tpXS5jcmVhdGVUYWJGb2xkZXJQYWdlKHRhYkZvbGRlcikpOwotCQl9Ci0JCQotCQl0YWJGb2xkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCU9wZW5HTFRhYiB0YWIgPSB0YWJzW3RhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCQl0YWIuc2V0Q3VycmVudCgpOwotCQkJCXNsZWVwID0gdGFiLmdldFNsZWVwTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAodGFicy5sZW5ndGggPiAwKSB7Ci0JCQl0YWJzWzBdLnNldEN1cnJlbnQoKTsKLQkJCXNsZWVwID0gdGFic1swXS5nZXRTbGVlcExlbmd0aCgpOwotCQl9Ci0JCQotCQlSdW5uYWJsZSB0aW1lciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodGFiRm9sZGVyLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCWRpc3BsYXkoKTsKLQkJCQl0YWJGb2xkZXIuZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhzbGVlcCwgdGhpcyk7Ci0JCQl9Ci0JCX07Ci0JCXRpbWVyLnJ1bigpOwotCQl0YWJGb2xkZXIuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJlbmRlcnMgdGhlIHNjZW5lIG9mIHRoZSBjdXJyZW50IHRhYi4KLQkgKi8KLQl2b2lkIGRpc3BsYXkoKSB7Ci0JCWludCBpbmRleCA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQl0YWJzW2luZGV4XS5yZW5kZXIoKTsKLQkJdGFic1tpbmRleF0uc3dhcCgpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBvZiBhbGwgY29udGFpbmVkIHRhYnMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCkgewotCQl0YWJGb2xkZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCXRhYnNbaV0uZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBiZWNhdXNlIG9mIGEgbWlzc2luZyBTdHJpbmcuCi0JICogUmV0dXJucyB0aGUga2V5IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2VzIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJT3BlbkdMRXhhbXBsZSBpbnN0YW5jZSA9IG5ldyBPcGVuR0xFeGFtcGxlKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRSZXNvdXJjZVN0cmluZygid2luZG93LnRpdGxlIikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghIHNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCEgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWluc3RhbmNlLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgb3BlbiAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQluZXcgT3BlbkdMRXhhbXBsZShzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0UmVzb3VyY2VTdHJpbmcoIndpbmRvdy50aXRsZSIpKTsKLQkJc2hlbGwub3BlbigpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvT3BlbkdMVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTllOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9PcGVuR0xUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC4qOwotCi0vKioKLSAqIDxjb2RlPk9wZW5HTFRhYjwvY29kZT4gaXMgdGhlIGFic3RyYWN0IHN1cGVyY2xhc3Mgb2YgZXZlcnkgcGFnZQotICogaW4gdGhlIGV4YW1wbGUncyB0YWIgZm9sZGVyLiAgRWFjaCBwYWdlIGluIHRoZSB0YWIgZm9sZGVyCi0gKiBkaXNwbGF5cyBhIGRpZmZlcmVudCBleGFtcGxlLgotICoKLSAqIEFuIE9wZW5HTFRhYiBpdHNlbGYgaXMgbm90IGEgY29udHJvbCBidXQgaW5zdGVhZCBwcm92aWRlcyBhIGhpZXJhcmNoeQotICogd2l0aCB3aGljaCB0byBzaGFyZSBjb2RlIHRoYXQgaXMgY29tbW9uIHRvIGV2ZXJ5IHBhZ2UgaW4gdGhlIGZvbGRlci4KLSAqLwotYWJzdHJhY3QgY2xhc3MgT3BlbkdMVGFiIHsKLQlwcml2YXRlIEdMQ2FudmFzIGdsQ2FudmFzOwotCXByaXZhdGUgQ29tcG9zaXRlIHRhYkZvbGRlclBhZ2U7Ci0JcHJpdmF0ZSBib29sZWFuIHN0ZW5jaWxTdXBwb3J0OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX1NMRUVQX0xFTkdUSCA9IDEwMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhpcyB0YWIncyBjb250cm9scy4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKgotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGZvbGRlciBwYWdlLgotCSAqCi0JICogQHBhcmFtIHRhYkZvbGRlciB0aGUgcGFyZW50IHRhYiBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGFnZQotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVUYWJGb2xkZXJQYWdlKFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLQkJdGFiRm9sZGVyUGFnZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRhYkZvbGRlclBhZ2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJR0xEYXRhIGRhdGEgPSBuZXcgR0xEYXRhKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZGF0YS5zdGVuY2lsU2l6ZSA9IDg7Ci0JCWdsQ2FudmFzID0gbmV3IEdMQ2FudmFzKHRhYkZvbGRlclBhZ2UsIFNXVC5OT19CQUNLR1JPVU5ELCBkYXRhKTsKLQkJZ2xDYW52YXMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlnbENhbnZhcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZ2xDYW52YXMuc2V0U2l6ZSg0MDAsIDQwMCk7CQkvLyBuZWVkZWQgZm9yIHdpbmRvd3MKLQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJQ29tcG9zaXRlIGNvbnRyb2xDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlclBhZ2UsIFNXVC5OT05FKTsKLQkJY29udHJvbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbnRyb2xDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBPcGVuR0wgU2NyZWVuIGFuZCBjb250cm9scwotCQlzZXRDdXJyZW50KCk7Ci0JCXNldHVwVmlld2luZ0FyZWEoKTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgbmF0aXZlIHN0ZW5jaWwgc3VwcG9ydCBpcyBhdmFpbGFibGUKLQkJaW50W10gcGFyYW0gPSBuZXcgaW50WzFdOwotCQlHTC5nbEdldEludGVnZXJ2KEdMLkdMX1NURU5DSUxfQklUUywgcGFyYW0pOwotCQlzdGVuY2lsU3VwcG9ydCA9IHBhcmFtWzBdICE9IDA7Ci0KLQkJaW5pdCgpOwotCi0JCWlmICghaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHx8IGhhc1N0ZW5jaWxTdXBwb3J0KCkpIHsKLQkJCWNyZWF0ZUNvbnRyb2xzKGNvbnRyb2xDb21wb3NpdGUpOwotCQl9IGVsc2UgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udHJvbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyB0YWIgcmVxdWlyZXMgbmF0aXZlIHN0ZW5jaWwgc3VwcG9ydC4iKTsKLQkJfQotCi0JCXJldHVybiB0YWJGb2xkZXJQYWdlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgdGFiLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnbENhbnZhcyBmb3IgdGhpcyB0YWIuCi0JICogCi0JICogQHJldHVybiBDYW52YXMKLQkgKi8KLQlHTENhbnZhcyBnZXRHbENhbnZhcygpIHsKLQkJcmV0dXJuIGdsQ2FudmFzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGF0IHRoZSBleGFtcGxlCi0JICogc2hvdWxkIHNsZWVwIGJldHdlZW4gYW5pbWF0aW9uIHJlZHJhd3MuICBBcyB0aGlzIGxlbmd0aAotCSAqIGluY3JlYXNlcywgdXNlciByZXNwb25zaXZlbmVzcyBpbmNyZWFzZXMgYW5kIHRoZSBmcmVxdWVuY3kgb2YKLQkgKiBhbmltYXRpb24gcmVkcmF3cyBkZWNyZWFzZXMuICBTdWJjbGFzc2VzIHdpdGggbW92aW5nIGFuaW1hdGlvbnMKLQkgKiBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdG8gcmV0dXJuIGEKLQkgKiBzbWFsbGVyIHZhbHVlIGlmIHRoZWlyIGFuaW1hdGlvbnMgZG8gbm90IG9jY3VyIGZyZXF1ZW50bHkgZW5vdWdoLiAKLQkgKgotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZXR3ZWVuIHJlZHJhd3MKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NMRUVQX0xFTkdUSDsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhpcyB0YWIuICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgdGFiIGl0ZW0KLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0VGFiVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbWFjaGluZSBoYXMgbmF0aXZlIHN0ZW5jaWxzIHN1cHBvcnQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNTdGVuY2lsU3VwcG9ydCgpIHsKLQkJcmV0dXJuIHN0ZW5jaWxTdXBwb3J0OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgT3BlbkdMIHJlc291cmNlcyBmb3IgdGhpcyB0YWIuICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBpbml0KCk7Ci0KLQkvKioKLQkgKiBMb2FkcyBhIHRleHR1cmUuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gdGV4dHVyZVtdCi0JICovCi0Jc3RhdGljIHZvaWQgbG9hZFRleHR1cmUoR0xDYW52YXMgY29udGV4dCwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgaW5kZXgsIGludFtdIHRleHR1cmUpIHsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlW2luZGV4XSk7Ci0JCUltYWdlRGF0YSBzb3VyY2UgPQotCQkJbmV3IEltYWdlRGF0YShPcGVuR0xUYWIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSkpOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc291cmNlKTsKLQkJSW1hZ2UgbmV3SW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NiwgMjU2KTsKLQkJR0MgZ2MgPSBuZXcgR0MobmV3SW1hZ2UpOwotCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgMCwgMCwgMjU2LCAyNTYpOwotCQlzb3VyY2UgPSBuZXdJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlzb3VyY2UgPSBJbWFnZURhdGFVdGlsLmNvbnZlcnRJbWFnZURhdGEoc291cmNlKTsKLQkJbmV3SW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCUdMLmdsVGV4SW1hZ2UyRCgKLQkJCUdMLkdMX1RFWFRVUkVfMkQsIDAsIDMsIAotCQkJc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCAwLAotCQkJR0wuR0xfUkdCLCBHTC5HTF9VTlNJR05FRF9CWVRFLCBzb3VyY2UuZGF0YSk7Ci0JCUdMLmdsVGV4UGFyYW1ldGVyaShHTC5HTF9URVhUVVJFXzJELCBHTC5HTF9URVhUVVJFX01JTl9GSUxURVIsIEdMLkdMX0xJTkVBUik7Ci0JCUdMLmdsVGV4UGFyYW1ldGVyaShHTC5HTF9URVhUVVJFXzJELCBHTC5HTF9URVhUVVJFX01BR19GSUxURVIsIEdMLkdMX0xJTkVBUik7Ci0JfQotCi0JLyoqCi0JICogUmVuZGVycyB0aGlzIHRhYi4KLQkgKi8KLQl2b2lkIHJlbmRlcigpIHsKLQkJc2V0Q3VycmVudCgpOwotCQlpZiAoIWlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB8fCBoYXNTdGVuY2lsU3VwcG9ydCgpKSB7Ci0JCQlyZW5kZXJTY2VuZSgpOwotCQl9IGVsc2UgewotCQkJR0wuZ2xDbGVhcihHTC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbmRlcnMgdGhlIHNjZW5lIGZvciB0aGlzIHRhYi4gIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHJlbmRlclNjZW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0YWIgcmVxdWlyZXMgc3RlbmNpbCBzdXBwb3J0IGluIG9yZGVyIHRvIGRpc3BsYXkKLQkgKiBwcm9wZXJseS4gU3ViY2xhc3NlcyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQgdG8gYmUgY3VycmVudC4KLQkgKi8KLQl2b2lkIHNldEN1cnJlbnQoKSB7Ci0JCWdsQ2FudmFzLnNldEN1cnJlbnQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgdmlld2luZyBhcmVhIGZvciB0aGUgT3BlbkdMIHNjcmVlbi4gIFRoZSBkZWZhdWx0Ci0JICogYmVoYXZpb3IgaXMgdG8gdXNlIGEgcGVyc3BlY3RpdmUgdmlldywgYnV0IHRoZXJlIGFsc28gZXhpc3QgZnJ1c3RydW0KLQkgKiBhbmQgb3J0aG8gdmlld3MuICBTdWJjbGFzc2VzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXZvaWQgc2V0dXBWaWV3aW5nQXJlYSgpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBnbENhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0JCWludCB3aWR0aCA9IHJlY3Qud2lkdGg7Ci0JCWludCBoZWlnaHQgPSByZWN0LmhlaWdodDsKLQkJaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCAxKTsKLQkJR0wuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwkvLyBzZWxlY3QgdGhlIHByb2plY3Rpb24gbWF0cml4Ci0JCUdMLmdsTG9hZElkZW50aXR5KCk7CQkJCS8vIHJlc2V0IHRoZSBwcm9qZWN0aW9uIG1hdHJpeAotCQlmbG9hdCBmQXNwZWN0ID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OwotCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0JCUdMLmdsTWF0cml4TW9kZShHTC5HTF9NT0RFTFZJRVcpOwkvLyBzZWxlY3QgdGhlIG1vZGVsdmlldyBtYXRyaXgKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBTd2FwcyB0aGUgYnVmZmVycy4KLQkgKi8KLQl2b2lkIHN3YXAoKSB7Ci0JCWdsQ2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9SZWZsZWN0aW9uVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2NTRiMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1JlZmxlY3Rpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFJlZmxlY3Rpb25UYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgZmxvYXQgYmFsbFkgPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFogPSAxLjY2NjY2NjZmOwotCXByaXZhdGUgZmxvYXQgYmFsbFggPSAwLjBmOwotCXByaXZhdGUgZmxvYXQgYmFsbFJvdCA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWCA9IDIuNWY7Ci0JcHJpdmF0ZSBmbG9hdCBjdWJlWSA9IC0yLjBmOwotCXByaXZhdGUgZmxvYXQgY3ViZVogPSAyLjBmOwotCXByaXZhdGUgZmxvYXQgeFBvcyA9IDAuMGY7Ci0JcHJpdmF0ZSBmbG9hdCB5UG9zID0gMC4wZjsKLQlwcml2YXRlIGZsb2F0IHpQb3MgPSAyMi4wZjsKLQlwcml2YXRlIGZsb2F0IGJhbGxSb3RTcGVlZCA9IDAuMGY7Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgaW50W10gdGV4dHVyZXMgPSBuZXcgaW50WzNdOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludAotCQlMSVNUX0lOREVYX0JBTEwgPSAxLExJU1RfSU5ERVhfQk9YID0gMiwKLQkJTElTVF9JTkRFWF9NSVJST1IgPSAzLCBMSVNUX0lOREVYX1JPT00gPSA0OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludAotCQlURVhUVVJFX0lOREVYX0JBTEwgPSAwLCBURVhUVVJFX0lOREVYX0ZMT09SID0gMSwKLQkJVEVYVFVSRV9JTkRFWF9CT1ggPSAyOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIElNQUdFUyA9IHsKLQkJImltYWdlcy9CYWxsLmpwZyIsICJpbWFnZXMvRmxvb3IuanBnIiwgImltYWdlcy9Cb3guYm1wIiB9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSA1MDsKLQotCS8qKgotCSAqIERyYXdzIHRoZSBiYWxsCi0JICovCi0Jdm9pZCBjcmVhdGVCYWxsKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9CQUxMLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfQkFMTF0pOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMC4zNWYsIDMyLCAxNik7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9CTEVORCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBib3gKLQkgKi8KLQl2b2lkIGNyZWF0ZUJveCgpIHsKLQkJZmxvYXQgc2l6ZSA9IDEuMGY7Ci0JCUdMLmdsTmV3TGlzdChMSVNUX0lOREVYX0JPWCwgR0wuR0xfQ09NUElMRSk7Ci0JCUdMLmdsQ29sb3I0ZigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlc1tURVhUVVJFX0lOREVYX0JPWF0pOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gZnJvbnQJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIHNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCS8vIGJhY2sJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgLTEuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIC1zaXplKTsKLQkJLy8gbGVmdAkKLQkJR0wuZ2xOb3JtYWwzZigtMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQkvLyByaWdodAkKLQkJR0wuZ2xOb3JtYWwzZigxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAtc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgc2l6ZSk7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIC1zaXplKTsKLQkJLy8gdG9wCQotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDEuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIHNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIHNpemUsIHNpemUpOwotCQkvLyBib3R0b20JCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgLTEuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2Yoc2l6ZSwgLXNpemUsIC1zaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgLXNpemUpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCBzaXplKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBiYWxsVHJhbnNsYXRpb24gPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJhbGxUcmFuc2xhdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJYmFsbFRyYW5zbGF0aW9uLnNldFRleHQoIkJhbGwgVHJhbnNsYXRpb24iKTsKLQotCQluZXcgTGFiZWwoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIGJhbGxYUG9zU2xpZGVyID0gbmV3IFNsaWRlcihiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQliYWxsWFBvc1NsaWRlci5zZXRNYXhpbXVtKDM4KTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFhQb3NTbGlkZXIuc2V0VGh1bWIoMik7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWJhbGxYUG9zU2xpZGVyLnNldFNlbGVjdGlvbigxOCk7Ci0JCWJhbGxYUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQliYWxsWCA9IChmbG9hdCkgKGJhbGxYUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMTgpIC8gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIoYmFsbFRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJYmFsbFlQb3NTbGlkZXIuc2V0TWF4aW11bSgzOCk7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWJhbGxZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQliYWxsWVBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsWVBvc1NsaWRlci5zZXRTZWxlY3Rpb24oMTgpOwotCQliYWxsWVBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYmFsbFkgPSAoZmxvYXQpIChiYWxsWVBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSAtIDE4KSAvIDU7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChiYWxsVHJhbnNsYXRpb24sIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgYmFsbFpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKGJhbGxUcmFuc2xhdGlvbiwgU1dULk5PTkUpOwotCQliYWxsWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxaUG9zU2xpZGVyLnNldE1heGltdW0oMjQpOwotCQliYWxsWlBvc1NsaWRlci5zZXRNaW5pbXVtKDApOwotCQliYWxsWlBvc1NsaWRlci5zZXRUaHVtYigxKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJYmFsbFpQb3NTbGlkZXIuc2V0U2VsZWN0aW9uKDQpOwotCQliYWxsWlBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYmFsbFogPSAoZmxvYXQpIChiYWxsWlBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSArIDEpIC8gMzsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgY3ViZVRyYW5zbGF0aW9uID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljdWJlVHJhbnNsYXRpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWN1YmVUcmFuc2xhdGlvbi5zZXRUZXh0KCJDdWJlIFRyYW5zbGF0aW9uIik7Ci0KLQkJbmV3IExhYmVsKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlg6Iik7Ci0JCWZpbmFsIFNsaWRlciBjdWJlWFBvc1NsaWRlciA9IG5ldyBTbGlkZXIoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJY3ViZVhQb3NTbGlkZXIuc2V0TWF4aW11bSgxNCk7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWN1YmVYUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQljdWJlWFBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQljdWJlWFBvc1NsaWRlci5zZXRTZWxlY3Rpb24oMTEpOwotCQljdWJlWFBvc1NsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJY3ViZVggPSAoZmxvYXQpIChjdWJlWFBvc1NsaWRlci5nZXRTZWxlY3Rpb24oKSAtIDYpIC8gMjsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGN1YmVUcmFuc2xhdGlvbiwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciBjdWJlWVBvc1NsaWRlciA9IG5ldyBTbGlkZXIoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSk7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldEluY3JlbWVudCgxKTsKLQkJY3ViZVlQb3NTbGlkZXIuc2V0TWF4aW11bSgxNCk7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldE1pbmltdW0oMCk7Ci0JCWN1YmVZUG9zU2xpZGVyLnNldFRodW1iKDIpOwotCQljdWJlWVBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQljdWJlWVBvc1NsaWRlci5zZXRTZWxlY3Rpb24oMik7Ci0JCWN1YmVZUG9zU2xpZGVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdWJlWSA9IChmbG9hdCkgKGN1YmVZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gNikgLyAyOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY3ViZVRyYW5zbGF0aW9uLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIGN1YmVaUG9zU2xpZGVyID0gbmV3IFNsaWRlcihjdWJlVHJhbnNsYXRpb24sIFNXVC5OT05FKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0SW5jcmVtZW50KDEpOwotCQljdWJlWlBvc1NsaWRlci5zZXRNYXhpbXVtKDEwKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0TWluaW11bSgxKTsKLQkJY3ViZVpQb3NTbGlkZXIuc2V0VGh1bWIoMSk7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCWN1YmVaUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyKTsKLQkJY3ViZVpQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1YmVaID0gKGZsb2F0KSAoY3ViZVpQb3NTbGlkZXIuZ2V0U2VsZWN0aW9uKCkgKyAyKSAvIDI7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyb3VwIG1vdmVtZW50R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCW1vdmVtZW50R3JvdXAuc2V0VGV4dCgiUm9vbSBSb3RhdGlvbiIpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHNjcmVlblhQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0TWF4aW11bSg0Mik7Ci0JCXNjcmVlblhQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc2NyZWVuWFBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzY3JlZW5YUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCXNjcmVlblhQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXhQb3MgPSBzY3JlZW5YUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWToiKTsKLQkJZmluYWwgU2xpZGVyIHNjcmVlbllQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0TWF4aW11bSg0Mik7Ci0JCXNjcmVlbllQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc2NyZWVuWVBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzY3JlZW5ZUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCXNjcmVlbllQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXlQb3MgPSBzY3JlZW5ZUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpIC0gMjA7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWjoiKTsKLQkJZmluYWwgU2xpZGVyIHNjcmVlblpQb3NTbGlkZXIgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0TWF4aW11bSg0Mik7Ci0JCXNjcmVlblpQb3NTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRUaHVtYigyKTsKLQkJc2NyZWVuWlBvc1NsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQlzY3JlZW5aUG9zU2xpZGVyLnNldFNlbGVjdGlvbigyMCk7Ci0JCXNjcmVlblpQb3NTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXpQb3MgPSBzY3JlZW5aUG9zU2xpZGVyLmdldFNlbGVjdGlvbigpICsgMjsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIkJhbGwgUm90YXRpb24gU3BlZWQ6Iik7Ci0JCWZpbmFsIFNsaWRlciBiYWxsUm90U2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRJbmNyZW1lbnQoMSk7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0TWF4aW11bSgyMik7Ci0JCWJhbGxSb3RTbGlkZXIuc2V0TWluaW11bSgwKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRUaHVtYigyKTsKLQkJYmFsbFJvdFNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQliYWxsUm90U2xpZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJYmFsbFJvdFNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJYmFsbFJvdFNwZWVkID0gYmFsbFJvdFNsaWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIERyYXdzIHRoZSBtaXJyb3IKLQkgKi8KLQl2b2lkIGNyZWF0ZU1pcnJvcigpIHsKLQkJR0wuZ2xOZXdMaXN0KExJU1RfSU5ERVhfTUlSUk9SLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMC40Zik7Ci0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQmVnaW4oR0wuR0xfUVVBRFMpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9URVhUVVJFXzJEKTsKLQkJR0wuZ2xFbmRMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIERyYXdzIHRoZSByb29tCi0JICovCi0Jdm9pZCBjcmVhdGVSb29tKCkgewotCQlHTC5nbE5ld0xpc3QoTElTVF9JTkRFWF9ST09NLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gbGVmdCB3YWxsCi0JCUdMLmdsTm9ybWFsM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCA0LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCAtNC4wZiwgMC4wZik7Ci0JCS8vIHJpZ2h0IHdhbGwKLQkJR0wuZ2xOb3JtYWwzZigtMS4wZiwgMC4wZiwgMDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIDQuMGYsIDYuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZig0LjBmLCAtNC4wZiwgMC4wZik7Ci0JCS8vIGNlaWxpbmcJCi0JCUdMLmdsTm9ybWFsM2YoMC4wZiwgLTEuMGYsIDAuMGYpOwotCQlHTC5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIDQuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC00LjBmLCA0LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZig0LjBmLCA0LjBmLCA2LjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZig0LjBmLCA0LjBmLCAwLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJLy8gYmFjayB3YWxsIHdpdGggdHJpYW5nbGUgc3RyaXAgdG8gaWxsaW1pbmF0ZSB0LWludGVyc2VjdGlvbnMgCi0JCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVfU1RSSVApOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIC00LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgyLjIsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoNC4wLCAtNC4wLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKDIuMiwgLTIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCg0LjAsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoNC4wLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoNC4wLCA0LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCAyLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoMi4yLCA0LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC0yLjIsIDQuMCwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtNC4wLCA0LjAsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTIuMiwgMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIDIuMiwgMC4wKTsKLQkJR0wuZ2xWZXJ0ZXgzZCgtMi4yLCAtMi4yLCAwLjApOwotCQlHTC5nbFZlcnRleDNkKC00LjAsIC0yLjIsIDAuMCk7Ci0JCUdMLmdsVmVydGV4M2QoLTQuMCwgLTQuMCwgMC4wKTsKLQkJR0wuZ2xFbmQoKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCS8vIGRyYXcgZmxvb3IKLQkJR0wuZ2xDb2xvcjRmKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbEJpbmRUZXh0dXJlKEdMLkdMX1RFWFRVUkVfMkQsIHRleHR1cmVzW1RFWFRVUkVfSU5ERVhfRkxPT1JdKTsKLQkJR0wuZ2xOb3JtYWwzZigwLjBmLCAxLjBmLCAwLjBmKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCS8vIGZsb29yCi0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtNC4wZiwgLTQuMGYsIDYuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTQuMGYsIC00LjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDAuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDQuMGYsIC00LjBmLCA2LjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQkJLy8gZHJhdyBtaXJyb3IgZnJhbWUKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlc1tURVhUVVJFX0lOREVYX0JPWF0pOwotCQlHTC5nbE5vcm1hbDNmKDAuMGYsIDAuMGYsIDEuMGYpOwotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJLy8gdG9wCi0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAyLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDIuMmYsIDIuMmYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIDIuMmYsIDAuMGYpOwotCQkvLyByaWdodAotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjBmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigyLjJmLCAyLjBmLCAwLjBmKTsKLQkJLy8gYm90dG9tCi0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgLTIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4yZiwgLTIuMmYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMS4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMmYsIC0yLjJmLCAwLjBmKTsKLQkJLy8gbGVmdAotCQlHTC5nbFRleENvb3JkMmYoMC4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFRleENvb3JkMmYoMS4wZiwgMC4wZik7Ci0JCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAwLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjJmLCAtMi4wZiwgMC4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMi4yZiwgMi4wZiwgMC4wZik7Ci0JCUdMLmdsRW5kKCk7Ci0JCUdMLmdsRW5kTGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfQkFMTCwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoTElTVF9JTkRFWF9CT1gsIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKExJU1RfSU5ERVhfTUlSUk9SLCAxKTsKLQkJR0wuZ2xEZWxldGVMaXN0cyhMSVNUX0lOREVYX1JPT00sIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFNsZWVwTGVuZ3RoKCkKLQkgKi8KLQlpbnQgZ2V0U2xlZXBMZW5ndGgoKSB7Ci0JCXJldHVybiBTTEVFUF9MRU5HVEg7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlJlZmxlY3Rpb24iOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2luaXQoKQotCSAqLwotCXZvaWQgaW5pdCgpIHsKLQkJaWYgKCFoYXNTdGVuY2lsU3VwcG9ydCgpKSByZXR1cm47Ci0KLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCUdMLmdsQ2xlYXJTdGVuY2lsKDApOwotCQlHTC5nbEdlblRleHR1cmVzKElNQUdFUy5sZW5ndGgsIHRleHR1cmVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBJTUFHRVMubGVuZ3RoOyBpKyspIHsKLQkJCWxvYWRUZXh0dXJlKGdldEdsQ2FudmFzKCksIElNQUdFU1tpXSwgaSwgdGV4dHVyZXMpOwotCQl9Ci0KLQkJR0wuZ2xTaGFkZU1vZGVsKEdMLkdMX1NNT09USCk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCUdMVS5nbHVRdWFkcmljTm9ybWFscyhxdWFkcmF0aWMsIEdMLkdMX1NNT09USCk7Ci0JCUdMVS5nbHVRdWFkcmljVGV4dHVyZShxdWFkcmF0aWMsIHRydWUpOwotCQlHTC5nbERlcHRoRnVuYyhHTC5HTF9MRVFVQUwpOwotCQlHTC5nbEJsZW5kRnVuYyhHTC5HTF9TUkNfQUxQSEEsIEdMLkdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotCQlHTC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCi0JCS8vIHNldCB1cCB0aGUgbGlnaHRzCi0JCWZsb2F0W10gTGlnaHRBbWIgPSB7IDAuN2YsIDAuN2YsIDAuN2YsIDEuMGYgfTsKLQkJZmxvYXRbXSBMaWdodERpZiA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwotCQlmbG9hdFtdIGxpZ2h0c0FtYmllbnQgPSB7IDAuNWYsIDAuNWYsIDAuNWYsIDEuMGYgfTsKLQkJR0wuZ2xMaWdodE1vZGVsZnYoR0wuR0xfTElHSFRfTU9ERUxfQU1CSUVOVCwgbGlnaHRzQW1iaWVudCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX0FNQklFTlQsIExpZ2h0QW1iKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfRElGRlVTRSwgTGlnaHREaWYpOwotCi0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUMCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfTElORV9TTU9PVEgpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQotCQljcmVhdGVSb29tKCk7Ci0JCWNyZWF0ZUJhbGwoKTsKLQkJY3JlYXRlQm94KCk7Ci0JCWNyZWF0ZU1pcnJvcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2lzU3RlbmNpbFN1cHBvcnROZWVkZWQKLQkgKi8KLQlib29sZWFuIGlzU3RlbmNpbFN1cHBvcnROZWVkZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTFUuZ2x1TG9va0F0KHhQb3MsIHlQb3MsIHpQb3MsIDAsIDAsIDAsIDAsIDEsIDApOwotCQkvLyBjbGlwIHBsYW5lIGVxdWF0aW9uCi0JCWRvdWJsZSBjbGlwRXF1YXRpb25bXSA9IHsgMC4wZiwgMC4wZiwgLTEuMGYsIDAuMGYgfTsKLQkJZmxvYXRbXSBMaWdodFBvcyA9IHsgMC4wZiwgMi4wZiwgNy4wZiwgMS4wZiB9OwotCQlHTC5nbENvbG9yTWFzayhmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCS8vIGVuYWJsZSBzdGVuY2lsIGJ1ZmZlciBmb3IgIm1hcmtpbmciIHRoZSBtaXJyb3IJCQotCQlHTC5nbEVuYWJsZShHTC5HTF9TVEVOQ0lMX1RFU1QpOwotCQkvLyBzZXQgdGhlIHN0ZW5jaWwgYnVmZmVyIHRvIDEgd2hlcmUgYSBwb2x5Z29uIGlzIGRyYXduCi0JCUdMLmdsU3RlbmNpbEZ1bmMoR0wuR0xfQUxXQVlTLCAxLCAxKTsKLQkJR0wuZ2xTdGVuY2lsT3AoR0wuR0xfS0VFUCwgR0wuR0xfS0VFUCwgR0wuR0xfUkVQTEFDRSk7Ci0JCUdMLmdsRGlzYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX01JUlJPUik7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yTWFzayh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9FUVVBTCwgMSwgMSk7Ci0JCS8vIGRyYXcgd2hlcmUgdGhlIHN0ZW5jaWwgaXMgMQkJCQkJCQotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9LRUVQKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ0xJUF9QTEFORTApOwotCQlHTC5nbENsaXBQbGFuZShHTC5HTF9DTElQX1BMQU5FMCwgY2xpcEVxdWF0aW9uKTsKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsU2NhbGVmKDEuMGYsIDEuMGYsIC0xLjBmKTsKLQkJR0wuZ2xMaWdodGZ2KEdMLkdMX0xJR0hUMCwgR0wuR0xfUE9TSVRJT04sIExpZ2h0UG9zKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX1JPT00pOwkJCS8vIHJlZmxlY3Rpb24KLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZihjdWJlWCwgY3ViZVksIGN1YmVaKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JPWCk7CQkJLy8gcmVmbGVjdGlvbgotCQlHTC5nbFBvcE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoYmFsbFgsIGJhbGxZLCBiYWxsWik7Ci0JCUdMLmdsUm90YXRlZihiYWxsUm90LCAxLjBmLCAwLjBmLCAwLjBmKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX0JBTEwpOwkJCS8vIHJlZmxlY3Rpb24KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0NMSVBfUExBTkUwKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX1NURU5DSUxfVEVTVCk7Ci0JCUdMLmdsTGlnaHRmdihHTC5HTF9MSUdIVDAsIEdMLkdMX1BPU0lUSU9OLCBMaWdodFBvcyk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xCbGVuZEZ1bmMoR0wuR0xfU1JDX0FMUEhBLCBHTC5HTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX01JUlJPUik7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJR0hUSU5HKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0JMRU5EKTsKLQkJR0wuZ2xDYWxsTGlzdChMSVNUX0lOREVYX1JPT00pOwotCQlHTC5nbFB1c2hNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGN1YmVYLCBjdWJlWSwgY3ViZVopOwotCQlHTC5nbENhbGxMaXN0KExJU1RfSU5ERVhfQk9YKTsKLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKGJhbGxYLCBiYWxsWSwgYmFsbFopOwotCQlHTC5nbFJvdGF0ZWYoYmFsbFJvdCwgMS4wZiwgMC4wZiwgMC4wZik7Ci0JCUdMLmdsQ2FsbExpc3QoTElTVF9JTkRFWF9CQUxMKTsKLQkJYmFsbFJvdCArPSBiYWxsUm90U3BlZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9TdGVuY2lsVGFiLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzMzdlNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1N0ZW5jaWxUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmdsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLWNsYXNzIFN0ZW5jaWxUYWIgZXh0ZW5kcyBPcGVuR0xUYWIgewotCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgU2hhcGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkvKioKLQkJICogQ29uc3RydWN0b3IKLQkJICogCi0JCSAqIEBwYXJhbSBuYW1lIHRoZSBzaGFwZSdzIG5hbWUKLQkJICovCi0JCVNoYXBlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQkvKioKLQkJICogRHJhd3MgdGhpcyBzaGFwZS4KLQkJICovCi0JCWFic3RyYWN0IHZvaWQgZHJhdygpOwotCQkvKioKLQkJICogUmV0dXJucyB0aGUgbmFtZS4KLQkJICogCi0JCSAqIEByZXR1cm4gU3RyaW5nCi0JCSAqLwotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTaGFwZVtdIHNoYXBlcyA9IG5ldyBTaGFwZVs1XTsKLQlwcml2YXRlIFNoYXBlIGN1cnJlbnRTaGFwZTsKLQlwcml2YXRlIGZsb2F0IHhQb3MgPSAwLCB5UG9zID0gMDsKLQlwcml2YXRlIGZsb2F0IHNpemUgPSAwLjQ1ZjsKLQlwcml2YXRlIGludCB0ZXh0dXJlOwotCXByaXZhdGUgaW50IHF1YWRyYXRpYzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1BR0UgPSAiaW1hZ2VzL3NwbGFzaC5ibXAiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSA1MDsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb250cm9scy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTk9ORSkuc2V0VGV4dCgiT2JqZWN0OiIpOwotCQlmaW5hbCBDb21ibyBzaGFwZUNvbWJvID0gbmV3IENvbWJvKGNvbnRyb2xzLCBTV1QuUkVBRF9PTkxZKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNoYXBlQ29tYm8uYWRkKHNoYXBlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0JCXNoYXBlQ29tYm8uc2VsZWN0KDApOwotCQlzaGFwZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbc2hhcGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlNpemU6Iik7Ci0JCWZpbmFsIFNsaWRlciBzaXplU2xpZGVyID0gbmV3IFNsaWRlcihjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLQkJc2l6ZVNsaWRlci5zZXRWYWx1ZXMoMCwgMTUsIDc1LCA1LCA1LCAxMCk7Ci0JCXNpemVTbGlkZXIuc2V0U2VsZWN0aW9uKDQ1KTsKLQkJc2l6ZVNsaWRlci5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJc2l6ZSA9ICgoZmxvYXQpIHNpemVTbGlkZXIuZ2V0U2VsZWN0aW9uKCkpIC8gMTAwOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNkaXNwb3NlKCkKLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJR0xVLmdsdURlbGV0ZVF1YWRyaWMocXVhZHJhdGljKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRTbGVlcExlbmd0aCgpCi0JICovCi0JaW50IGdldFNsZWVwTGVuZ3RoKCkgewotCQlyZXR1cm4gU0xFRVBfTEVOR1RIOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNnZXRUYWJUZXh0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0VGFiVGV4dCgpIHsKLQkJcmV0dXJuICJTdGVuY2lsIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9wZW5HTFRhYiNpbml0KCkKLQkgKi8KLQl2b2lkIGluaXQoKSB7Ci0JCWlmICghaGFzU3RlbmNpbFN1cHBvcnQoKSkgcmV0dXJuOwotCQkKLQkJR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotCQlHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0JCWludFtdIHRleHR1cmVPdXQgPSBuZXcgaW50WzFdOwotCQlHTC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVPdXQpOwotCQlsb2FkVGV4dHVyZShnZXRHbENhbnZhcygpLCBJTUFHRSwgMCwgdGV4dHVyZU91dCk7Ci0JCXRoaXMudGV4dHVyZSA9IHRleHR1cmVPdXRbMF07Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCUdMVS5nbHVRdWFkcmljTm9ybWFscyhxdWFkcmF0aWMsIEdMVS5HTFVfU01PT1RIKTsKLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVRVUFMKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfU1RFTkNJTF9URVNUKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfVEVYVFVSRV8yRCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQkvLyBjcmVhdGUgc2hhcGVzCi0JCXNoYXBlc1swXSA9IG5ldyBTaGFwZSgiVHJpYW5nbGUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmF3KCkgewotCQkJCUdMLmdsQmVnaW4oR0wuR0xfVFJJQU5HTEVTKTsKLQkJCQlHTC5nbFZlcnRleDNmKDAuMGYsIHNpemUsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoLXNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUsIC1zaXplLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCXNoYXBlc1sxXSA9IG5ldyBTaGFwZSgiRGlzayIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0xVLmdsdURpc2socXVhZHJhdGljLCAwLjBmLCBzaXplLCAzMiwgMzIpOwotCQkJfQotCQl9OwotCi0JCXNoYXBlc1syXSA9IG5ldyBTaGFwZSgiU3F1YXJlIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbFJlY3RmKC1zaXplLCAtc2l6ZSwgc2l6ZSwgc2l6ZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJc2hhcGVzWzNdID0gbmV3IFNoYXBlKCJIb3VyIEdsYXNzIikgewotCQkJcHVibGljIHZvaWQgZHJhdygpIHsKLQkJCQlHTC5nbEJlZ2luKEdMLkdMX1RSSUFOR0xFUyk7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKC1zaXplLCAtc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCAtc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAtc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihzaXplLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKC1zaXplLCBzaXplLCAwLjBmKTsKLQkJCQlHTC5nbEVuZCgpOwotCQkJfQotCQl9OwotCi0JCXNoYXBlc1s0XSA9IG5ldyBTaGFwZSgiU3RhciIpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYXcoKSB7Ci0JCQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQkJCUdMLmdsVmVydGV4M2YoLTAuM2YsIDAsIDAuMGYpOwotCQkJCUdMLmdsVmVydGV4M2YoMiAqIHNpemUgLSAwLjNmLCAwLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKHNpemUgLSAwLjNmLCAyICogc2l6ZSAqIDAuODVmLCAwLjBmKTsKLQkJCQlHTC5nbFZlcnRleDNmKDIgKiBzaXplIC0gMC4zZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZigwIC0gMC4zZiwgc2l6ZSwgMC4wZik7Ci0JCQkJR0wuZ2xWZXJ0ZXgzZihzaXplIC0gMC4zZiwgLXNpemUgKiAwLjg1ZiwgMC4wZik7Ci0JCQkJR0wuZ2xFbmQoKTsKLQkJCX0KLQkJfTsKLQotCQljdXJyZW50U2hhcGUgPSBzaGFwZXNbMF07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaXNTdGVuY2lsU3VwcG9ydE5lZWRlZAotCSAqLwotCWJvb2xlYW4gaXNTdGVuY2lsU3VwcG9ydE5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCUdMLmdsQ2xlYXIoCi0JCQlHTC5HTF9DT0xPUl9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUCi0JCQkJfCBHTC5HTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOwotCi0JCUdMLmdsTG9hZElkZW50aXR5KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigKLQkJCShmbG9hdCkgKDEuNSAqIE1hdGguY29zKHhQb3MpKSwKLQkJCShmbG9hdCkgKDEuMCAqIE1hdGguc2luKHlQb3MpKSwKLQkJCS0zLjBmKTsKLQkJeFBvcyArPSAwLjE1ZjsKLQkJeVBvcyArPSAwLjNmOwotCi0JCUdMLmdsQ29sb3JNYXNrKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJR0wuZ2xTdGVuY2lsRnVuYyhHTC5HTF9BTFdBWVMsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9SRVBMQUNFKTsKLQkJR0wuZ2xEaXNhYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQlHTC5nbENvbG9yNGYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0KLQkJY3VycmVudFNoYXBlLmRyYXcoKTsKLQotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJR0wuZ2xDb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCUdMLmdsU3RlbmNpbEZ1bmMoR0wuR0xfRVFVQUwsIDEsIDEpOwotCQlHTC5nbFN0ZW5jaWxPcChHTC5HTF9LRUVQLCBHTC5HTF9LRUVQLCBHTC5HTF9LRUVQKTsKLQotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQkvLyBsb2FkIHRoZSB0ZXh0dXJlIGJlaGluZCB0aGUgc3RlbmNpbCBvYmplY3QKLQkJR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC0zLjFmKTsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9RVUFEUyk7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC44NWYsIC0wLjg1ZiwgMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigxLjBmLCAwLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigwLjg1ZiwgLTAuODVmLCAxLjBmKTsKLQkJR0wuZ2xUZXhDb29yZDJmKDEuMGYsIDEuMGYpOwotCQlHTC5nbFZlcnRleDNmKDAuODVmLCAwLjg1ZiwgMS4wZik7Ci0JCUdMLmdsVGV4Q29vcmQyZigwLjBmLCAxLjBmKTsKLQkJR0wuZ2xWZXJ0ZXgzZigtMC44NWYsIDAuODVmLCAxLjBmKTsKLQkJR0wuZ2xFbmQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RleHR1cmVUYWIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFlMTFhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvVGV4dHVyZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgVGV4dHVyZVRhYiBleHRlbmRzIE9wZW5HTFRhYiB7Ci0JcHJpdmF0ZSBmbG9hdCB5cm90ID0gMCwgenJvdCA9IDA7Ci0JcHJpdmF0ZSBmbG9hdCB4UG9zID0gMC4wZiwgeVBvcyA9IDAuMGYsIHpQb3MgPSAtMjA7Ci0JcHJpdmF0ZSBpbnQgdGV4dHVyZSA9IDA7Ci0JcHJpdmF0ZSBmbG9hdFtdW11bXSBwb2ludHMgPSBuZXcgZmxvYXRbNDVdWzQ1XVszXTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1BR0UgPSAiaW1hZ2VzL3NwbGFzaC5ibXAiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9MRU5HVEggPSA1MDsKLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2NyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQl2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbW92ZW1lbnRHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbW92ZW1lbnRHcm91cC5zZXRUZXh0KCJUcmFuc2xhdGlvbiIpOwotCQltb3ZlbWVudEdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCW5ldyBMYWJlbChtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSkuc2V0VGV4dCgiWDoiKTsKLQkJZmluYWwgU2xpZGVyIHhNb3ZlID0gbmV3IFNsaWRlcihtb3ZlbWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXhNb3ZlLnNldEluY3JlbWVudCgxKTsKLQkJeE1vdmUuc2V0TWF4aW11bSgxMik7Ci0JCXhNb3ZlLnNldE1pbmltdW0oMCk7Ci0JCXhNb3ZlLnNldFRodW1iKDIpOwotCQl4TW92ZS5zZXRQYWdlSW5jcmVtZW50KDIpOwotCQl4TW92ZS5zZXRTZWxlY3Rpb24oNSk7Ci0JCXhNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl4UG9zID0geE1vdmUuZ2V0U2VsZWN0aW9uKCkgLSA1OwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpLnNldFRleHQoIlk6Iik7Ci0JCWZpbmFsIFNsaWRlciB5TW92ZSA9IG5ldyBTbGlkZXIobW92ZW1lbnRHcm91cCwgU1dULk5PTkUpOwotCQl5TW92ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCXlNb3ZlLnNldE1heGltdW0oMTIpOwotCQl5TW92ZS5zZXRNaW5pbXVtKDApOwotCQl5TW92ZS5zZXRUaHVtYigyKTsKLQkJeU1vdmUuc2V0UGFnZUluY3JlbWVudCgyKTsKLQkJeU1vdmUuc2V0U2VsZWN0aW9uKDUpOwotCQl5TW92ZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJeVBvcyA9IHlNb3ZlLmdldFNlbGVjdGlvbigpIC0gNTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJaOiIpOwotCQlmaW5hbCBTbGlkZXIgek1vdmUgPSBuZXcgU2xpZGVyKG1vdmVtZW50R3JvdXAsIFNXVC5OT05FKTsKLQkJek1vdmUuc2V0SW5jcmVtZW50KDEpOwotCQl6TW92ZS5zZXRNYXhpbXVtKDI0KTsKLQkJek1vdmUuc2V0TWluaW11bSgwKTsKLQkJek1vdmUuc2V0VGh1bWIoNCk7Ci0JCXpNb3ZlLnNldFBhZ2VJbmNyZW1lbnQoMik7Ci0JCXpNb3ZlLnNldFNlbGVjdGlvbigxMCk7Ci0JCXpNb3ZlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQl6UG9zID0gek1vdmUuZ2V0U2VsZWN0aW9uKCkgLSAzMDsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0U2xlZXBMZW5ndGgoKQotCSAqLwotCWludCBnZXRTbGVlcExlbmd0aCgpIHsKLQkJcmV0dXJuIFNMRUVQX0xFTkdUSDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjZ2V0VGFiVGV4dCgpCi0JICovCi0JU3RyaW5nIGdldFRhYlRleHQoKSB7Ci0JCXJldHVybiAiVGV4dHVyZSI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQkvL0dMLmdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjNmLCAxLjBmKTsgCi0JCUdMLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJR0wuZ2xDbGVhckRlcHRoKDEuMGYpOwotCQlpbnRbXSB0ZXh0dXJlT3V0ID0gbmV3IGludFsxXTsKLQkJR0wuZ2xHZW5UZXh0dXJlcygxLCB0ZXh0dXJlT3V0KTsKLQkJbG9hZFRleHR1cmUoZ2V0R2xDYW52YXMoKSwgSU1BR0UsIDAsIHRleHR1cmVPdXQpOwotCQl0ZXh0dXJlID0gdGV4dHVyZU91dFswXTsKLQkJR0wuZ2xEZXB0aEZ1bmMoR0wuR0xfTEVRVUFMKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9CQUNLLCBHTC5HTF9GSUxMKTsKLQkJR0wuZ2xQb2x5Z29uTW9kZShHTC5HTF9GUk9OVCwgR0wuR0xfTElORSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0xJU1RfTU9ERSk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX1RFWFRVUkVfMkQpOwotCQlHTC5nbEVuYWJsZShHTC5HTF9ERVBUSF9URVNUKTsKLQkJLy8gaW5pdGlhbGl6ZSBwb2ludHMJCi0JCWZvciAoaW50IHggPSAwOyB4IDwgNDU7IHgrKykgewotCQkJZm9yIChpbnQgeSA9IDA7IHkgPCA0NTsgeSsrKSB7Ci0JCQkJcG9pbnRzW3hdW3ldWzBdID0geCAvIDUuMGYgLSA0LjVmOwotCQkJCXBvaW50c1t4XVt5XVsxXSA9IHkgLyA1LjBmIC0gNC41ZjsKLQkJCQlwb2ludHNbeF1beV1bMl0gPQotCQkJCQkoZmxvYXQpIE1hdGguc2luKAotCQkJCQkJKCgoeCAvIDUuMGYpICogNDAuMGYpIC8gMzYwLjBmKSAqIE1hdGguUEkgKiAyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI3JlbmRlclNjZW5lKCkKLQkgKi8KLQl2b2lkIHJlbmRlclNjZW5lKCkgewotCQlHTC5nbENsZWFyKAotCQkJR0wuR0xfQ09MT1JfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfREVQVEhfQlVGRkVSX0JJVAotCQkJCXwgR0wuR0xfU1RFTkNJTF9CVUZGRVJfQklUKTsKLQkJR0wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJR0wuZ2xUcmFuc2xhdGVmKHhQb3MsIHlQb3MsIHpQb3MpOwotCQlHTC5nbFJvdGF0ZWYoeXJvdCwgMC4wZiwgMS4wZiwgMC4wZik7Ci0JCUdMLmdsUm90YXRlZih6cm90LCAwLjBmLCAwLjBmLCAxLjBmKTsKLQkJR0wuZ2xCaW5kVGV4dHVyZShHTC5HTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKLQotCQlHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCA0NDsgeCsrKSB7Ci0JCQlmb3IgKGludCB5ID0gMDsgeSA8IDQ0OyB5KyspIHsKLQkJCQlmbG9hdCBmeCA9IHggLyA0NC4wZjsKLQkJCQlmbG9hdCBmeSA9IHkgLyA0NC4wZjsKLQkJCQlmbG9hdCBmeGIgPSAoeCArIDEpIC8gNDQuMGY7Ci0JCQkJZmxvYXQgZnliID0gKHkgKyAxKSAvIDQ0LjBmOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeCwgZnkpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4XVt5XVswXSwKLQkJCQkJcG9pbnRzW3hdW3ldWzFdLAotCQkJCQlwb2ludHNbeF1beV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeCwgZnliKTsKLQkJCQlHTC5nbFZlcnRleDNmKAotCQkJCQlwb2ludHNbeF1beSArIDFdWzBdLAotCQkJCQlwb2ludHNbeF1beSArIDFdWzFdLAotCQkJCQlwb2ludHNbeF1beSArIDFdWzJdKTsKLQkJCQlHTC5nbFRleENvb3JkMmYoZnhiLCBmeWIpOwotCQkJCUdMLmdsVmVydGV4M2YoCi0JCQkJCXBvaW50c1t4ICsgMV1beSArIDFdWzBdLAotCQkJCQlwb2ludHNbeCArIDFdW3kgKyAxXVsxXSwKLQkJCQkJcG9pbnRzW3ggKyAxXVt5ICsgMV1bMl0pOwotCQkJCUdMLmdsVGV4Q29vcmQyZihmeGIsIGZ5KTsKLQkJCQlHTC5nbFZlcnRleDNmKAotCQkJCQlwb2ludHNbeCArIDFdW3ldWzBdLAotCQkJCQlwb2ludHNbeCArIDFdW3ldWzFdLAotCQkJCQlwb2ludHNbeCArIDFdW3ldWzJdKTsKLQkJCX0KLQkJfQotCQlHTC5nbEVuZCgpOwotCQkvLyBwZXJmb3JtIHdhdmUgbW90aW9uCi0JCWZvciAoaW50IHkgPSAwOyB5IDwgNDU7IHkrKykgewotCQkJZmxvYXQgaG9sZCA9IHBvaW50c1swXVt5XVsyXTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgNDQ7IHgrKykgewotCQkJCXBvaW50c1t4XVt5XVsyXSA9IHBvaW50c1t4ICsgMV1beV1bMl07Ci0JCQl9Ci0JCQlwb2ludHNbNDRdW3ldWzJdID0gaG9sZDsKLQkJfQotCQl5cm90ICs9IDAuOWY7Ci0JCXpyb3QgKz0gMC42ZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9UcmFuc3BhcmVuY3lUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZGI1My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL1RyYW5zcGFyZW5jeVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotY2xhc3MgVHJhbnNwYXJlbmN5VGFiIGV4dGVuZHMgT3BlbkdMVGFiIHsKLQlwcml2YXRlIGZsb2F0W10gYWxwaGFzID0geyAwLjNmLCAwLjVmLCAxLjBmIH07Ci0JcHJpdmF0ZSBpbnQgcXVhZHJhdGljOwotCXByaXZhdGUgaW50IGN1cnJlbnRTZWxlY3Rpb24gPSAxOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludAotCQlJTkRFWF9UUklBTkdMRSA9IDEsIElOREVYX1NQSEVSRSA9IDIsIElOREVYX0RJU0sgPSAzOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIE9CSkVDVFMgPSB7IlRyaWFuZ2xlIiwgIlNwaGVyZSIsICJEaXNrIiB9OwotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgb2JqZWN0R3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCW9iamVjdEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlvYmplY3RHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQluZXcgTGFiZWwob2JqZWN0R3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KCJPYmplY3Q6Iik7Ci0JCWZpbmFsIENvbWJvIG9iamVjdENvbWJvID0gbmV3IENvbWJvKG9iamVjdEdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlvYmplY3RDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlvYmplY3RDb21iby5zZXRJdGVtcyhPQkpFQ1RTKTsKLQkJb2JqZWN0Q29tYm8uc2VsZWN0KDApOwotCQkKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoIlRyYW5zcGFyZW5jeToiKTsKLQkJZmluYWwgU2xpZGVyIHRyYW5zcGFyZW5jeVNsaWRlciA9IG5ldyBTbGlkZXIoY29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXRyYW5zcGFyZW5jeVNsaWRlci5zZXRWYWx1ZXMoMCwgMCwgMTEsIDEsIDEsIDIpOwotCQl0cmFuc3BhcmVuY3lTbGlkZXIuc2V0U2VsZWN0aW9uKDcpOwotCQl0cmFuc3BhcmVuY3lTbGlkZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZsb2F0IGFscGhhID0gdHJhbnNwYXJlbmN5U2xpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCWFscGhhID0gMS4wZiAtIGFscGhhIC8gMTA7Ci0JCQkJYWxwaGFzW2N1cnJlbnRTZWxlY3Rpb24gLSAxXSA9IGFscGhhOwotCQkJfQotCQl9KTsKLQkJb2JqZWN0Q29tYm8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBvYmplY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICsgMTsKLQkJCQl0cmFuc3BhcmVuY3lTbGlkZXIuc2V0U2VsZWN0aW9uKAotCQkJCQkoaW50KSAoKDEuMGYgLSBhbHBoYXNbY3VycmVudFNlbGVjdGlvbiAtIDFdKSAqIDEwKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2Rpc3Bvc2UoKQotCSAqLwotCXZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlHTFUuZ2x1RGVsZXRlUXVhZHJpYyhxdWFkcmF0aWMpOwotCQlHTC5nbERlbGV0ZUxpc3RzKElOREVYX0RJU0ssIDEpOwotCQlHTC5nbERlbGV0ZUxpc3RzKElOREVYX1NQSEVSRSwgMSk7Ci0JCUdMLmdsRGVsZXRlTGlzdHMoSU5ERVhfVFJJQU5HTEUsIDEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT3BlbkdMVGFiI2dldFRhYlRleHQoKQotCSAqLwotCVN0cmluZyBnZXRUYWJUZXh0KCkgewotCQlyZXR1cm4gIlRyYW5zcGFyZW5jeSI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjaW5pdCgpCi0JICovCi0Jdm9pZCBpbml0KCkgewotCQlHTC5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMLmdsQmxlbmRGdW5jKEdMLkdMX1NSQ19BTFBIQSwgR0wuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0JCXF1YWRyYXRpYyA9IEdMVS5nbHVOZXdRdWFkcmljKCk7Ci0JCUdMVS5nbHVRdWFkcmljTm9ybWFscyhxdWFkcmF0aWMsIEdMVS5HTFVfU01PT1RIKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfQ1VMTF9GQUNFKTsKLQkJR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0JCUdMLmdsRW5hYmxlKEdMLkdMX0JMRU5EKTsKLQkJLy8gY3JlYXRlIGRpc3BsYXkgbGlzdHMJCQotCQlHTC5nbE5ld0xpc3QoSU5ERVhfU1BIRVJFLCBHTC5HTF9DT01QSUxFKTsKLQkJR0xVLmdsdVF1YWRyaWNEcmF3U3R5bGUocXVhZHJhdGljLCBHTFUuR0xVX0ZJTEwpOwotCQlHTFUuZ2x1U3BoZXJlKHF1YWRyYXRpYywgMS41LCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJR0wuZ2xOZXdMaXN0KElOREVYX0RJU0ssIEdMLkdMX0NPTVBJTEUpOwotCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfRklMTCk7Ci0JCUdMVS5nbHVEaXNrKHF1YWRyYXRpYywgMS4wLCAzLCAzMiwgMzIpOwotCQlHTC5nbEVuZExpc3QoKTsKLQkJR0wuZ2xOZXdMaXN0KElOREVYX1RSSUFOR0xFLCBHTC5HTF9DT01QSUxFKTsKLQkJR0wuZ2xCZWdpbihHTC5HTF9UUklBTkdMRVMpOwotCQlHTC5nbFZlcnRleDNmKDAuMGYsIDIuMGYsIDAuMGYpOwotCQlHTC5nbFZlcnRleDNmKC0yLjBmLCAtMi4wZiwgMi4wZik7Ci0JCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDIuMGYpOwotCQlHTC5nbEVuZCgpOwotCQlHTC5nbEVuZExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlbGVjdGlvblRhYi5wcm9jZXNzUGljayAoaW50W10sIGludCkKLQkgKi8KLQl2b2lkIHByb2Nlc3NQaWNrKGludFtdIHBTZWxlY3RCdWZmLCBpbnQgaGl0cykgewotCQlpbnQgekRlcHRoOwotCQlpbnQgdGVtcFNlbGVjdGlvbiA9IHBTZWxlY3RCdWZmWzNdOwotCQl6RGVwdGggPSBwU2VsZWN0QnVmZlsyXTsKLQkJLy8gcGljayBvYmplY3Qgd2l0aCBsYXJnZXN0IHogdmFsdWUKLQkJZm9yIChpbnQgaSA9IDQ7IGkgPD0gNCAqIChoaXRzIC0gMSk7IGkgPSBpICsgNCkgewotCQkJaWYgKHpEZXB0aCA+IHBTZWxlY3RCdWZmW2kgKyAyXSkgewotCQkJCXpEZXB0aCA9IHBTZWxlY3RCdWZmW2kgKyAyXTsKLQkJCQl0ZW1wU2VsZWN0aW9uID0gcFNlbGVjdEJ1ZmZbaSArIDNdOwotCQkJfQotCQl9Ci0JCWlmICh0ZW1wU2VsZWN0aW9uID4gMCkgY3VycmVudFNlbGVjdGlvbiA9IHRlbXBTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPcGVuR0xUYWIjcmVuZGVyU2NlbmUoKQotCSAqLwotCXZvaWQgcmVuZGVyU2NlbmUoKSB7Ci0JCS8vIGRyYXcgaXRlbXMgd2l0aCB0cmFuc3BhcmVudCBxdWFsaXRpZXMgaW4gcmV2ZXJzZSBaIG9yZGVyCi0JCUdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQlHTC5nbExvYWRJZGVudGl0eSgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTE0LjBmKTsKLQkJR0wuZ2xQdXNoTmFtZSgwKTsKLQotCQkvLyBkcmF3IGRpc2sKLQkJR0wuZ2xQdXNoTWF0cml4KCk7Ci0JCUdMLmdsVHJhbnNsYXRlZigtMS4wZiwgMC4wZiwgMS4wZik7Ci0JCUdMLmdsQ29sb3I0ZigwLjBmLCAxLjBmLCAwLjBmLCBhbHBoYXNbMl0pOwotCQlHTC5nbExvYWROYW1lKElOREVYX0RJU0spOwotCQlHTC5nbENhbGxMaXN0KElOREVYX0RJU0spOwotCQlpZiAoY3VycmVudFNlbGVjdGlvbiA9PSBJTkRFWF9ESVNLKSB7Ci0JCQlHTC5nbENvbG9yM2YoMS4wZiwgMC4wZiwgMC4wZik7Ci0JCQlHTFUuZ2x1UXVhZHJpY0RyYXdTdHlsZShxdWFkcmF0aWMsIEdMVS5HTFVfTElORSk7Ci0JCQlHTFUuZ2x1RGlzayhxdWFkcmF0aWMsIDAuOTgsIDMuMDIsIDMyLCAzMik7Ci0JCX0KLQkJR0wuZ2xQb3BNYXRyaXgoKTsKLQotCQkvLyBkcmF3IHRyaWFuZ2xlCi0JCUdMLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCArMy4wZik7Ci0JCUdMLmdsTG9hZE5hbWUoSU5ERVhfVFJJQU5HTEUpOwotCQlHTC5nbENvbG9yNGYoMS4wZiwgMC4wZiwgMC4wZiwgYWxwaGFzWzBdKTsKLQkJR0wuZ2xDYWxsTGlzdChJTkRFWF9UUklBTkdMRSk7Ci0JCUdMLmdsUG9pbnRTaXplKDUuMGYpOwotCQlpZiAoY3VycmVudFNlbGVjdGlvbiA9PSBJTkRFWF9UUklBTkdMRSkgewotCQkJR0wuZ2xCZWdpbihHTC5HTF9QT0lOVFMpOwotCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJR0wuZ2xWZXJ0ZXgzZigwLjBmLCAyLjBmLCAwLjBmKTsKLQkJCUdMLmdsVmVydGV4M2YoLTIuMGYsIC0yLjBmLCAyLjBmKTsKLQkJCUdMLmdsVmVydGV4M2YoMi4wZiwgLTIuMGYsIDIuMGYpOwotCQkJR0wuZ2xFbmQoKTsKLQkJfQotCi0JCS8vIGRyYXcgc3BoZXJlCi0JCUdMLmdsUHVzaE1hdHJpeCgpOwotCQlHTC5nbFRyYW5zbGF0ZWYoMS4wZiwgMC4wZiwgKzMuMGYpOwotCQlHTC5nbENvbG9yNGYoMC4wZiwgMC4wZiwgMS4wZiwgYWxwaGFzWzFdKTsKLQkJR0wuZ2xMb2FkTmFtZShJTkRFWF9TUEhFUkUpOwotCQlHTC5nbENhbGxMaXN0KElOREVYX1NQSEVSRSk7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uID09IElOREVYX1NQSEVSRSkgewotCQkJR0wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQkJR0xVLmdsdVF1YWRyaWNEcmF3U3R5bGUocXVhZHJhdGljLCBHTFUuR0xVX0xJTkUpOwotCQkJR0xVLmdsdVNwaGVyZShxdWFkcmF0aWMsIDEuNTEsIDgsIDgpOwotCQl9Ci0JCUdMLmdsUG9wTWF0cml4KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvQmFsbC5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5MGQyNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9CYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9Cb3guYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWVmNjYzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL0JveC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy9GbG9vci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MzRjOWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvRmxvb3IuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3NwbGFzaC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzc1ZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2Uvc3d0L29wZW5nbC9leGFtcGxlcy9pbWFnZXMvc3BsYXNoLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZyBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3N3dC9vcGVuZ2wvZXhhbXBsZXMvaW1hZ2VzL3VudGl0bGVkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkNmFhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Qub3BlbmdsLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvb3BlbmdsL2V4YW1wbGVzL2ltYWdlcy91bnRpdGxlZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmNsYXNzcGF0aCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzLy5jdnNpZ25vcmUgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1Y2UxNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3Quc25pcHBldHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL2Fib3V0Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yjk2Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL2J1aWxkLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhYWE5My4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS5zd3RzbmlwcGV0cy5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTAyMTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IFNXVCBTbmlwcGV0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9wbHVnaW4ueG1sIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3M2Q1YTYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cyIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMy4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIgZXhwb3J0PSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmEwYjFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogSGVsbG8gV29ybGQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4YzkwZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogRHJhd2luZyB3aXRoIHRyYW5zZm9ybWF0aW9ucywgcGF0aHMgYW5kIGFscGhhIGJsZW5kaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiQWR2YW5jZWQgR3JhcGhpY3MiKTsKLQkJRm9udERhdGEgZmQgPSBzaGVsbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJZmluYWwgRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCA2MCwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQkJZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgNjQwLCA0ODApOwotCQlmaW5hbCBSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxPdmFsKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7CQkJCQotCQkJCVRyYW5zZm9ybSB0ciA9IG5ldyBUcmFuc2Zvcm0oZGlzcGxheSk7Ci0JCQkJdHIudHJhbnNsYXRlKDUwLCAxMjApOwotCQkJCXRyLnJvdGF0ZSgtMzApOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIDAsIDAsIHJlY3Qud2lkdGggLyAyLCByZWN0LmhlaWdodCAvIDIpOwotCQkJCWdjLnNldEFscGhhKDEwMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyKTsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJCQlwYXRoLmFkZFN0cmluZygiU1dUIiwgMCwgMCwgZm9udCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJCWdjLmRyYXdQYXRoKHBhdGgpOwotCQkJCXRyLmRpc3Bvc2UoKTsKLQkJCQlwYXRoLmRpc3Bvc2UoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUocmVjdC53aWR0aCAvIDIsIHJlY3QuaGVpZ2h0IC8gMikpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmZjgwYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9udCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxhcmdlIGZvbnQgZm9yIHVzZSBieSBhIHRleHQgd2lkZ2V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkpOwotCXRleHQuc2V0Qm91bmRzKDEwLCAxMCwgMTUwLCAxNTApOwotCUZvbnQgaW5pdGlhbEZvbnQgPSB0ZXh0LmdldEZvbnQoKTsKLQlGb250RGF0YVtdIGZvbnREYXRhID0gaW5pdGlhbEZvbnQuZ2V0Rm9udERhdGEoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGZvbnREYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWZvbnREYXRhW2ldLnNldEhlaWdodCgyNCk7Ci0JfQotCUZvbnQgbmV3Rm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZvbnREYXRhKTsKLQl0ZXh0LnNldEZvbnQobmV3Rm9udCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JbmV3Rm9udC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGU5NzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgaXRlbSAoYXQgYW4gaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTAxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JdGFibGUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FLCAxKTsKLQlpdGVtLnNldFRleHQgKCIqKiogTmV3IEl0ZW0gIiArIHRhYmxlLmluZGV4T2YgKGl0ZW0pICsgIiAqKioiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDU2YjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBpbnNlcnQgYSB0cmVlIGl0ZW0gKGF0IGFuIGluZGV4KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRyZWUuc2V0U2l6ZSAoMjAwLCAyMDApOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FLCAxKTsKLQlUcmVlSXRlbSBbXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMgKCk7Ci0JaW50IGluZGV4ID0gMDsKLQl3aGlsZSAoaW5kZXggPCBpdGVtcy5sZW5ndGggJiYgaXRlbXMgW2luZGV4XSAhPSBpdGVtKSBpbmRleCsrOwotCWl0ZW0uc2V0VGV4dCAoIioqKiBOZXcgSXRlbSAiICsgaW5kZXggKyAiICoqKiIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjczZmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIHRhYmxlIGl0ZW0gdGV4dAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwMyB7Ci0KLXN0YXRpYyBjaGFyIGNvbnRlbnQgPSAnYSc7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDI0MCk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5OT05FKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxNjAsIDE2MCk7Ci0KLQlmaW5hbCBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bNF07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSkuc2V0V2lkdGgoNDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJcG9wdWxhdGVJdGVtKGl0ZW1zW2ldKTsKLQl9Ci0KLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGFuZ2UiKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRMb2NhdGlvbigxMCwgMTgwKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwb3B1bGF0ZUl0ZW0oaXRlbXNbaV0pOwotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBwb3B1bGF0ZUl0ZW0oVGFibGVJdGVtIGl0ZW0pIHsKLQlTdHJpbmcgc3RyaW5nQ29udGVudCA9IFN0cmluZy52YWx1ZU9mKGNvbnRlbnQpOwotCWl0ZW0uc2V0VGV4dCgKLQkJbmV3IFN0cmluZ1tdIHsKLQkJCXN0cmluZ0NvbnRlbnQsCi0JCQlzdHJpbmdDb250ZW50LAotCQkJc3RyaW5nQ29udGVudCwKLQkJCXN0cmluZ0NvbnRlbnQgfSk7Ci0JY29udGVudCsrOwotCWlmIChjb250ZW50ID4gJ3onKSBjb250ZW50ID0gJ2EnOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDM4ZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNwbGFzaCBzY3JlZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgaW50IFtdIGNvdW50ID0gbmV3IGludCBbXSB7NH07Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzAwLCAzMDApOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0NZQU4pKTsKLQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQlnYy5kcmF3VGV4dCgiU3BsYXNoIFNjcmVlbiIsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNwbGFzaCA9IG5ldyBTaGVsbChTV1QuT05fVE9QKTsKLQlmaW5hbCBQcm9ncmVzc0JhciBiYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc3BsYXNoLCBTV1QuTk9ORSk7Ci0JYmFyLnNldE1heGltdW0oY291bnRbMF0pOwotCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHNwbGFzaCwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGltYWdlKTsKLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0Jc3BsYXNoLnNldExheW91dChsYXlvdXQpOwotCUZvcm1EYXRhIGxhYmVsRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsYWJlbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGxhYmVsRGF0YSk7Ci0JRm9ybURhdGEgcHJvZ3Jlc3NEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCXByb2dyZXNzRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCA1KTsKLQlwcm9ncmVzc0RhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCXByb2dyZXNzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgLTUpOwotCWJhci5zZXRMYXlvdXREYXRhKHByb2dyZXNzRGF0YSk7Ci0Jc3BsYXNoLnBhY2soKTsKLQlSZWN0YW5nbGUgc3BsYXNoUmVjdCA9IHNwbGFzaC5nZXRCb3VuZHMoKTsKLQlSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCWludCB4ID0gKGRpc3BsYXlSZWN0LndpZHRoIC0gc3BsYXNoUmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gKGRpc3BsYXlSZWN0LmhlaWdodCAtIHNwbGFzaFJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc3BsYXNoLnNldExvY2F0aW9uKHgsIHkpOwotCXNwbGFzaC5vcGVuKCk7Ci0JZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTaGVsbCBbXSBzaGVsbHMgPSBuZXcgU2hlbGxbY291bnRbMF1dOwotCQkJZm9yIChpbnQgaT0wOyBpPGNvdW50WzBdOyBpKyspIHsKLQkJCQlzaGVsbHMgW2ldID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCXNoZWxscyBbaV0uc2V0U2l6ZSAoMzAwLCAzMDApOwotCQkJCXNoZWxscyBbaV0uYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCQktLWNvdW50WzBdOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYmFyLnNldFNlbGVjdGlvbihpKzEpOwotCQkJCXRyeSB7VGhyZWFkLnNsZWVwKDEwMDApO30gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQotCQkJfQotCQkJc3BsYXNoLmNsb3NlKCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y291bnRbMF07IGkrKykgewotCQkJCXNoZWxscyBbaV0ub3BlbigpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jd2hpbGUgKGNvdW50IFswXSAhPSAwKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyM2QzMjcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyYW0gZXhhbXBsZSBzbmlwcGV0OiBpbnZva2UgYW4gZXh0ZXJuYWwgYmF0Y2ggZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVByb2dyYW0ubGF1bmNoKCJjOlxcY3lnd2luXFxjeWd3aW4uYmF0Iik7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzNhY2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IGEgdGFibGUgY29sdW1uIChhdCBhbiBpbmRleCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKCJDb2x1bW4gIiArIGkpOwotCX0KLQlmaW5hbCBUYWJsZUNvbHVtbiBbXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucyAoKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgajxjb2x1bW5zLmxlbmd0aDsgaisrKSB7Ci0JCQlpdGVtLnNldFRleHQgKGosICJJdGVtICIgKyBpKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGk8Y29sdW1ucy5sZW5ndGg7IGkrKykgY29sdW1ucyBbaV0ucGFjayAoKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlmaW5hbCBpbnQgaW5kZXggPSAxOwotCWJ1dHRvbi5zZXRUZXh0ICgiSW5zZXJ0IENvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FLCBpbmRleCk7Ci0JCQljb2x1bW4uc2V0VGV4dCAoIkNvbHVtbiAiICsgaW5kZXggKyAiYSIpOwotCQkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpdGVtcyBbaV0uc2V0VGV4dCAoaW5kZXgsICJJdGVtICIgKyBpICsgImEiKTsKLQkJCX0KLQkJCWNvbHVtbi5wYWNrICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMzY5OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyoKLSAqIFNhc2ggZXhhbXBsZSBzbmlwcGV0OiBpbXBsZW1lbnQgYSBzaW1wbGUgc3BsaXR0ZXIgKHdpdGggYSAyMCBwaXhlbCBsaW1pdCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTA3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoIChzaGVsbCwgU1dULlZFUlRJQ0FMKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0ICgiQnV0dG9uIDIiKTsKLQkKLQlmaW5hbCBGb3JtTGF5b3V0IGZvcm0gPSBuZXcgRm9ybUxheW91dCAoKTsKLQlzaGVsbC5zZXRMYXlvdXQgKGZvcm0pOwotCQotCUZvcm1EYXRhIGJ1dHRvbjFEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCWJ1dHRvbjFEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50IChzYXNoLCAwKTsKLQlidXR0b24xRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIDApOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQotCWZpbmFsIGludCBsaW1pdCA9IDIwLCBwZXJjZW50ID0gNTA7Ci0JZmluYWwgRm9ybURhdGEgc2FzaERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0Jc2FzaERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAocGVyY2VudCwgMCk7Ci0Jc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlzYXNoRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0Jc2FzaC5zZXRMYXlvdXREYXRhIChzYXNoRGF0YSk7Ci0Jc2FzaC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBzYXNoUmVjdCA9IHNhc2guZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIHNoZWxsUmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlpbnQgcmlnaHQgPSBzaGVsbFJlY3Qud2lkdGggLSBzYXNoUmVjdC53aWR0aCAtIGxpbWl0OwotCQkJZS54ID0gTWF0aC5tYXggKE1hdGgubWluIChlLngsIHJpZ2h0KSwgbGltaXQpOwotCQkJaWYgKGUueCAhPSBzYXNoUmVjdC54KSAgewotCQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDAsIGUueCk7Ci0JCQkJc2hlbGwubGF5b3V0ICgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMkRhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMkRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoc2FzaCwgMCk7Ci0JYnV0dG9uMkRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMkRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdmYTNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCdXR0b24gZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMDggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCAoIkVudGVyIHlvdXIgbmFtZToiKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDEwMCwgU1dULkRFRkFVTFQpKTsKLQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCW9rLnNldFRleHQgKCJPSyIpOwotCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIik7Ci0JCX0KLQl9KTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQljYW5jZWwuc2V0VGV4dCAoIkNhbmNlbCIpOwotCWNhbmNlbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5jZWwiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGNhbmNlbCk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMjViYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNhc2hGb3JtIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCBmb3JtIHdpdGggdGhyZWUgY2hpbGRyZW4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEwOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlTYXNoRm9ybSBmb3JtID0gbmV3IFNhc2hGb3JtKHNoZWxsLFNXVC5IT1JJWk9OVEFMKTsKLQlmb3JtLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlDb21wb3NpdGUgY2hpbGQxID0gbmV3IENvbXBvc2l0ZShmb3JtLFNXVC5OT05FKTsKLQljaGlsZDEuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCW5ldyBMYWJlbChjaGlsZDEsU1dULk5PTkUpLnNldFRleHQoIkxhYmVsIGluIHBhbmUgMSIpOwotCQotCUNvbXBvc2l0ZSBjaGlsZDIgPSBuZXcgQ29tcG9zaXRlKGZvcm0sU1dULk5PTkUpOwotCWNoaWxkMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IEJ1dHRvbihjaGlsZDIsU1dULlBVU0gpLnNldFRleHQoIkJ1dHRvbiBpbiBwYW5lMiIpOwotCi0JQ29tcG9zaXRlIGNoaWxkMyA9IG5ldyBDb21wb3NpdGUoZm9ybSxTV1QuTk9ORSk7Ci0JY2hpbGQzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQluZXcgTGFiZWwoY2hpbGQzLFNXVC5QVVNIKS5zZXRUZXh0KCJMYWJlbCBpbiBwYW5lMyIpOwotCQotCWZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezMwLDQwLDMwfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NDgwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgc2VsZWN0aW9uIChpLWJlYW0pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0ZXh0LnNldEJvdW5kcyAoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDE2OyBpKyspIHsKLQkJdGV4dC5hcHBlbmQgKCJMaW5lICIgKyBpICsgIlxuIik7Ci0JfQotCXNoZWxsLm9wZW4gKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24gKDMwKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmRhMGMzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgYSB0YWJsZSBjZWxsIGZyb20gbW91c2UgZG93biAod29ya3MgZm9yIGFueSB0YWJsZSBzdHlsZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlICh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZpbmFsIGludCByb3dDb3VudCA9IDY0LCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0ICgiQ29sdW1uICIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpIDwgcm93Q291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGo9MDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dCAoaiwgIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJfQotCX0KLQlmb3IgKGludCBpPTA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9Ci0JUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgMjAwKTsKLQl0YWJsZS5zZXRTaXplIChzaXplKTsKLQlzaGVsbC5wYWNrICgpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gdGFibGUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCWludCBpbmRleCA9IHRhYmxlLmdldFRvcEluZGV4ICgpOwotCQkJd2hpbGUgKGluZGV4IDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChpbmRleCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiSXRlbSAiICsgaW5kZXggKyAiLSIgKyBpKTsKLQkJCQkJfQotCQkJCQlpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzIChjbGllbnRBcmVhKSkgewotCQkJCQkJdmlzaWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF2aXNpYmxlKSByZXR1cm47Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdlNTk2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0cmVlIGl0ZW0gKGluIHBsYWNlLCBmYW5jeSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtSSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtSS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajwxNjsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtSiA9IG5ldyBUcmVlSXRlbSAoaXRlbUksIFNXVC5OT05FKTsKLQkJCWl0ZW1KLnNldFRleHQgKCJJdGVtICIgKyBqKTsKLQkJfQotCX0KLQlmaW5hbCBUcmVlSXRlbSBbXSBsYXN0SXRlbSA9IG5ldyBUcmVlSXRlbSBbMV07Ci0JZmluYWwgVHJlZUVkaXRvciBlZGl0b3IgPSBuZXcgVHJlZUVkaXRvciAodHJlZSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtID09IGxhc3RJdGVtIFswXSkgewotCQkJCWJvb2xlYW4gaXNDYXJib24gPSBTV1QuZ2V0UGxhdGZvcm0gKCkuZXF1YWxzICgiY2FyYm9uIik7Ci0JCQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpZiAoIWlzQ2FyYm9uKSBjb21wb3NpdGUuc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0IChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlmaW5hbCBpbnQgaW5zZXQgPSBpc0NhcmJvbiA/IDAgOiAxOwotCQkJCWNvbXBvc2l0ZS5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEgKCk7Ci0JCQkJCQl0ZXh0LnNldEJvdW5kcyAocmVjdC54ICsgaW5zZXQsIHJlY3QueSArIGluc2V0LCByZWN0LndpZHRoIC0gaW5zZXQgKiAyLCByZWN0LmhlaWdodCAtIGluc2V0ICogMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZSkgewotCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQljYXNlIFNXVC5Gb2N1c091dDoKLQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQljb21wb3NpdGUuZGlzcG9zZSAoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBTV1QuVmVyaWZ5OgotCQkJCQkJCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQuZ2V0VGV4dCAoKTsKLQkJCQkJCQkJU3RyaW5nIGxlZnRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKDAsIGUuc3RhcnQpOwotCQkJCQkJCQlTdHJpbmcgcmlnaHRUZXh0ID0gbmV3VGV4dC5zdWJzdHJpbmcgKGUuZW5kLCBuZXdUZXh0Lmxlbmd0aCAoKSk7Ci0JCQkJCQkJCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQkJCQkJCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQgKGxlZnRUZXh0ICsgZS50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQkJCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCQkJCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUgKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCQkJCQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQkJCQkJCQlSZWN0YW5nbGUgaXRlbVJlY3QgPSBpdGVtLmdldEJvdW5kcyAoKSwgcmVjdCA9IHRyZWUuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IE1hdGgubWF4IChzaXplLngsIGl0ZW1SZWN0LndpZHRoKSArIGluc2V0ICogMjsKLQkJCQkJCQkJaW50IGxlZnQgPSBpdGVtUmVjdC54LCByaWdodCA9IHJlY3QueCArIHJlY3Qud2lkdGg7Ci0JCQkJCQkJCWVkaXRvci5taW5pbXVtV2lkdGggPSBNYXRoLm1pbiAoZWRpdG9yLm1pbmltdW1XaWR0aCwgcmlnaHQgLSBsZWZ0KTsKLQkJCQkJCQkJZWRpdG9yLm1pbmltdW1IZWlnaHQgPSBzaXplLnkgKyBpbnNldCAqIDI7Ci0JCQkJCQkJCWVkaXRvci5sYXlvdXQgKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQkJCQkJaXRlbS5zZXRUZXh0ICh0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJY29tcG9zaXRlLmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgdGV4dExpc3RlbmVyKTsKLQkJCQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIHRleHRMaXN0ZW5lcik7Ci0JCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlZlcmlmeSwgdGV4dExpc3RlbmVyKTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChjb21wb3NpdGUsIGl0ZW0pOwotCQkJCXRleHQuc2V0VGV4dCAoaXRlbS5nZXRUZXh0ICgpKTsKLQkJCQl0ZXh0LnNlbGVjdEFsbCAoKTsKLQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJfQotCQkJbGFzdEl0ZW0gWzBdID0gaXRlbTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTMyYTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEltYWdlIGV4YW1wbGUgc25pcHBldDogZGlzcGxheSBhbiBpbWFnZSBpbiBhIGdyb3VwCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMjAsIDIwKTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlHcm91cCBncm91cCA9IG5ldyBHcm91cCAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlncm91cC5zZXRUZXh0ICgiYSBzcXVhcmUiKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoZ3JvdXAsIFNXVC5OT05FKTsKLQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lciAobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2wgKFBhaW50RXZlbnQgZSkgewotCQkJZS5nYy5kcmF3SW1hZ2UgKGltYWdlLCAwLCAwKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKQotCQkJZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEzNGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBhIHNlbGVjdGlvbiBvciBjaGVjayBldmVudCBpbiBhIHRhYmxlIChTV1QuQ0hFQ0spCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTEzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkNIRUNLIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLID8gIkNoZWNrZWQiIDogIlNlbGVjdGVkIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoZXZlbnQuaXRlbSArICIgIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzZmYzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc2VsZWN0aW9uIG9yIGNoZWNrIGV2ZW50IGluIGEgdHJlZSAoU1dULkNIRUNLKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRyZWUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGV2ZW50LmRldGFpbCA9PSBTV1QuQ0hFQ0sgPyAiQ2hlY2tlZCIgOiAiU2VsZWN0ZWQiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChldmVudC5pdGVtICsgIiAiICsgc3RyaW5nKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMjI0NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogZm9yY2UgcmFkaW8gYmVoYXZpb3Igb24gdHdvIGRpZmZlcmVudCBjb21wb3NpdGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKFNXVC5WRVJUSUNBTCkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk5PX1JBRElPX0dST1VQKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCWZpbmFsIENvbXBvc2l0ZSBbXSBjb21wb3NpdGVzID0gbmV3IENvbXBvc2l0ZSBbXSB7YzEsIGMyfTsKLQlMaXN0ZW5lciByYWRpb0dyb3VwID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y29tcG9zaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjb21wb3NpdGVzIFtpXTsKLQkJCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOwotCQkJCWZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2pdOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdXR0b24pIHsKLQkJCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjaGlsZDsKLQkJCQkJCWlmICgoYnV0dG9uLmdldFN0eWxlICgpICYgU1dULlJBRElPKSAhPSAwKSBidXR0b24uc2V0U2VsZWN0aW9uIChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCQkJYnV0dG9uLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgaSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUkFESU8pOwotCQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiAiICsgKGkgKyA0KSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgcmFkaW9Hcm91cCk7Ci0JfQotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTVlZjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzdG9wIENSIGZyb20gZ29pbmcgdG8gdGhlIGRlZmF1bHQgYnV0dG9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTYgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JdGV4dC5zZXRUZXh0KCJIZXJlIGlzIHNvbWUgdGV4dCIpOwotCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRleHQgZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1JFVFVSTikgewotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCWUuZGV0YWlsID0gU1dULlRSQVZFUlNFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJPayIpOwotCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdXR0b24gc2VsZWN0ZWQiKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNmU5ODguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBhZGQgYSBzZWxlY3QgYWxsIG1lbnUgaXRlbSB0byB0aGUgY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMTcgIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0gICAgdC5zZXRUZXh0ICgiaGVyZSBpcyBzb21lIHRleHQgdG8gYmUgc2VsZWN0ZWQiKTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhciAoYmFyKTsKLQlNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbSAoYmFyLCBTV1QuQ0FTQ0FERSk7Ci0JZWRpdEl0ZW0uc2V0VGV4dCAoIkVkaXQiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWVkaXRJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCi0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAoc3VibWVudSwgU1dULlBVU0gpOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQl0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQkKLQkvLyBOb3RlIHRoYXQgYXMgbG9uZyBhcyB5b3VyIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3ZlcnJpZGRlbiAKLQkvLyB0aGUgZ2xvYmFsIGFjY2VsZXJhdG9ycyBmb3IgY29weSwgcGFzdGUsIGFuZCBjdXQgCi0JLy8oQ1RSTCtDIG9yIENUUkwrSU5TRVJULCBDVFJMK1Ygb3IgU0hJRlQrSU5TRVJULCBhbmQgQ1RSTCtYIG9yIFNISUZUK0RFTEVURSkKLQkvLyB0aGVzZSBiZWhhdmlvdXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBieSBkZWZhdWx0LgotCS8vIElmIHlvdXIgYXBwbGljYXRpb24gb3ZlcnJpZGVzIHRoZXNlIGFjY2VsZXJhdG9ycywKLQkvLyB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgVGV4dC5jb3B5KCksIFRleHQucGFzdGUoKSBhbmQgVGV4dC5jdXQoKQotCS8vIGZyb20gdGhlIFNlbGVjdGlvbiBjYWxsYmFjayBmb3IgdGhlIGFjY2VsZXJhdG9yIHdoZW4gdGhlIAotCS8vIHRleHQgd2lkZ2V0IGhhcyBmb2N1cy4KLQotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY1MGM4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYW4gaW1hZ2UgZmlsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTE4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQlmaW5hbCBDdXJzb3JbXSBjdXJzb3IgPSBuZXcgQ3Vyc29yWzFdOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNoYW5nZSBjdXJzb3IiKTsKLQlQb2ludCBzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYnV0dG9uLnNldFNpemUoc2l6ZSk7Ci0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmljbyIsICIqLmdpZiIsICIqLioifSk7Ci0JCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSByZXR1cm47Ci0JCQlJbWFnZURhdGEgaW1hZ2UgPSBuZXcgSW1hZ2VEYXRhKG5hbWUpOwotCQkJQ3Vyc29yIG9sZEN1cnNvciA9IGN1cnNvclswXTsKLQkJCWN1cnNvclswXSA9IG5ldyBDdXJzb3IoZGlzcGxheSwgaW1hZ2UsIDAsIDApOwotCQkJc2hlbGwuc2V0Q3Vyc29yKGN1cnNvclswXSk7Ci0JCQlpZiAob2xkQ3Vyc29yICE9IG51bGwpIG9sZEN1cnNvci5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZiAoY3Vyc29yWzBdICE9IG51bGwpIGN1cnNvclswXS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTE5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjc5MzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDExOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ3Vyc29yIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29sb3IgY3Vyc29yIGZyb20gYSBzb3VyY2UgYW5kIGEgbWFzawotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDExOSB7Ci0KLXN0YXRpYyBieXRlW10gc3JjRGF0YSA9IHsKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsIAotCShieXRlKTB4MTEsIChieXRlKTB4MDAsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MDAsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwMiwgKGJ5dGUpMHgyMiwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHgzMywgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDIyLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDMzLCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4MjIsIChieXRlKTB4MjIsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MzMsIChieXRlKTB4MzMsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDAxLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDExLCAoYnl0ZSkweDEwLAotCShieXRlKTB4MDEsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MTEsIChieXRlKTB4MTEsIChieXRlKTB4MTAsCi0JKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwKLQkoYnl0ZSkweDEwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAxLAotCShieXRlKTB4MTAsIChieXRlKTB4NDQsIChieXRlKTB4NDQsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4NTUsIChieXRlKTB4NTUsIChieXRlKTB4MDEsCi0JKGJ5dGUpMHgxMCwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgxMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHg1MCwgKGJ5dGUpMHgwMSwKLQkoYnl0ZSkweDExLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQ0LCAoYnl0ZSkweDAxLCAoYnl0ZSkweDEwLCAoYnl0ZSkweDU1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLAotCShieXRlKTB4MTEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTAsIChieXRlKTB4MDAsIChieXRlKTB4MDEsIChieXRlKTB4MTEsCi0JKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwKLX07Ci0KLXN0YXRpYyBieXRlW10gbXNrRGF0YSA9IHsKLQkoYnl0ZSkweDAzLCAoYnl0ZSkweGMwLCAKLQkoYnl0ZSkweDFmLCAoYnl0ZSkweGY4LAotCShieXRlKTB4M2YsIChieXRlKTB4ZmMsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweGZlLCAoYnl0ZSkweDdmLAotCShieXRlKTB4ZmUsIChieXRlKTB4N2YsCi0JKGJ5dGUpMHhmZiwgKGJ5dGUpMHhmZiwKLQkoYnl0ZSkweDdmLCAoYnl0ZSkweGZlLAotCShieXRlKTB4N2YsIChieXRlKTB4ZmUsCi0JKGJ5dGUpMHg3ZiwgKGJ5dGUpMHhmZSwKLQkoYnl0ZSkweDNmLCAoYnl0ZSkweGZjLAotCShieXRlKTB4MWYsIChieXRlKTB4ZjgsCi0JKGJ5dGUpMHgwMywgKGJ5dGUpMHhjMAotfTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCUNvbG9yIHllbGxvdyA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9ZRUxMT1cpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGdyZWVuID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vQ3JlYXRlIGEgc291cmNlIEltYWdlRGF0YSBvZiBkZXB0aCA0Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YSAobmV3IFJHQltdIHsKLQkJYmxhY2suZ2V0UkdCKCksIHdoaXRlLmdldFJHQigpLCB5ZWxsb3cuZ2V0UkdCKCksIAotCQlyZWQuZ2V0UkdCKCksIGJsdWUuZ2V0UkdCKCksIGdyZWVuLmdldFJHQigpfSk7Ci0JSW1hZ2VEYXRhIHNvdXJjZURhdGEgPSBuZXcgSW1hZ2VEYXRhICgxNiwgMTYsIDQsIHBhbGV0dGUsIDEsIHNyY0RhdGEpOwotCQotCS8vQ3JlYXRlIGEgbWFzayBJbWFnZURhdGEgb2YgZGVwdGggMSAobW9ub2Nocm9tZSkKLQlwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHtibGFjay5nZXRSR0IoKSwgd2hpdGUuZ2V0UkdCKCksfSk7Ci0JSW1hZ2VEYXRhIG1hc2tEYXRhID0gbmV3IEltYWdlRGF0YSAoMTYsIDE2LCAxLCBwYWxldHRlLCAxLCBtc2tEYXRhKTsKLQotCS8vU2V0IG1hc2sKLQlzb3VyY2VEYXRhLm1hc2tEYXRhID0gbWFza0RhdGEuZGF0YTsKLQlzb3VyY2VEYXRhLm1hc2tQYWQgPSBtYXNrRGF0YS5zY2FubGluZVBhZDsKLQotCS8vQ3JlYXRlIGN1cnNvcgotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIHNvdXJjZURhdGEsIDEwLCAxMCk7Ci0KLQkvL1JlbW92ZSBtYXNrIHRvIGRyYXcgdGhlbSBzZXBhcmF0ZWx5IGp1c3QgdG8gc2hvdyB3aGF0IHRoZXkgbG9vayBsaWtlCi0Jc291cmNlRGF0YS5tYXNrRGF0YSA9IG51bGw7Ci0Jc291cmNlRGF0YS5tYXNrUGFkID0gLTE7Ci0KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBJbWFnZSBzb3VyY2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksc291cmNlRGF0YSk7Ci0JZmluYWwgSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWludCB4ID0gMTAsIHkgPSAxMDsKLQkJCVN0cmluZyBzdHJpbmdTb3VyY2UgPSAic291cmNlOiAiOwotCQkJU3RyaW5nIHN0cmluZ01hc2sgPSAibWFzazogIjsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nU291cmNlLCB4LCB5KTsKLQkJCWdjLmRyYXdTdHJpbmcoc3RyaW5nTWFzaywgeCwgeSArIDMwKTsKLQkJCXggKz0gTWF0aC5tYXgoZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ1NvdXJjZSkueCwgZ2Muc3RyaW5nRXh0ZW50KHN0cmluZ01hc2spLngpOwotCQkJZ2MuZHJhd0ltYWdlKHNvdXJjZSwgeCwgeSk7Ci0JCQlnYy5kcmF3SW1hZ2UobWFzaywgeCwgeSArIDMwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCXNoZWxsLm9wZW4oKTsKLQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0Jc291cmNlLmRpc3Bvc2UoKTsKLQltYXNrLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2E5OTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHNlbGVjdGlvbiAoc3RhcnQsIGVuZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMTAwKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQl0ZXh0LmFwcGVuZCAoIkxpbmUgIiArIGkgKyAiXG4iKTsKLQl9Ci0Jc2hlbGwub3BlbiAoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbiAoMzAsIDM4KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJzZWxlY3Rpb249IiArIHRleHQuZ2V0U2VsZWN0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBwb3NpdGlvbj0iICsgdGV4dC5nZXRDYXJldFBvc2l0aW9uICgpKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYXJldCBsb2NhdGlvbj0iICsgdGV4dC5nZXRDYXJldExvY2F0aW9uICgpKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfSAKLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwNzBjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1vbml0b3IgZXhhbXBsZSBzbmlwcGV0OiBjZW50ZXIgYSBzaGVsbCBvbiB0aGUgcHJpbWFyeSBtb25pdG9yCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCU1vbml0b3IgcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IgKCk7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzICgpOwotCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Qm91bmRzICgpOwotCWludCB4ID0gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC0gcmVjdC53aWR0aCkgLyAyOwotCWludCB5ID0gYm91bmRzLnkgKyAoYm91bmRzLmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7Ci0Jc2hlbGwuc2V0TG9jYXRpb24gKHgsIHkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTZhMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBwcm9tcHQgZm9yIGEgcGFzc3dvcmQgKHNldCB0aGUgZWNobyBjaGFyYWN0ZXIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldEVjaG9DaGFyICgnKicpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmYmQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUvZGlzYWJsZSBtZW51IGRlcGVuZGluZyBvbiBjbGlwYm9hcmQgY29udGVudCBhdmFpbGFiaWxpdHkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyMiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBDbGlwYm9hcmQgY2IgPSBuZXcgQ2xpcGJvYXJkKGRpc3BsYXkpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULlBPUF9VUCk7Ci0JZmluYWwgTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWNvcHlJdGVtLnNldFRleHQoIkNvcHkiKTsKLQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLmxlbmd0aCgpID09IDApIHJldHVybjsKLQkJCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0W117c2VsZWN0aW9ufTsKLQkJCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCQkJY2Iuc2V0Q29udGVudHMoZGF0YSwgdHlwZXMpOwotCQl9Ci0JfSk7Ci0JZmluYWwgTWVudUl0ZW0gcGFzdGVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKLQlwYXN0ZUl0ZW0uc2V0VGV4dCAoIlBhc3RlIik7Ci0JcGFzdGVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKShjYi5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSkpOwotCQkJaWYgKHN0cmluZyAhPSBudWxsKSB0ZXh0Lmluc2VydChzdHJpbmcpOwotCQl9Ci0JfSk7Ci0JbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCS8vIGlzIGNvcHkgdmFsaWQ/Ci0JCQlTdHJpbmcgc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQljb3B5SXRlbS5zZXRFbmFibGVkKHNlbGVjdGlvbi5sZW5ndGgoKSA+IDApOwotCQkJLy8gaXMgcGFzdGUgdmFsaWQ/Ci0JCQlUcmFuc2ZlckRhdGFbXSBhdmFpbGFibGUgPSBjYi5nZXRBdmFpbGFibGVUeXBlcygpOwotCQkJYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYXZhaWxhYmxlW2ldKSkgewotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9KTsKLQl0ZXh0LnNldE1lbnUgKG1lbnUpOwotCi0Jc2hlbGwuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWU0NTllLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGdldCBldmVudHMgZnJvbSBJRSBjb250cm9sICh3aW4zMiBvbmx5KQotICogTk9URTogVGhpcyBzbmlwcGV0IHVzZXMgaW50ZXJuYWwgU1dUIHBhY2thZ2VzIHRoYXQgYXJlCi0gKiBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQlzaGVsbC5vcGVuKCk7Ci0JCi0JLy8gSVdlYkJyb3dzZXIKLQlmaW5hbCBPbGVBdXRvbWF0aW9uIHdlYkJyb3dzZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkvLyBXaGVuIGEgbmV3IGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZS4KLQlpbnQgRG93bmxvYWRDb21wbGV0ZSA9IDEwNDsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKERvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCWludFtdIGh0bWxEb2N1bWVudElEID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiRG9jdW1lbnQifSk7IAotCQkJaWYgKGh0bWxEb2N1bWVudElEID09IG51bGwpIHJldHVybjsKLQkJCVZhcmlhbnQgcFZhclJlc3VsdCA9IHdlYkJyb3dzZXIuZ2V0UHJvcGVydHkoaHRtbERvY3VtZW50SURbMF0pOwotCQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSAwKSByZXR1cm47Ci0JCQkvL0lIVE1MRG9jdW1lbnQyCi0JCQlPbGVBdXRvbWF0aW9uIGh0bWxEb2N1bWVudCA9IHBWYXJSZXN1bHQuZ2V0QXV0b21hdGlvbigpOwotCi0JCQkvLyBSZXF1ZXN0IHRvIGJlIG5vdGlmaWVkIG9mIGNsaWNrLCBkb3VibGUgY2xpY2sgYW5kIGtleSBkb3duIGV2ZW50cwotCQkJRXZlbnREaXNwYXRjaCBteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmNsaWNrKTsKLQkJCUlEaXNwYXRjaCBpZGlzcGF0Y2ggPSBuZXcgSURpc3BhdGNoKG15RGlzcGF0Y2guZ2V0QWRkcmVzcygpKTsKLQkJCVZhcmlhbnQgZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25jbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmRibGNsaWNrKTsKLQkJCWlkaXNwYXRjaCA9IG5ldyBJRGlzcGF0Y2gobXlEaXNwYXRjaC5nZXRBZGRyZXNzKCkpOwotCQkJZGlzcGF0Y2ggPSBuZXcgVmFyaWFudChpZGlzcGF0Y2gpOwotCQkJaHRtbERvY3VtZW50LnNldFByb3BlcnR5KEV2ZW50RGlzcGF0Y2gub25kYmxjbGljaywgZGlzcGF0Y2gpOwotCi0JCQlteURpc3BhdGNoID0gbmV3IEV2ZW50RGlzcGF0Y2goRXZlbnREaXNwYXRjaC5vbmtleWRvd24pOwotCQkJaWRpc3BhdGNoID0gbmV3IElEaXNwYXRjaChteURpc3BhdGNoLmdldEFkZHJlc3MoKSk7Ci0JCQlkaXNwYXRjaCA9IG5ldyBWYXJpYW50KGlkaXNwYXRjaCk7Ci0JCQlodG1sRG9jdW1lbnQuc2V0UHJvcGVydHkoRXZlbnREaXNwYXRjaC5vbmtleWRvd24sIGRpc3BhdGNoKTsKLQkJCQotCQkJLy9SZW1lbWJlciB0byByZWxlYXNlIE9sZUF1dG9tYXRpb24gT2JqZWN0Ci0JCQlodG1sRG9jdW1lbnQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0JCi0JLy8gTmF2aWdhdGUgdG8gYSB3ZWIgc2l0ZQotCWludFtdIGlkcyA9IHdlYkJyb3dzZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50W10ge25ldyBWYXJpYW50KCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKX07Ci0JaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50W117aWRzWzFdfTsKLQl3ZWJCcm93c2VyLmludm9rZShpZHNbMF0sIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQotLy8gRXZlbnREaXNwYXRjaCBpbXBsZW1lbnRzIGEgc2ltcGxlIElEaXNwYXRjaCBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBiZSBjYWxsZWQgCi0vLyB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC4KLWNsYXNzIEV2ZW50RGlzcGF0Y2ggewotCXByaXZhdGUgQ09NT2JqZWN0IGlEaXNwYXRjaDsKLQlwcml2YXRlIGludCByZWZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZXZlbnRJRDsKLQkKLQlmaW5hbCBzdGF0aWMgaW50IG9uaGVscCA9IDB4ODAwMTE3N2Q7Ci0JZmluYWwgc3RhdGljIGludCBvbmNsaWNrID0gMHg4MDAxMTc3ODsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZGJsY2xpY2sgPSAweDgwMDExNzc5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXl1cCA9IDB4ODAwMTE3NzY7Ci0JZmluYWwgc3RhdGljIGludCBvbmtleWRvd24gPSAweDgwMDExNzc1OwotCWZpbmFsIHN0YXRpYyBpbnQgb25rZXlwcmVzcyA9IDB4ODAwMTE3Nzc7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNldXAgPSAweDgwMDExNzczOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZWRvd24gPSAweDgwMDExNzcyOwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW1vdmUgPSAweDgwMDExNzc0OwotCWZpbmFsIHN0YXRpYyBpbnQgb25tb3VzZW91dCA9IDB4ODAwMTE3NzE7Ci0JZmluYWwgc3RhdGljIGludCBvbm1vdXNlb3ZlciA9IDB4ODAwMTE3NzA7Ci0JZmluYWwgc3RhdGljIGludCBvbnJlYWR5c3RhdGVjaGFuZ2UgPSAweDgwMDExNzg5OwotCWZpbmFsIHN0YXRpYyBpbnQgb25hZnRlcnVwZGF0ZSA9IDB4ODAwMTE3ODY7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2V4aXQ9IDB4ODAwMTE3ODI7Ci0JZmluYWwgc3RhdGljIGludCBvbnJvd2VudGVyID0gMHg4MDAxMTc4MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uZHJhZ3N0YXJ0ID0gMHg4MDAxMTc5MzsKLQlmaW5hbCBzdGF0aWMgaW50IG9uc2VsZWN0c3RhcnQgPSAweDgwMDExNzk1OwotCi0JRXZlbnREaXNwYXRjaChpbnQgZXZlbnRJRCkgewotCQl0aGlzLmV2ZW50SUQgPSBldmVudElEOwotCQljcmVhdGVDT01JbnRlcmZhY2VzKCk7Ci0JfQotCWludCBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gaURpc3BhdGNoLmdldEFkZHJlc3MoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNPTUludGVyZmFjZXMoKSB7Ci0JCWlEaXNwYXRjaCA9IG5ldyBDT01PYmplY3QobmV3IGludFtdezIsIDAsIDAsIDEsIDMsIDQsIDh9KXsKLQkJCXB1YmxpYyBpbnQgbWV0aG9kMChpbnRbXSBhcmdzKSB7cmV0dXJuIFF1ZXJ5SW50ZXJmYWNlKGFyZ3NbMF0sIGFyZ3NbMV0pO30KLQkJCXB1YmxpYyBpbnQgbWV0aG9kMShpbnRbXSBhcmdzKSB7cmV0dXJuIEFkZFJlZigpO30KLQkJCXB1YmxpYyBpbnQgbWV0aG9kMihpbnRbXSBhcmdzKSB7cmV0dXJuIFJlbGVhc2UoKTt9Ci0JCQkvLyBtZXRob2QzIEdldFR5cGVJbmZvQ291bnQgLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDQgR2V0VHlwZUluZm8gLSBub3QgaW1wbGVtZW50ZWQKLQkJCS8vIG1ldGhvZDUgR2V0SURzT2ZOYW1lcyAtIG5vdCBpbXBsZW1lbnRlZAotCQkJcHVibGljIGludCBtZXRob2Q2KGludFtdIGFyZ3MpIHtyZXR1cm4gSW52b2tlKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0sIGFyZ3NbNl0sIGFyZ3NbN10pO30KLQkJfTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDT01JbnRlcmZhY2VzKCkgewotCQlpZiAoaURpc3BhdGNoICE9IG51bGwpCi0JCQlpRGlzcGF0Y2guZGlzcG9zZSgpOwotCQlpRGlzcGF0Y2ggPSBudWxsOwotCQkKLQl9Ci0JcHJpdmF0ZSBpbnQgQWRkUmVmKCkgewotCQlyZWZDb3VudCsrOwotCQlyZXR1cm4gcmVmQ291bnQ7Ci0JfQotCXByaXZhdGUgaW50IEludm9rZShpbnQgZGlzcElkTWVtYmVyLCBpbnQgcmlpZCwgaW50IGxjaWQsIGludCBkd0ZsYWdzLCBpbnQgcERpc3BQYXJhbXMsIGludCBwVmFyUmVzdWx0LCBpbnQgcEV4Y2VwSW5mbywgaW50IHBBcmdFcnIpCXsKLQkJc3dpdGNoIChldmVudElEKSB7Ci0JCQljYXNlIG9uaGVscDogU3lzdGVtLm91dC5wcmludGxuKCJvbmhlbHAiKTsgYnJlYWs7Ci0JCQljYXNlIG9uY2xpY2s6IFN5c3RlbS5vdXQucHJpbnRsbigib25jbGljayIpOyBicmVhazsKLQkJCWNhc2Ugb25kYmxjbGljazogU3lzdGVtLm91dC5wcmludGxuKCJvbmRibGNsaWNrIik7IGJyZWFrOwotCQkJY2FzZSBvbmtleXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ua2V5dXAiKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5ZG93bjogU3lzdGVtLm91dC5wcmludGxuKCJvbmtleWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ua2V5cHJlc3M6IFN5c3RlbS5vdXQucHJpbnRsbigib25rZXlwcmVzcyIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZXVwOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2V1cCIpOyBicmVhazsKLQkJCWNhc2Ugb25tb3VzZWRvd246IFN5c3RlbS5vdXQucHJpbnRsbigib25tb3VzZWRvd24iKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2Vtb3ZlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2Vtb3ZlIik7IGJyZWFrOwotCQkJY2FzZSBvbm1vdXNlb3V0OiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ubW91c2VvdmVyOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9ubW91c2VvdmVyIik7IGJyZWFrOwotCQkJY2FzZSBvbnJlYWR5c3RhdGVjaGFuZ2U6IFN5c3RlbS5vdXQucHJpbnRsbigib25yZWFkeXN0YXRlY2hhbmdlIik7IGJyZWFrOwotCQkJY2FzZSBvbmFmdGVydXBkYXRlOiBTeXN0ZW0ub3V0LnByaW50bG4oIm9uYWZ0ZXJ1cGRhdGUiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZXhpdDogU3lzdGVtLm91dC5wcmludGxuKCJvbnJvd2V4aXQiKTsgYnJlYWs7Ci0JCQljYXNlIG9ucm93ZW50ZXI6IFN5c3RlbS5vdXQucHJpbnRsbigib25yb3dlbnRlciIpOyBicmVhazsKLQkJCWNhc2Ugb25kcmFnc3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25kcmFnc3RhcnQiKTsgYnJlYWs7Ci0JCQljYXNlIG9uc2VsZWN0c3RhcnQ6IFN5c3RlbS5vdXQucHJpbnRsbigib25zZWxlY3RzdGFydCIpOyBicmVhazsKLQkJfQotCQlyZXR1cm4gQ09NLlNfT0s7Ci0JfQotCXByaXZhdGUgaW50IFF1ZXJ5SW50ZXJmYWNlKGludCByaWlkLCBpbnQgcHB2T2JqZWN0KSB7Ci0JCWlmIChyaWlkID09IDAgfHwgcHB2T2JqZWN0ID09IDApIHJldHVybiBDT00uRV9JTlZBTElEQVJHOwotCQlHVUlEIGd1aWQgPSBuZXcgR1VJRCgpOwotCQlDT00uTW92ZU1lbW9yeShndWlkLCByaWlkLCBHVUlELnNpemVvZik7Ci0JCi0JCWlmICggQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJVW5rbm93bikgfHwgQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJRGlzcGF0Y2gpKSB7Ci0JCQlDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnRbXSB7aURpc3BhdGNoLmdldEFkZHJlc3MoKX0sIDQpOwotCQkJQWRkUmVmKCk7Ci0JCQlyZXR1cm4gQ09NLlNfT0s7Ci0JCX0KLQkJQ09NLk1vdmVNZW1vcnkocHB2T2JqZWN0LCBuZXcgaW50W10gezB9LCA0KTsKLQkJcmV0dXJuIENPTS5FX05PSU5URVJGQUNFOwotCX0KLQlpbnQgUmVsZWFzZSgpIHsKLQkJcmVmQ291bnQtLTsKLQkJaWYgKHJlZkNvdW50ID09IDApIHsKLQkJCWRpc3Bvc2VDT01JbnRlcmZhY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZkNvdW50OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAxZmJkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlRWRpdG9yIGV4YW1wbGUgc25pcHBldDogZWRpdCBhIGNlbGwgaW4gYSB0YWJsZSAoaW4gcGxhY2UsIGZhbmN5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI0IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUgKHRydWUpOwotCWZvciAoaW50IGk9MDsgaTwzOyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiIiArIGksICIiICsgaSAsICIiICsgaX0pOwotCX0KLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQllZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhICgpOwotCQkJUG9pbnQgcHQgPSBuZXcgUG9pbnQgKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJaW50IGluZGV4ID0gdGFibGUuZ2V0VG9wSW5kZXggKCk7Ci0JCQl3aGlsZSAoaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJCQlmaW5hbCBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGluZGV4KTsKLQkJCQlmb3IgKGludCBpPTA7IGk8dGFibGUuZ2V0Q29sdW1uQ291bnQgKCk7IGkrKykgewotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzIChpKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKHB0KSkgewotCQkJCQkJZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0JCQkJCQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5OT05FKTsKLQkJCQkJCUxpc3RlbmVyIHRleHRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKGZpbmFsIEV2ZW50IGUpIHsKLQkJCQkJCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQkJCQkJCWNhc2UgU1dULkZvY3VzT3V0OgotCQkJCQkJCQkJCWl0ZW0uc2V0VGV4dCAoY29sdW1uLCB0ZXh0LmdldFRleHQgKCkpOwotCQkJCQkJCQkJCXRleHQuZGlzcG9zZSAoKTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCWNhc2UgU1dULlRyYXZlcnNlOgotCQkJCQkJCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkJCQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOgotCQkJCQkJCQkJCQkJaXRlbS5zZXRUZXh0IChjb2x1bW4sIHRleHQuZ2V0VGV4dCAoKSk7Ci0JCQkJCQkJCQkJCQkvL0ZBTEwgVEhST1VHSAotCQkJCQkJCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQkJCQkJCQl0ZXh0LmRpc3Bvc2UgKCk7Ci0JCQkJCQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULkZvY3VzT3V0LCB0ZXh0TGlzdGVuZXIpOwotCQkJCQkJdGV4dC5hZGRMaXN0ZW5lciAoU1dULlRyYXZlcnNlLCB0ZXh0TGlzdGVuZXIpOwotCQkJCQkJZWRpdG9yLnNldEVkaXRvciAodGV4dCwgaXRlbSwgaSk7Ci0JCQkJCQl0ZXh0LnNldFRleHQgKGl0ZW0uZ2V0VGV4dCAoaSkpOwotCQkJCQkJdGV4dC5zZWxlY3RBbGwgKCk7Ci0JCQkJCQl0ZXh0LnNldEZvY3VzICgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmICghdmlzaWJsZSAmJiByZWN0LmludGVyc2VjdHMgKGNsaWVudEFyZWEpKSB7Ci0JCQkJCQl2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZpc2libGUpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWI3NTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgZmFrZSB0b29sIHRpcHMgZm9yIGl0ZW1zIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJpdGVtICIgKyBpKTsKLQl9Ci0JLy8gRGlzYWJsZSBuYXRpdmUgdG9vbHRpcAotCXRhYmxlLnNldFRvb2xUaXBUZXh0ICgiIik7Ci0JCi0JLy8gSW1wbGVtZW50IGEgImZha2UiIHRvb2x0aXAKLQlmaW5hbCBMaXN0ZW5lciBsYWJlbExpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlMYWJlbCBsYWJlbCA9IChMYWJlbClldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGxhYmVsLmdldFNoZWxsICgpOwotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotCQkJCQllLml0ZW0gPSAoVGFibGVJdGVtKSBsYWJlbC5nZXREYXRhICgiX1RBQkxFSVRFTSIpOwotCQkJCQkvLyBBc3N1bWluZyB0YWJsZSBpcyBzaW5nbGUgc2VsZWN0LCBzZXQgdGhlIHNlbGVjdGlvbiBhcyBpZgotCQkJCQkvLyB0aGUgbW91c2UgZG93biBldmVudCB3ZW50IHRocm91Z2ggdG8gdGhlIHRhYmxlCi0JCQkJCXRhYmxlLnNldFNlbGVjdGlvbiAobmV3IFRhYmxlSXRlbSBbXSB7KFRhYmxlSXRlbSkgZS5pdGVtfSk7Ci0JCQkJCXRhYmxlLm5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0JCQkJCXNoZWxsLmRpc3Bvc2UgKCk7Ci0JCQkJCXRhYmxlLnNldEZvY3VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQkJc2hlbGwuZGlzcG9zZSAoKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCUxpc3RlbmVyIHRhYmxlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlTaGVsbCB0aXAgPSBudWxsOwotCQlMYWJlbCBsYWJlbCA9IG51bGw7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuRGlzcG9zZToKLQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCWNhc2UgU1dULk1vdXNlTW92ZTogewotCQkJCQlpZiAodGlwID09IG51bGwpIGJyZWFrOwotCQkJCQl0aXAuZGlzcG9zZSAoKTsKLQkJCQkJdGlwID0gbnVsbDsKLQkJCQkJbGFiZWwgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuTW91c2VIb3ZlcjogewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodGlwICE9IG51bGwgICYmICF0aXAuaXNEaXNwb3NlZCAoKSkgdGlwLmRpc3Bvc2UgKCk7Ci0JCQkJCQl0aXAgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuT05fVE9QIHwgU1dULk5PX0ZPQ1VTIHwgU1dULlRPT0wpOwotCQkJCQkJdGlwLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQkJCUZpbGxMYXlvdXQgbGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQgKCk7Ci0JCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQkJCQkJdGlwLnNldExheW91dCAobGF5b3V0KTsKLQkJCQkJCWxhYmVsID0gbmV3IExhYmVsICh0aXAsIFNXVC5OT05FKTsKLQkJCQkJCWxhYmVsLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKLQkJCQkJCWxhYmVsLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKLQkJCQkJCWxhYmVsLnNldERhdGEgKCJfVEFCTEVJVEVNIiwgaXRlbSk7Ci0JCQkJCQlsYWJlbC5zZXRUZXh0IChpdGVtLmdldFRleHQgKCkpOwotCQkJCQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUV4aXQsIGxhYmVsTGlzdGVuZXIpOwotCQkJCQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxhYmVsTGlzdGVuZXIpOwotCQkJCQkJUG9pbnQgc2l6ZSA9IHRpcC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMgKDApOwotCQkJCQkJUG9pbnQgcHQgPSB0YWJsZS50b0Rpc3BsYXkgKHJlY3QueCwgcmVjdC55KTsKLQkJCQkJCXRpcC5zZXRCb3VuZHMgKHB0LngsIHB0LnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQkJCXRpcC5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdGFibGUuYWRkTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCB0YWJsZUxpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULktleURvd24sIHRhYmxlTGlzdGVuZXIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCB0YWJsZUxpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlSG92ZXIsIHRhYmxlTGlzdGVuZXIpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2JhYzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGFyYml0cmFyeSBjb250cm9scyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjYgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JZm9yIChpbnQgaT0wOyBpPDM7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFdpZHRoICgxMDApOwotCX0KLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQluZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCX0KLQlUYWJsZUl0ZW0gW10gaXRlbXMgPSB0YWJsZS5nZXRJdGVtcyAoKTsKLQlmb3IgKGludCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJVGFibGVFZGl0b3IgZWRpdG9yID0gbmV3IFRhYmxlRWRpdG9yICh0YWJsZSk7Ci0JCUNDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbWJvLnNldFRleHQoIkNDb21ibyIpOwotCQljb21iby5hZGQoIml0ZW0gMSIpOwotCQljb21iby5hZGQoIml0ZW0gMiIpOwotCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQllZGl0b3Iuc2V0RWRpdG9yKGNvbWJvLCBpdGVtc1tpXSwgMCk7Ci0JCWVkaXRvciA9IG5ldyBUYWJsZUVkaXRvciAodGFibGUpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dCAodGFibGUsIFNXVC5OT05FKTsKLQkJdGV4dC5zZXRUZXh0KCJUZXh0Iik7Ci0JCWVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWVkaXRvci5zZXRFZGl0b3IodGV4dCwgaXRlbXNbaV0sIDEpOwotCQllZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYmxlLCBTV1QuQ0hFQ0spOwotCQlidXR0b24ucGFjayAoKTsKLQkJZWRpdG9yLm1pbmltdW1XaWR0aCA9IGJ1dHRvbi5nZXRTaXplICgpLng7Ci0JCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWVkaXRvci5zZXRFZGl0b3IgKGJ1dHRvbiwgaXRlbXNbaV0sIDIpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlZmViZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTI3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgVGFiIGZyb20gdHJhdmVyc2luZyBvdXQgb2YgYSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMjcgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQoIkNhbid0IFRyYXZlcnNlIik7Ci0JYnV0dG9uMS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9ORVhUOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUzogewotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uMi5zZXRUZXh0KCJDYW4gVHJhdmVyc2UiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg5MWZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnJvd3NlciBleGFtcGxlIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTI4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotCQlUb29sSXRlbSBpdGVtQmFjayA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1CYWNrLnNldFRleHQoIkJhY2siKTsKLQkJVG9vbEl0ZW0gaXRlbUZvcndhcmQgPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULlBVU0gpOwotCQlpdGVtRm9yd2FyZC5zZXRUZXh0KCJGb3J3YXJkIik7Ci0JCVRvb2xJdGVtIGl0ZW1TdG9wID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbVN0b3Auc2V0VGV4dCgiU3RvcCIpOwotCQlUb29sSXRlbSBpdGVtUmVmcmVzaCA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7Ci0JCWl0ZW1SZWZyZXNoLnNldFRleHQoIlJlZnJlc2giKTsKLQkJVG9vbEl0ZW0gaXRlbUdvID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5QVVNIKTsKLQkJaXRlbUdvLnNldFRleHQoIkdvIik7Ci0JCQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl0b29sYmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgbGFiZWxBZGRyZXNzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWxhYmVsQWRkcmVzcy5zZXRUZXh0KCJBZGRyZXNzIik7Ci0JCQotCQlmaW5hbCBUZXh0IGxvY2F0aW9uID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsb2NhdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZpbmFsIExhYmVsIHN0YXR1cyA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmaW5hbCBQcm9ncmVzc0JhciBwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkVORDsKLQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvKiBldmVudCBoYW5kbGluZyAqLwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9vbEl0ZW0gaXRlbSA9IChUb29sSXRlbSlldmVudC53aWRnZXQ7Ci0JCQkJU3RyaW5nIHN0cmluZyA9IGl0ZW0uZ2V0VGV4dCgpOwotCQkJCWlmIChzdHJpbmcuZXF1YWxzKCJCYWNrIikpIGJyb3dzZXIuYmFjaygpOyAKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJGb3J3YXJkIikpIGJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCWVsc2UgaWYgKHN0cmluZy5lcXVhbHMoIlN0b3AiKSkgYnJvd3Nlci5zdG9wKCk7Ci0JCQkJZWxzZSBpZiAoc3RyaW5nLmVxdWFscygiUmVmcmVzaCIpKSBicm93c2VyLnJlZnJlc2goKTsKLQkJCQllbHNlIGlmIChzdHJpbmcuZXF1YWxzKCJHbyIpKSBicm93c2VyLnNldFVybChsb2NhdGlvbi5nZXRUZXh0KCkpOwotCQkgICB9Ci0JCX07Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQudG90YWwgPT0gMCkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJaW50IHJhdGlvID0gZXZlbnQuY3VycmVudCAqIDEwMCAvIGV2ZW50LnRvdGFsOwotCQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24ocmF0aW8pOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFN0YXR1c1RleHRMaXN0ZW5lcihuZXcgU3RhdHVzVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpIHsKLQkJCQlzdGF0dXMuc2V0VGV4dChldmVudC50ZXh0KTsJCi0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQudG9wKSBsb2NhdGlvbi5zZXRUZXh0KGV2ZW50LmxvY2F0aW9uKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCWl0ZW1CYWNrLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbUZvcndhcmQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlpdGVtU3RvcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWl0ZW1SZWZyZXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJaXRlbUdvLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQkJbG9jYXRpb24uYWRkTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlicm93c2VyLnNldFVybChsb2NhdGlvbi5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly9lY2xpcHNlLm9yZyIpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEyOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmQxYmEwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjb2xvciBjZWxscyBhbmQgcm93cyBpbiB0YWJsZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEyOSB7Ci0gCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBncmF5ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0YWJsZS5zZXRCYWNrZ3JvdW5kKGdyYXkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJlbnRpcmUiLCJyb3ciLCJyZWQgZm9yZWdyb3VuZCJ9KTsKLQlpdGVtLnNldEZvcmVncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJlbnRpcmUiLCJyb3ciLCJyZWQgYmFja2dyb3VuZCJ9KTsKLQlpdGVtLnNldEJhY2tncm91bmQocmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJlbnRpcmUiLCJyb3ciLCJ3aGl0ZSBmb3JlL3JlZCBiYWNrIn0pOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCh3aGl0ZSk7Ci0JaXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsibm9ybWFsIiwiYmx1ZSBmb3JlZ3JvdW5kIiwicmVkIGZvcmVncm91bmQifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDEsIGJsdWUpOwotCWl0ZW0uc2V0Rm9yZWdyb3VuZCgyLCByZWQpOwotCWl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Im5vcm1hbCIsImJsdWUgYmFja2dyb3VuZCIsInJlZCBiYWNrZ3JvdW5kIn0pOwotCWl0ZW0uc2V0QmFja2dyb3VuZCgxLCBibHVlKTsKLQlpdGVtLnNldEJhY2tncm91bmQoMiwgcmVkKTsKLQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJ3aGl0ZSBmb3JlL2JsdWUgYmFjayIsIm5vcm1hbCIsIndoaXRlIGZvcmUvcmVkIGJhY2sifSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQoMCwgYmx1ZSk7Ci0JaXRlbS5zZXRGb3JlZ3JvdW5kKDIsIHdoaXRlKTsKLQlpdGVtLnNldEJhY2tncm91bmQoMiwgcmVkKTsKLQkKLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQljb2x1bW4zLnBhY2soKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE4ZDA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGRyYXcgYSB0aGljayBsaW5lCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlHQyBnYyA9IG5ldyBHQyAoc2hlbGwpOwotCWdjLnNldExpbmVXaWR0aCAoNCk7Ci0JZ2MuZHJhd1JlY3RhbmdsZSAoMjAsIDIwLCAxMDAsIDEwMCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MGNiOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQnVzeUluZGljYXRvciBleGFtcGxlIHNuaXBwZXQ6IGRpc3BsYXkgYnVzeSBjdXJzb3IgZHVyaW5nIGxvbmcgcnVubmluZyB0YXNrCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMwIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlmaW5hbCBpbnRbXSBuZXh0SWQgPSBuZXcgaW50WzFdOwotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZva2UgbG9uZyBydW5uaW5nIGpvYiIpOwotCQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVJ1bm5hYmxlIGxvbmdKb2IgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQkJCQlpbnQgaWQ7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWlkID0gbmV4dElkWzBdKys7Ci0JCQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCWlmICh0ZXh0LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJCQkJCXRleHQuYXBwZW5kKCJcblN0YXJ0IGxvbmcgcnVubmluZyB0YXNrICIraWQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewotCQkJCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvIHRhc2sgdGhhdCB0YWtlcyBhIGxvbmcgdGltZSBpbiBhIHNlcGFyYXRlIHRocmVhZCAiK2lkKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJaWYgKHRleHQuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCQkJCQkJdGV4dC5hcHBlbmQoIlxuQ29tcGxldGVkIGxvbmcgcnVubmluZyB0YXNrICIraWQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCQkJCQl3aGlsZSAoIWRvbmUgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQkJCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShkaXNwbGF5LCBsb25nSm9iKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoMjUwLCAxNTApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMGMwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBzaG93IGEgcG9wdXAgbWVudSAod2FpdCBmb3IgaXQgdG8gY2xvc2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzEgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTWVudURldGVjdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJaXRlbS5zZXRUZXh0ICgiTWVudSBJdGVtIik7Ci0JCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkl0ZW0gU2VsZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW1lbnUuc2V0TG9jYXRpb24gKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCXdoaWxlICghbWVudS5pc0Rpc3Bvc2VkICgpICYmIG1lbnUuaXNWaXNpYmxlICgpKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJCX0KLQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE4MWEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFByaW50aW5nIGV4YW1wbGUgc25pcHBldDogcHJpbnQgIkhlbGxvIFdvcmxkISIgaW4gYmxhY2ssIG91dGxpbmVkIGluIHJlZCwgdG8gZGVmYXVsdCBwcmludGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWlmIChkYXRhID09IG51bGwpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBObyBkZWZhdWx0IHByaW50ZXIuIik7Ci0JCXJldHVybjsKLQl9Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JaWYgKHByaW50ZXIuc3RhcnRKb2IoIlNXVCBQcmludGluZyBTbmlwcGV0IikpIHsKLQkJQ29sb3IgYmxhY2sgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0JCUNvbG9yIHdoaXRlID0gcHJpbnRlci5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCQlDb2xvciByZWQgPSBwcmludGVyLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCVBvaW50IGRwaSA9IHByaW50ZXIuZ2V0RFBJKCk7Ci0JCWludCBsZWZ0TWFyZ2luID0gZHBpLnggKyB0cmltLng7IC8vIG9uZSBpbmNoIGZyb20gbGVmdCBzaWRlIG9mIHBhcGVyCi0JCWludCB0b3BNYXJnaW4gPSBkcGkueSAvIDIgKyB0cmltLnk7IC8vIG9uZS1oYWxmIGluY2ggZnJvbSB0b3AgZWRnZSBvZiBwYXBlcgotCQlHQyBnYyA9IG5ldyBHQyhwcmludGVyKTsKLQkJRm9udCBmb250ID0gZ2MuZ2V0Rm9udCgpOyAvLyBleGFtcGxlIGp1c3QgdXNlcyBwcmludGVyJ3MgZGVmYXVsdCBmb250Ci0JCWlmIChwcmludGVyLnN0YXJ0UGFnZSgpKSB7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQkJCWdjLnNldEZvcmVncm91bmQoYmxhY2spOwotCQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiSGVsbG8gV29ybGQhIjsKLQkJCVBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudCh0ZXN0U3RyaW5nKTsKLQkJCWdjLmRyYXdTdHJpbmcodGVzdFN0cmluZywgbGVmdE1hcmdpbiwgdG9wTWFyZ2luICsgZm9udC5nZXRGb250RGF0YSgpWzBdLmdldEhlaWdodCgpKTsKLQkJCWdjLnNldEZvcmVncm91bmQocmVkKTsKLQkJCWdjLmRyYXdSZWN0YW5nbGUobGVmdE1hcmdpbiwgdG9wTWFyZ2luLCBleHRlbnQueCwgZXh0ZW50LnkpOwotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQlwcmludGVyLmVuZEpvYigpOwotCQl9Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5YzYyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAgCi0vKgotICogUHJpbnRpbmcgZXhhbXBsZSBzbmlwcGV0OiBwcmludCB0ZXh0IHRvIHByaW50ZXIsIHdpdGggd29yZCB3cmFwIGFuZCBwYWdpbmF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTMzIHsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JU2hlbGwgc2hlbGw7Ci0JVGV4dCB0ZXh0OwotCUZvbnQgZm9udDsKLQlDb2xvciBmb3JlZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvcjsKLQkKLQlQcmludGVyIHByaW50ZXI7Ci0JR0MgZ2M7Ci0JRm9udERhdGFbXSBwcmludGVyRm9udERhdGE7Ci0JUkdCIHByaW50ZXJGb3JlZ3JvdW5kLCBwcmludGVyQmFja2dyb3VuZDsKLQotCWludCBsaW5lSGVpZ2h0ID0gMDsKLQlpbnQgdGFiV2lkdGggPSAwOwotCWludCBsZWZ0TWFyZ2luLCByaWdodE1hcmdpbiwgdG9wTWFyZ2luLCBib3R0b21NYXJnaW47Ci0JaW50IHgsIHk7Ci0JaW50IGluZGV4LCBlbmQ7Ci0JU3RyaW5nIHRleHRUb1ByaW50OwotCVN0cmluZyB0YWJzOwotCVN0cmluZ0J1ZmZlciB3b3JkQnVmZmVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgU25pcHBldDEzMygpLm9wZW4oKTsKLQl9Ci0JCi0Jdm9pZCBvcGVuKCkgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dCgiUHJpbnQgVGV4dCIpOwotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJaXRlbS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlpdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiJk9wZW4uLi4iKTsKLQkJaXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ1RSTCArICdPJyk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCW1lbnVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRm9udC4uLiIpOwotCQlpdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQltZW51Rm9udCgpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkZvcmVncm91bmQgQ29sb3IuLi4iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUZvcmVncm91bmRDb2xvcigpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkJhY2tncm91bmQgQ29sb3IuLi4iKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudUJhY2tncm91bmRDb2xvcigpOwotCQkJfQotCQl9KTsKLQkJaXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIiZQcmludC4uLiIpOwotCQlpdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ1AnKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJbWVudVByaW50KCk7Ci0JCQl9Ci0JCX0pOwotCQluZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQlpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0JCWl0ZW0uc2V0VGV4dCgiRSZ4aXQiKTsKLQkJaXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQlpZiAoZm9yZWdyb3VuZENvbG9yICE9IG51bGwpIGZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQkKLQl2b2lkIG1lbnVPcGVuKCkgewotCQlmaW5hbCBTdHJpbmcgdGV4dFN0cmluZzsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmphdmEiLCAiKi4qIn0pOwotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSkgcmV0dXJuOwotCQotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmFtZSk7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gc3RyZWFtPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUuZ2V0UGF0aCgpKTsKLQkJCXRyeSB7Ci0JCQkJUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKTsKLQkJCQljaGFyW10gcmVhZEJ1ZmZlcj0gbmV3IGNoYXJbMjA0OF07Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigoaW50KSBmaWxlLmxlbmd0aCgpKTsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpKSA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQl9Ci0JCQkJdGV4dFN0cmluZyA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5JQ09OX0VSUk9SKTsKLQkJCQlib3guc2V0TWVzc2FnZSgiRXJyb3IgcmVhZGluZyBmaWxlOlxuIiArIG5hbWUpOwotCQkJCWJveC5vcGVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoIkZpbGUgbm90IGZvdW5kOlxuIiArIG5hbWUpOwotCQkJYm94Lm9wZW4oKTsKLQkJCXJldHVybjsKLQkJfQkKLQkJdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCX0KLQotCXZvaWQgbWVudUZvbnQoKSB7Ci0JCUZvbnREaWFsb2cgZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsKTsKLQkJZm9udERpYWxvZy5zZXRGb250TGlzdCh0ZXh0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpKTsKLQkJRm9udERhdGEgZm9udERhdGEgPSBmb250RGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZvbnREYXRhICE9IG51bGwpIHsKLQkJCWlmIChmb250ICE9IG51bGwpIGZvbnQuZGlzcG9zZSgpOwotCQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZvbnREYXRhKTsKLQkJCXRleHQuc2V0Rm9udChmb250KTsKLQkJfQotCX0KLQotCXZvaWQgbWVudUZvcmVncm91bmRDb2xvcigpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coc2hlbGwpOwotCQljb2xvckRpYWxvZy5zZXRSR0IodGV4dC5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCkpOwotCQlSR0IgcmdiID0gY29sb3JEaWFsb2cub3BlbigpOwotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCWlmIChmb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgZm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWZvcmVncm91bmRDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCByZ2IpOwotCQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JCX0KLQl9Ci0KLQl2b2lkIG1lbnVCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0JCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkJY29sb3JEaWFsb2cuc2V0UkdCKHRleHQuZ2V0QmFja2dyb3VuZCgpLmdldFJHQigpKTsKLQkJUkdCIHJnYiA9IGNvbG9yRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJnYiAhPSBudWxsKSB7Ci0JCQlpZiAoYmFja2dyb3VuZENvbG9yICE9IG51bGwpIGJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQliYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgcmdiKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotCQl9Ci0JfQotCi0Jdm9pZCBtZW51UHJpbnQoKSB7Ci0JCVByaW50RGlhbG9nIGRpYWxvZyA9IG5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCQlQcmludGVyRGF0YSBkYXRhID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCQlpZiAoZGF0YS5wcmludFRvRmlsZSkgewotCQkJZGF0YS5maWxlTmFtZSA9ICJwcmludC5vdXQiOyAvLyB5b3UgcHJvYmFibHkgd2FudCB0byBhc2sgdGhlIHVzZXIgZm9yIGEgZmlsZW5hbWUKLQkJfQotCQkKLQkJLyogR2V0IHRoZSB0ZXh0IHRvIHByaW50IGZyb20gdGhlIFRleHQgd2lkZ2V0ICh5b3UgY291bGQgZ2V0IGl0IGZyb20gYW55d2hlcmUsIGkuZS4geW91ciBqYXZhIG1vZGVsKSAqLwotCQl0ZXh0VG9QcmludCA9IHRleHQuZ2V0VGV4dCgpOwotCi0JCS8qIEdldCB0aGUgZm9udCAmIGZvcmVncm91bmQgJiBiYWNrZ3JvdW5kIGRhdGEuICovCi0JCXByaW50ZXJGb250RGF0YSA9IHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCXByaW50ZXJGb3JlZ3JvdW5kID0gdGV4dC5nZXRGb3JlZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCXByaW50ZXJCYWNrZ3JvdW5kID0gdGV4dC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCQotCQkvKiBEbyB0aGUgcHJpbnRpbmcgaW4gYSBiYWNrZ3JvdW5kIHRocmVhZCBzbyB0aGF0IHNwb29saW5nIGRvZXMgbm90IGZyZWV6ZSB0aGUgVUkuICovCi0JCXByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQkJVGhyZWFkIHByaW50aW5nVGhyZWFkID0gbmV3IFRocmVhZCgiUHJpbnRpbmciKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJpbnQocHJpbnRlcik7Ci0JCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JCXByaW50aW5nVGhyZWFkLnN0YXJ0KCk7Ci0JfQotCQotCXZvaWQgcHJpbnQoUHJpbnRlciBwcmludGVyKSB7Ci0JCWlmIChwcmludGVyLnN0YXJ0Sm9iKCJUZXh0IikpIHsgICAvLyB0aGUgc3RyaW5nIGlzIHRoZSBqb2IgbmFtZSAtIHNob3dzIHVwIGluIHRoZSBwcmludGVyJ3Mgam9iIGxpc3QKLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcHJpbnRlci5nZXRDbGllbnRBcmVhKCk7Ci0JCQlSZWN0YW5nbGUgdHJpbSA9IHByaW50ZXIuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci0JCQlQb2ludCBkcGkgPSBwcmludGVyLmdldERQSSgpOwotCQkJbGVmdE1hcmdpbiA9IGRwaS54ICsgdHJpbS54OyAvLyBvbmUgaW5jaCBmcm9tIGxlZnQgc2lkZSBvZiBwYXBlcgotCQkJcmlnaHRNYXJnaW4gPSBjbGllbnRBcmVhLndpZHRoIC0gZHBpLnggKyB0cmltLnggKyB0cmltLndpZHRoOyAvLyBvbmUgaW5jaCBmcm9tIHJpZ2h0IHNpZGUgb2YgcGFwZXIKLQkJCXRvcE1hcmdpbiA9IGRwaS55ICsgdHJpbS55OyAvLyBvbmUgaW5jaCBmcm9tIHRvcCBlZGdlIG9mIHBhcGVyCi0JCQlib3R0b21NYXJnaW4gPSBjbGllbnRBcmVhLmhlaWdodCAtIGRwaS55ICsgdHJpbS55ICsgdHJpbS5oZWlnaHQ7IC8vIG9uZSBpbmNoIGZyb20gYm90dG9tIGVkZ2Ugb2YgcGFwZXIKLQkJCQotCQkJLyogQ3JlYXRlIGEgYnVmZmVyIGZvciBjb21wdXRpbmcgdGFiIHdpZHRoLiAqLwotCQkJaW50IHRhYlNpemUgPSA0OyAvLyBpcyB0YWIgd2lkdGggYSB1c2VyIHNldHRpbmcgaW4geW91ciBVST8KLQkJCVN0cmluZ0J1ZmZlciB0YWJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRhYlNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJTaXplOyBpKyspIHRhYkJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCXRhYnMgPSB0YWJCdWZmZXIudG9TdHJpbmcoKTsKLQotCQkJLyogQ3JlYXRlIHByaW50ZXIgR0MsIGFuZCBjcmVhdGUgYW5kIHNldCB0aGUgcHJpbnRlciBmb250ICYgZm9yZWdyb3VuZCBjb2xvci4gKi8KLQkJCWdjID0gbmV3IEdDKHByaW50ZXIpOwotCQkJRm9udCBwcmludGVyRm9udCA9IG5ldyBGb250KHByaW50ZXIsIHByaW50ZXJGb250RGF0YSk7Ci0JCQlDb2xvciBwcmludGVyRm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKHByaW50ZXIsIHByaW50ZXJGb3JlZ3JvdW5kKTsKLQkJCUNvbG9yIHByaW50ZXJCYWNrZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IocHJpbnRlciwgcHJpbnRlckJhY2tncm91bmQpOyAKLQkJCQotCQkJZ2Muc2V0Rm9udChwcmludGVyRm9udCk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKHByaW50ZXJGb3JlZ3JvdW5kQ29sb3IpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChwcmludGVyQmFja2dyb3VuZENvbG9yKTsKLQkJCXRhYldpZHRoID0gZ2Muc3RyaW5nRXh0ZW50KHRhYnMpLng7Ci0JCQlsaW5lSGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJCi0JCQkvKiBQcmludCB0ZXh0IHRvIGN1cnJlbnQgZ2MgdXNpbmcgd29yZCB3cmFwICovCi0JCQlwcmludFRleHQoKTsKLQkJCXByaW50ZXIuZW5kSm9iKCk7Ci0KLQkJCS8qIENsZWFudXAgZ3JhcGhpY3MgcmVzb3VyY2VzIHVzZWQgaW4gcHJpbnRpbmcgKi8KLQkJCXByaW50ZXJGb250LmRpc3Bvc2UoKTsKLQkJCXByaW50ZXJGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJcHJpbnRlckJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBwcmludFRleHQoKSB7Ci0JCXByaW50ZXIuc3RhcnRQYWdlKCk7Ci0JCXdvcmRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXggPSBsZWZ0TWFyZ2luOwotCQl5ID0gdG9wTWFyZ2luOwotCQlpbmRleCA9IDA7Ci0JCWVuZCA9IHRleHRUb1ByaW50Lmxlbmd0aCgpOwotCQl3aGlsZSAoaW5kZXggPCBlbmQpIHsKLQkJCWNoYXIgYyA9IHRleHRUb1ByaW50LmNoYXJBdChpbmRleCk7Ci0JCQlpbmRleCsrOwotCQkJaWYgKGMgIT0gMCkgewotCQkJCWlmIChjID09IDB4MGEgfHwgYyA9PSAweDBkKSB7Ci0JCQkJCWlmIChjID09IDB4MGQgJiYgaW5kZXggPCBlbmQgJiYgdGV4dFRvUHJpbnQuY2hhckF0KGluZGV4KSA9PSAweDBhKSB7Ci0JCQkJCQlpbmRleCsrOyAvLyBpZiB0aGlzIGlzIGNyLWxmLCBza2lwIHRoZSBsZgotCQkJCQl9Ci0JCQkJCXByaW50V29yZEJ1ZmZlcigpOwotCQkJCQluZXdsaW5lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGMgIT0gJ1x0JykgewotCQkJCQkJd29yZEJ1ZmZlci5hcHBlbmQoYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQkJCXByaW50V29yZEJ1ZmZlcigpOwotCQkJCQkJaWYgKGMgPT0gJ1x0JykgewotCQkJCQkJCXggKz0gdGFiV2lkdGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHkgKyBsaW5lSGVpZ2h0IDw9IGJvdHRvbU1hcmdpbikgewotCQkJcHJpbnRlci5lbmRQYWdlKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByaW50V29yZEJ1ZmZlcigpIHsKLQkJaWYgKHdvcmRCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgd29yZCA9IHdvcmRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWludCB3b3JkV2lkdGggPSBnYy5zdHJpbmdFeHRlbnQod29yZCkueDsKLQkJCWlmICh4ICsgd29yZFdpZHRoID4gcmlnaHRNYXJnaW4pIHsKLQkJCQkvKiB3b3JkIGRvZXNuJ3QgZml0IG9uIGN1cnJlbnQgbGluZSwgc28gd3JhcCAqLwotCQkJCW5ld2xpbmUoKTsKLQkJCX0KLQkJCWdjLmRyYXdTdHJpbmcod29yZCwgeCwgeSwgZmFsc2UpOwotCQkJeCArPSB3b3JkV2lkdGg7Ci0JCQl3b3JkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JfQotCi0Jdm9pZCBuZXdsaW5lKCkgewotCQl4ID0gbGVmdE1hcmdpbjsKLQkJeSArPSBsaW5lSGVpZ2h0OwotCQlpZiAoeSArIGxpbmVIZWlnaHQgPiBib3R0b21NYXJnaW4pIHsKLQkJCXByaW50ZXIuZW5kUGFnZSgpOwotCQkJaWYgKGluZGV4ICsgMSA8IGVuZCkgewotCQkJCXkgPSB0b3BNYXJnaW47Ci0JCQkJcHJpbnRlci5zdGFydFBhZ2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkODE5YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFNoZWxsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbm9uLXJlY3Rhbmd1bGFyIHdpbmRvdwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM0IHsKLQotc3RhdGljIGludFtdIGNpcmNsZShpbnQgciwgaW50IG9mZnNldFgsIGludCBvZmZzZXRZKSB7Ci0JaW50W10gcG9seWdvbiA9IG5ldyBpbnRbOCAqIHIgKyA0XTsKLQkvL3heMiArIHleMiA9IHJeMgotCWZvciAoaW50IGkgPSAwOyBpIDwgMiAqIHIgKyAxOyBpKyspIHsKLQkJaW50IHggPSBpIC0gcjsKLQkJaW50IHkgPSAoaW50KU1hdGguc3FydChyKnIgLSB4KngpOwotCQlwb2x5Z29uWzIqaV0gPSBvZmZzZXRYICsgeDsKLQkJcG9seWdvblsyKmkrMV0gPSBvZmZzZXRZICsgeTsKLQkJcG9seWdvbls4KnIgLSAyKmkgLSAyXSA9IG9mZnNldFggKyB4OwotCQlwb2x5Z29uWzgqciAtIDIqaSAtIDFdID0gb2Zmc2V0WSAtIHk7Ci0JfQotCXJldHVybiBwb2x5Z29uOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkvL1NoZWxsIG11c3QgYmUgY3JlYXRlZCB3aXRoIHN0eWxlIFNXVC5OT19UUklNCi0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0gfCBTV1QuT05fVE9QKTsKLQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCS8vZGVmaW5lIGEgcmVnaW9uIHRoYXQgbG9va3MgbGlrZSBhIGtleSBob2xlCi0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlyZWdpb24uYWRkKGNpcmNsZSg2NywgNjcsIDY3KSk7Ci0JcmVnaW9uLnN1YnRyYWN0KGNpcmNsZSgyMCwgNjcsIDUwKSk7Ci0JcmVnaW9uLnN1YnRyYWN0KG5ldyBpbnRbXXs2NywgNTAsIDU1LCAxMDUsIDc5LCAxMDV9KTsKLQkvL2RlZmluZSB0aGUgc2hhcGUgb2YgdGhlIHNoZWxsIHVzaW5nIHNldFJlZ2lvbgotCXNoZWxsLnNldFJlZ2lvbihyZWdpb24pOwotCVJlY3RhbmdsZSBzaXplID0gcmVnaW9uLmdldEJvdW5kcygpOwotCXNoZWxsLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCS8vYWRkIGFiaWxpdHkgdG8gbW92ZSBzaGVsbCBhcm91bmQKLQlMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotCQlQb2ludCBvcmlnaW47Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlvcmlnaW4gPSBuZXcgUG9pbnQoZS54LCBlLnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOgotCQkJCQlvcmlnaW4gPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZU1vdmU6Ci0JCQkJCWlmIChvcmlnaW4gIT0gbnVsbCkgewotCQkJCQkJUG9pbnQgcCA9IGRpc3BsYXkubWFwKHNoZWxsLCBudWxsLCBlLngsIGUueSk7Ci0JCQkJCQlzaGVsbC5zZXRMb2NhdGlvbihwLnggLSBvcmlnaW4ueCwgcC55IC0gb3JpZ2luLnkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBsKTsKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgbCk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgbCk7Ci0JLy9hZGQgYWJpbGl0eSB0byBjbG9zZSBzaGVsbAotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0QmFja2dyb3VuZChzaGVsbC5nZXRCYWNrZ3JvdW5kKCkpOwotCWIuc2V0VGV4dCgiY2xvc2UiKTsKLQliLnBhY2soKTsKLQliLnNldExvY2F0aW9uKDEwLCA2OCk7Ci0JYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlyZWdpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjhmNzE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIGV4YW1wbGUgc25pcHBldDogZW1iZWQgU3dpbmcvQVdUIGluIFNXVAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzUgewotCi0Jc3RhdGljIGNsYXNzIEZpbGVUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsJCQotCQlGaWxlW10gZmlsZXM7ICAgICAgICAKLQkJU3RyaW5nW10gY29sdW1uc05hbWUgPSB7Ik5hbWUiLCAiU2l6ZSIsICJEYXRlIE1vZGlmaWVkIn07Ci0JCQotCQlwdWJsaWMgRmlsZVRhYmxlTW9kZWwgKEZpbGVbXSBmaWxlcykgewotCQkJdGhpcy5maWxlcyA9IGZpbGVzOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQgKCkgewotCQkJcmV0dXJuIGNvbHVtbnNOYW1lLmxlbmd0aDsKLQkJfQotCQlwdWJsaWMgQ2xhc3MgZ2V0Q29sdW1uQ2xhc3MgKGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMSkgcmV0dXJuIExvbmcuY2xhc3M7Ci0JCQlpZiAoY29sID09IDIpIHJldHVybiBEYXRlLmNsYXNzOwotCQkJcmV0dXJuIFN0cmluZy5jbGFzczsKLQkJfQotCQlwdWJsaWMgaW50IGdldFJvd0NvdW50ICgpIHsKLQkJCXJldHVybiBmaWxlcyA9PSBudWxsID8gMCA6IGZpbGVzLmxlbmd0aDsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQgKGludCByb3csIGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMCkgcmV0dXJuIGZpbGVzW3Jvd10uZ2V0TmFtZSgpOwotCQkJaWYgKGNvbCA9PSAxKSByZXR1cm4gbmV3IExvbmcoZmlsZXNbcm93XS5sZW5ndGgoKSk7Ci0JCQlpZiAoY29sID09IDIpIHJldHVybiBuZXcgRGF0ZShmaWxlc1tyb3ddLmxhc3RNb2RpZmllZCgpKTsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUgKGludCBjb2wpIHsKLQkJCXJldHVybiBjb2x1bW5zTmFtZVtjb2xdOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiU1dUIGFuZCBTd2luZy9BV1QgRXhhbXBsZSIpOwotCi0JCUxpc3RlbmVyIGV4aXRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlNZXNzYWdlQm94IGRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KHNoZWxsLCBTV1QuT0sgfCBTV1QuQ0FOQ0VMIHwgU1dULklDT05fUVVFU1RJT04pOwotCQkJCWRpYWxvZy5zZXRUZXh0KCJRdWVzdGlvbiIpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKCJFeGl0PyIpOwotCQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKSBlLmRvaXQgPSBmYWxzZTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBTV1QuT0spIHJldHVybjsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX07CQotCQlMaXN0ZW5lciBhYm91dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWZpbmFsIFNoZWxsIHMgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQkJcy5zZXRUZXh0KCJBYm91dCIpOwotCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCQkJcy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzLCBTV1QuTk9ORSk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiU1dUIGFuZCBBV1QgRXhhbXBsZS4iKTsKLQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzLCBTV1QuUFVTSCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIk9LIik7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJcy5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlzLnBhY2soKTsKLQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHMuZ2V0Qm91bmRzKCk7Ci0JCQkJaW50IHggPSBwYXJlbnRCb3VuZHMueCArIChwYXJlbnRCb3VuZHMud2lkdGggLSBib3VuZHMud2lkdGgpIC8gMjsKLQkJCQlpbnQgeSA9IHBhcmVudEJvdW5kcy55ICsgKHBhcmVudEJvdW5kcy5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSAvIDI7Ci0JCQkJcy5zZXRMb2NhdGlvbih4LCB5KTsKLQkJCQlzLm9wZW4oKTsKLQkJCQl3aGlsZSAoIXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBleGl0TGlzdGVuZXIpOwotCQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbShtYiwgU1dULkNBU0NBREUpOwotCQlmaWxlSXRlbS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCQlmaWxlSXRlbS5zZXRNZW51KGZpbGVNZW51KTsKLQkJTWVudUl0ZW0gZXhpdEl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU1lbnUsIFNXVC5QVVNIKTsKLQkJZXhpdEl0ZW0uc2V0VGV4dCgiJkV4aXRcdEN0cmwrWCIpOwotCQlleGl0SXRlbS5zZXRBY2NlbGVyYXRvcihTV1QuQ09OVFJPTCArICdYJyk7Ci0JCWV4aXRJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGV4aXRMaXN0ZW5lcik7Ci0JCU1lbnVJdGVtIGFib3V0SXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTWVudSwgU1dULlBVU0gpOwotCQlhYm91dEl0ZW0uc2V0VGV4dCgiJkFib3V0XHRDdHJsK0EiKTsKLQkJYWJvdXRJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DT05UUk9MICsgJ0EnKTsKLQkJYWJvdXRJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGFib3V0TGlzdGVuZXIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQotCQlSR0IgY29sb3IgPSBzaGVsbC5nZXRCYWNrZ3JvdW5kKCkuZ2V0UkdCKCk7Ci0JCUxhYmVsIHNlcGFyYXRvcjEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUxhYmVsIGxvY2F0aW9uTGIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25MYi5zZXRUZXh0KCJMb2NhdGlvbjoiKTsKLQkJQ29tcG9zaXRlIGxvY2F0aW9uQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0JCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuRkxBVCk7Ci0JCVRvb2xJdGVtIGV4aXRUb29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWV4aXRUb29sSXRlbS5zZXRUZXh0KCImRXhpdCIpOwotCQlleGl0VG9vbEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgZXhpdExpc3RlbmVyKTsKLQkJVG9vbEl0ZW0gYWJvdXRUb29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCWFib3V0VG9vbEl0ZW0uc2V0VGV4dCgiJkFib3V0Iik7Ci0JCWFib3V0VG9vbEl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgYWJvdXRMaXN0ZW5lcik7Ci0JCUxhYmVsIHNlcGFyYXRvcjIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBUcmVlIGZpbGVUcmVlID0gbmV3IFRyZWUoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlTYXNoIHNhc2ggPSBuZXcgU2FzaChjb21wLCBTV1QuVkVSVElDQUwpOwotCQlDb21wb3NpdGUgdGFibGVDb21wID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuRU1CRURERUQpOwotCQlMYWJlbCBzZXBhcmF0b3IzID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3RhdHVzQ29tcCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5FTUJFRERFRCk7Ci0KLQkJamF2YS5hd3QuRnJhbWUgbG9jYXRpb25GcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKGxvY2F0aW9uQ29tcCk7Ci0JCWZpbmFsIGphdmEuYXd0LlRleHRGaWVsZCBsb2NhdGlvblRleHQgPSBuZXcgamF2YS5hd3QuVGV4dEZpZWxkKCk7Ci0JCWxvY2F0aW9uRnJhbWUuYWRkKGxvY2F0aW9uVGV4dCk7Ci0KLQkJamF2YS5hd3QuRnJhbWUgZmlsZVRhYmxlRnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZSh0YWJsZUNvbXApOwotCQlqYXZhLmF3dC5QYW5lbCBwYW5lbCA9IG5ldyBqYXZhLmF3dC5QYW5lbChuZXcgamF2YS5hd3QuQm9yZGVyTGF5b3V0KCkpOwotCQlmaWxlVGFibGVGcmFtZS5hZGQocGFuZWwpOwotCQlmaW5hbCBKVGFibGUgZmlsZVRhYmxlID0gbmV3IEpUYWJsZShuZXcgRmlsZVRhYmxlTW9kZWwobnVsbCkpOwotCQlmaWxlVGFibGUuc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCWZpbGVUYWJsZS5zZXRTaG93R3JpZChmYWxzZSk7Ci0JCWZpbGVUYWJsZS5jcmVhdGVEZWZhdWx0Q29sdW1uc0Zyb21Nb2RlbCgpOwotCQlKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKGZpbGVUYWJsZSk7Ci0JCXBhbmVsLmFkZChzY3JvbGxQYW5lKTsKLQotCQlqYXZhLmF3dC5GcmFtZSBzdGF0dXNGcmFtZSA9IFNXVF9BV1QubmV3X0ZyYW1lKHN0YXR1c0NvbXApOwotCQlzdGF0dXNGcmFtZS5zZXRCYWNrZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcihjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKSk7Ci0JCWZpbmFsIGphdmEuYXd0LkxhYmVsIHN0YXR1c0xhYmVsID0gbmV3IGphdmEuYXd0LkxhYmVsKCk7Ci0JCXN0YXR1c0ZyYW1lLmFkZChzdGF0dXNMYWJlbCk7Ci0JCXN0YXR1c0xhYmVsLnNldFRleHQoIlNlbGVjdCBhIGZpbGUiKTsKLQotCQlzYXNoLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULkRSQUcpIHJldHVybjsKLQkJCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKWZpbGVUcmVlLmdldExheW91dERhdGEoKTsKLQkJCQlSZWN0YW5nbGUgdHJpbSA9IGZpbGVUcmVlLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOwotCQkJCWRhdGEud2lkdGhIaW50ID0gZS54IC0gdHJpbS53aWR0aDsKLQkJCQljb21wLmxheW91dCgpOwotCQkJfQotCQl9KTsKLQotCQlGaWxlW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSByb290c1tpXTsKLQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtKGZpbGVUcmVlLCBTV1QuTk9ORSk7Ci0JCQl0cmVlSXRlbS5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdHJlZUl0ZW0uc2V0RGF0YShmaWxlKTsKLQkJCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCQl9Ci0JCWZpbGVUcmVlLmFkZExpc3RlbmVyKFNXVC5FeHBhbmQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWUuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJaWYgKGl0ZW0uZ2V0SXRlbUNvdW50KCkgPT0gMSkgewotCQkJCQlUcmVlSXRlbSBmaXJzdEl0ZW0gPSBpdGVtLmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChmaXJzdEl0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHJldHVybjsKLQkJCQkJZmlyc3RJdGVtLmRpc3Bvc2UoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUZpbGUgcm9vdCA9IChGaWxlKWl0ZW0uZ2V0RGF0YSgpOwotCQkJCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCQkJaWYgKGZpbGVzID09IG51bGwpIHJldHVybjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQl0cmVlSXRlbS5zZXRUZXh0KGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQkJCXRyZWVJdGVtLnNldERhdGEoZmlsZSk7Ci0JCQkJCQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGVUcmVlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWUuaXRlbTsKLQkJCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQkJZmluYWwgRmlsZSByb290ID0gKEZpbGUpaXRlbS5nZXREYXRhKCk7Ci0JCQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXN0YXR1c0xhYmVsLnNldFRleHQocm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCQlsb2NhdGlvblRleHQuc2V0VGV4dChyb290LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWZpbGVUYWJsZS5zZXRNb2RlbChuZXcgRmlsZVRhYmxlTW9kZWwocm9vdC5saXN0RmlsZXMoKSkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGE7CQkKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbG9jYXRpb25MYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBsb2NhdGlvblRleHQuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJbG9jYXRpb25Db21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXRvb2xCYXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJc2VwYXJhdG9yMi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQljb21wLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCXNlcGFyYXRvcjMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gNDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gc3RhdHVzTGFiZWwuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJc3RhdHVzQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7CQkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlmaWxlVHJlZS5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCXNhc2guc2V0TGF5b3V0RGF0YShkYXRhKTsJCQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXRhYmxlQ29tcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE1MGFjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxMzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogcmVuZGVyIEhUTUwgZnJvbSBtZW1vcnkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDEzNiB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJU3RyaW5nIGh0bWwgPSAiPEhUTUw+PEhFQUQ+PFRJVExFPkhUTUwgVGVzdDwvVElUTEU+PC9IRUFEPjxCT0RZPiI7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGh0bWwgKz0gIjxQPlRoaXMgaXMgbGluZSAiK2krIjwvUD4iOwotCQlodG1sICs9ICI8L0JPRFk+PC9IVE1MPiI7Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhY2Y3NDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiByZW5kZXIgSFRNTCB0aGF0IGluY2x1ZGVzIHJlbGF0aXZlIGxpbmtzIGZyb20gbWVtb3J5Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxMzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCS8qIFJlbGF0aXZlIGxpbmtzOiB1c2UgdGhlIEhUTUwgYmFzZSB0YWcgKi8KLQlTdHJpbmcgaHRtbCA9ICI8aHRtbD48aGVhZD4iKwotCQkiPGJhc2UgaHJlZj1cImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L1wiID4iKwotCQkiPHRpdGxlPkhUTUwgVGVzdDwvdGl0bGU+PC9oZWFkPiIrCi0JCSI8Ym9keT48YSBocmVmPVwiZmFxLnBocFwiPmxvY2FsIGxpbms8L2E+PC9ib2R5PjwvaHRtbD4iOwotCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzg0MjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IHNldCBpY29ucyB3aXRoIGRpZmZlcmVudCByZXNvbHV0aW9ucwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM4IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQotCQlJbWFnZSBzbWFsbCA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCQlHQyBnYyA9IG5ldyBHQyhzbWFsbCk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCWdjLmZpbGxBcmMoMCwgMCwgMTYsIDE2LCA0NSwgMjcwKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJSW1hZ2UgbGFyZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMzIsIDMyKTsKLQkJZ2MgPSBuZXcgR0MobGFyZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5maWxsQXJjKDAsIDAsIDMyLCAzMiwgNDUsIDI3MCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJCi0JCS8qIFByb3ZpZGUgZGlmZmVyZW50IHJlc29sdXRpb25zIGZvciBpY29ucyB0byBnZXQKLQkJICogaGlnaCBxdWFsaXR5IHJlbmRlcmluZyB3aGVyZXZlciB0aGUgT1MgbmVlZHMgCi0JCSAqIGxhcmdlIGljb25zLiBGb3IgZXhhbXBsZSwgdGhlIEFMVCtUQUIgd2luZG93IAotCQkgKiBvbiBjZXJ0YWluIHN5c3RlbXMgdXNlcyBhIGxhcmdlciBpY29uLgotCQkgKi8KLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIlNtYWxsIGFuZCBMYXJnZSBpY29ucyIpOwotCQlzaGVsbC5zZXRJbWFnZXMobmV3IEltYWdlW10ge3NtYWxsLCBsYXJnZX0pOwotCi0JCS8qIE5vIGxhcmdlIGljb246IHRoZSBPUyB3aWxsIHNjYWxlIHVwIHRoZQotCQkgKiBzbWFsbCBpY29uIHdoZW4gaXQgbmVlZHMgYSBsYXJnZSBvbmUuCi0JCSAqLwotCQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRUZXh0KCJTbWFsbCBpY29uIik7Ci0JCXNoZWxsMi5zZXRJbWFnZShzbWFsbCk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXNoZWxsMi5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCXNtYWxsLmRpc3Bvc2UoKTsKLQkJbGFyZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTM5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTFmNzUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDEzOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGhpcyBzbmlwcGV0IHdhcyBhZGFwdGVkIGZyb20gb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlVXRpbGl0aWVzIGluIAotICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS9vcmcuZWNsaXBzZS5kcmF3MmQvP2N2c3Jvb3Q9VG9vbHNfUHJvamVjdAotICogYnkgUHJhdGlrIFNoYWguCi0gKgotICogZXhhbXBsZSBzbmlwcGV0OiByb3RhdGUgYW5kIGZsaXAgYW4gaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTM5IHsJCi0KLXN0YXRpYyBJbWFnZURhdGEgcm90YXRlKEltYWdlRGF0YSBzcmNEYXRhLCBpbnQgZGlyZWN0aW9uKSB7Ci0JaW50IGJ5dGVzUGVyUGl4ZWwgPSBzcmNEYXRhLmJ5dGVzUGVyTGluZSAvIHNyY0RhdGEud2lkdGg7Ci0JaW50IGRlc3RCeXRlc1BlckxpbmUgPSAoZGlyZWN0aW9uID09IFNXVC5ET1dOKT8gc3JjRGF0YS53aWR0aCAqIGJ5dGVzUGVyUGl4ZWwgOiBzcmNEYXRhLmhlaWdodCAqIGJ5dGVzUGVyUGl4ZWw7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVsoZGlyZWN0aW9uID09IFNXVC5ET1dOKT8gc3JjRGF0YS5oZWlnaHQgKiBkZXN0Qnl0ZXNQZXJMaW5lIDogc3JjRGF0YS53aWR0aCAqIGRlc3RCeXRlc1BlckxpbmVdOwotCWludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0JZm9yIChpbnQgc3JjWSA9IDA7IHNyY1kgPCBzcmNEYXRhLmhlaWdodDsgc3JjWSsrKSB7Ci0JCWZvciAoaW50IHNyY1ggPSAwOyBzcmNYIDwgc3JjRGF0YS53aWR0aDsgc3JjWCsrKSB7Ci0JCQlpbnQgZGVzdFggPSAwLCBkZXN0WSA9IDAsIGRlc3RJbmRleCA9IDAsIHNyY0luZGV4ID0gMDsKLQkJCXN3aXRjaCAoZGlyZWN0aW9uKXsKLQkJCQljYXNlIFNXVC5MRUZUOiAvLyBsZWZ0IDkwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNZOwotCQkJCQlkZXN0WSA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQkJd2lkdGggPSBzcmNEYXRhLmhlaWdodDsKLQkJCQkJaGVpZ2h0ID0gc3JjRGF0YS53aWR0aDsgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dULlJJR0hUOiAvLyByaWdodCA5MCBkZWdyZWVzCi0JCQkJCWRlc3RYID0gc3JjRGF0YS5oZWlnaHQgLSBzcmNZIC0gMTsKLQkJCQkJZGVzdFkgPSBzcmNYOwotCQkJCQl3aWR0aCA9IHNyY0RhdGEuaGVpZ2h0OwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLndpZHRoOyAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRE9XTjogLy8gMTgwIGRlZ3JlZXMKLQkJCQkJZGVzdFggPSBzcmNEYXRhLndpZHRoIC0gc3JjWCAtIDE7Ci0JCQkJCWRlc3RZID0gc3JjRGF0YS5oZWlnaHQgLSBzcmNZIC0gMTsKLQkJCQkJd2lkdGggPSBzcmNEYXRhLndpZHRoOwotCQkJCQloZWlnaHQgPSBzcmNEYXRhLmhlaWdodDsgCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZGVzdEluZGV4ID0gKGRlc3RZICogZGVzdEJ5dGVzUGVyTGluZSkgKyAoZGVzdFggKiBieXRlc1BlclBpeGVsKTsKLQkJCXNyY0luZGV4ID0gKHNyY1kgKiBzcmNEYXRhLmJ5dGVzUGVyTGluZSkgKyAoc3JjWCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJU3lzdGVtLmFycmF5Y29weShzcmNEYXRhLmRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIGJ5dGVzUGVyUGl4ZWwpOwotCQl9Ci0JfQotCS8vIGRlc3RCeXRlc1BlckxpbmUgaXMgdXNlZCBhcyBzY2FubGluZVBhZCB0byBlbnN1cmUgdGhhdCBubyBwYWRkaW5nIGlzIHJlcXVpcmVkCi0JcmV0dXJuIG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgc3JjRGF0YS5kZXB0aCwgc3JjRGF0YS5wYWxldHRlLCBkZXN0Qnl0ZXNQZXJMaW5lLCBuZXdEYXRhKTsKLX0KLXN0YXRpYyBJbWFnZURhdGEgZmxpcChJbWFnZURhdGEgc3JjRGF0YSwgYm9vbGVhbiB2ZXJ0aWNhbCkgewotCWludCBieXRlc1BlclBpeGVsID0gc3JjRGF0YS5ieXRlc1BlckxpbmUgLyBzcmNEYXRhLndpZHRoOwotCWludCBkZXN0Qnl0ZXNQZXJMaW5lID0gc3JjRGF0YS53aWR0aCAqIGJ5dGVzUGVyUGl4ZWw7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtzcmNEYXRhLmRhdGEubGVuZ3RoXTsKLQlmb3IgKGludCBzcmNZID0gMDsgc3JjWSA8IHNyY0RhdGEuaGVpZ2h0OyBzcmNZKyspIHsKLQkJZm9yIChpbnQgc3JjWCA9IDA7IHNyY1ggPCBzcmNEYXRhLndpZHRoOyBzcmNYKyspIHsKLQkJCWludCBkZXN0WCA9IDAsIGRlc3RZID0gMCwgZGVzdEluZGV4ID0gMCwgc3JjSW5kZXggPSAwOwotCQkJaWYgKHZlcnRpY2FsKXsKLQkJCQlkZXN0WCA9IHNyY1g7Ci0JCQkJZGVzdFkgPSBzcmNEYXRhLmhlaWdodCAtIHNyY1kgLSAxOwotCQkJfSBlbHNlIHsKLQkJCQlkZXN0WCA9IHNyY0RhdGEud2lkdGggLSBzcmNYIC0gMTsKLQkJCQlkZXN0WSA9IHNyY1k7IAotCQkJfQotCQkJZGVzdEluZGV4ID0gKGRlc3RZICogZGVzdEJ5dGVzUGVyTGluZSkgKyAoZGVzdFggKiBieXRlc1BlclBpeGVsKTsKLQkJCXNyY0luZGV4ID0gKHNyY1kgKiBzcmNEYXRhLmJ5dGVzUGVyTGluZSkgKyAoc3JjWCAqIGJ5dGVzUGVyUGl4ZWwpOwotCQkJU3lzdGVtLmFycmF5Y29weShzcmNEYXRhLmRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIGJ5dGVzUGVyUGl4ZWwpOwotCQl9Ci0JfQotCS8vIGRlc3RCeXRlc1BlckxpbmUgaXMgdXNlZCBhcyBzY2FubGluZVBhZCB0byBlbnN1cmUgdGhhdCBubyBwYWRkaW5nIGlzIHJlcXVpcmVkCi0JcmV0dXJuIG5ldyBJbWFnZURhdGEoc3JjRGF0YS53aWR0aCwgc3JjRGF0YS5oZWlnaHQsIHNyY0RhdGEuZGVwdGgsIHNyY0RhdGEucGFsZXR0ZSwgZGVzdEJ5dGVzUGVyTGluZSwgbmV3RGF0YSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQotCS8vIGNyZWF0ZSBhbiBpbWFnZSB3aXRoIHRoZSB3b3JkICJoZWxsbyIgb24gaXQKLQlmaW5hbCBJbWFnZSBpbWFnZTAgPSBuZXcgSW1hZ2UoZGlzcGxheSwgNTAsIDMwKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZTApOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShpbWFnZTAuZ2V0Qm91bmRzKCkpOwotCWdjLmRyYXdTdHJpbmcoImhlbGxvIiwJNSwgNSwgdHJ1ZSk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCUltYWdlRGF0YSBkYXRhID0gaW1hZ2UwLmdldEltYWdlRGF0YSgpOwotCS8vIHJvdGF0ZSBhbmQgZmxpcCB0aGlzIGltYWdlCi0JZmluYWwgSW1hZ2UgaW1hZ2UxID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuTEVGVCkpOwotCWZpbmFsIEltYWdlIGltYWdlMiA9IG5ldyBJbWFnZShkaXNwbGF5LCByb3RhdGUoZGF0YSwgU1dULlJJR0hUKSk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UzID0gbmV3IEltYWdlKGRpc3BsYXksIHJvdGF0ZShkYXRhLCBTV1QuRE9XTikpOwotCWZpbmFsIEltYWdlIGltYWdlNCA9IG5ldyBJbWFnZShkaXNwbGF5LCBmbGlwKGRhdGEsIHRydWUpKTsKLQlmaW5hbCBJbWFnZSBpbWFnZTUgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZmxpcChkYXRhLCBmYWxzZSkpOwotCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JLy8gZHJhdyB0aGUgcmVzdWx0cyBvbiB0aGUgc2hlbGwKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCl7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2MuZHJhd1RleHQoIk9yaWdpbmFsIEltYWdlOiIsIDEwLCAxMCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTAsIDEwLCA0MCk7Ci0JCQllLmdjLmRyYXdUZXh0KCJMZWZ0LCBSaWdodCwgMTgwOiIsIDEwLCA4MCwgdHJ1ZSk7Ci0JCQllLmdjLmRyYXdJbWFnZShpbWFnZTEsIDEwLCAxMTApOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UyLCA1MCwgMTEwKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlMywgOTAsIDExMCk7Ci0JCQllLmdjLmRyYXdUZXh0KCJGbGlwcGVkIFZlcnRpY2FsLCBIb3Jpem9udGFsOiIsIDEwLCAxNzAsIHRydWUpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2U0LCAxMCwgMjAwKTsKLQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlNSwgNzAsIDIwMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpbWFnZTAuZGlzcG9zZSgpOwotCWltYWdlMS5kaXNwb3NlKCk7Ci0JaW1hZ2UyLmRpc3Bvc2UoKTsKLQlpbWFnZTMuZGlzcG9zZSgpOwotCWltYWdlNC5kaXNwb3NlKCk7Ci0JaW1hZ2U1LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmM2YmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgbW91c2UgZW50ZXIsIGV4aXQgYW5kIGhvdmVyIGV2ZW50cwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUgKDEwMCwgMTAwKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRW50ZXIsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJFTlRFUiIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZUV4aXQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJFWElUIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlSG92ZXIsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJIT1ZFUiIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNlOGNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBDb29sQmFyIGV4YW1wbGUgc25pcHBldDogZHJvcC1kb3duIGEgY2hldnJvbiBtZW51IGNvbnRhaW5pbmcgaGlkZGVuIHRvb2wgaXRlbXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0MCB7Ci0Jc3RhdGljIERpc3BsYXkgZGlzcGxheTsKLQlzdGF0aWMgU2hlbGwgc2hlbGw7Ci0Jc3RhdGljIENvb2xCYXIgY29vbEJhcjsKLQlzdGF0aWMgTWVudSBjaGV2cm9uTWVudSA9IG51bGw7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQljb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JY29vbEJhci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhcihjb29sQmFyLCBTV1QuRkxBVCB8IFNXVC5XUkFQKTsKLQlpbnQgbWluV2lkdGggPSAwOwotCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCWludCB3aWR0aCA9IDA7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQoIkIiICsgaik7Ci0JCXdpZHRoID0gaXRlbS5nZXRXaWR0aCgpOwotCQkvKiBmaW5kIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHRvb2wgKi8KLQkJaWYgKHdpZHRoID4gbWluV2lkdGgpIG1pbldpZHRoID0gd2lkdGg7Ci0JfQotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCWNvb2xJdGVtLnNldENvbnRyb2wodG9vbEJhcik7Ci0JUG9pbnQgc2l6ZSA9IHRvb2xCYXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQlQb2ludCBjb29sU2l6ZSA9IGNvb2xJdGVtLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSk7Ci0JY29vbEl0ZW0uc2V0TWluaW11bVNpemUobWluV2lkdGgsIGNvb2xTaXplLnkpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoY29vbFNpemUpOwotCWNvb2xJdGVtLnNldFNpemUoY29vbFNpemUpOwotCWNvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQlDb29sSXRlbSBpdGVtID0gKENvb2xJdGVtKSBldmVudC53aWRnZXQ7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtLmdldEJvdW5kcyAoKTsKLQkJCQlQb2ludCBwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludChpdGVtQm91bmRzLngsIGl0ZW1Cb3VuZHMueSkpOwotCQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQkJaXRlbUJvdW5kcy55ID0gcHQueTsKLQkJCQlUb29sQmFyIGJhciA9IChUb29sQmFyKSBpdGVtLmdldENvbnRyb2wgKCk7Ci0JCQkJVG9vbEl0ZW1bXSB0b29scyA9IGJhci5nZXRJdGVtcyAoKTsKLQkJCQkKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKGkgPCB0b29scy5sZW5ndGgpIHsKLQkJCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJCXB0ID0gYmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEJvdW5kcy54LCB0b29sQm91bmRzLnkpKTsKLQkJCQkJdG9vbEJvdW5kcy54ID0gcHQueDsKLQkJCQkJdG9vbEJvdW5kcy55ID0gcHQueTsKLQkJCQkJCi0JCQkJCS8qIEZpZ3VyZSBvdXQgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgdG9vbCBieSBsb29raW5nIGF0IHRoZQotCQkJCQkgKiBpbnRlcnNlY3Rpb24gb2YgdGhlIHRvb2wgYm91bmRzIHdpdGggdGhlIGNvb2wgaXRlbSBib3VuZHMuICovCi0JCQkgIAkJUmVjdGFuZ2xlIGludGVyc2VjdGlvbiA9IGl0ZW1Cb3VuZHMuaW50ZXJzZWN0aW9uICh0b29sQm91bmRzKTsKLQkJCSAgCQkKLQkJCQkJLyogSWYgdGhlIHRvb2wgaXMgbm90IGNvbXBsZXRlbHkgd2l0aGluIHRoZSBjb29sIGl0ZW0gYm91bmRzLCB0aGVuIGl0Ci0JCQkJCSAqIGlzIHBhcnRpYWxseSBoaWRkZW4sIGFuZCBhbGwgcmVtYWluaW5nIHRvb2xzIGFyZSBjb21wbGV0ZWx5IGhpZGRlbi4gKi8KLQkJCSAgCQlpZiAoIWludGVyc2VjdGlvbi5lcXVhbHMgKHRvb2xCb3VuZHMpKSBicmVhazsKLQkJCSAgCQlpKys7Ci0JCQkJfQotCQkJCQotCQkJCS8qIENyZWF0ZSBhIG1lbnUgd2l0aCBpdGVtcyBmb3IgZWFjaCBvZiB0aGUgY29tcGxldGVseSBoaWRkZW4gYnV0dG9ucy4gKi8KLQkJCQlpZiAoY2hldnJvbk1lbnUgIT0gbnVsbCkgY2hldnJvbk1lbnUuZGlzcG9zZSgpOwotCQkJCWNoZXZyb25NZW51ID0gbmV3IE1lbnUgKGNvb2xCYXIpOwotCQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKGNoZXZyb25NZW51LCBTV1QuUFVTSCk7Ci0JCQkJCW1lbnVJdGVtLnNldFRleHQgKHRvb2xzW2pdLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8qIERyb3AgZG93biB0aGUgbWVudSBiZWxvdyB0aGUgY2hldnJvbiwgd2l0aCB0aGUgbGVmdCBlZGdlcyBhbGlnbmVkLiAqLwotCQkJCXB0ID0gY29vbEJhci50b0Rpc3BsYXkobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQljaGV2cm9uTWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJY2hldnJvbk1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYTFlNmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBJbWFnZSBleGFtcGxlIHNuaXBwZXQ6IGRpc3BsYXkgYW4gYW5pbWF0ZWQgR0lGCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQxIHsKLQlzdGF0aWMgRGlzcGxheSBkaXNwbGF5OwotCXN0YXRpYyBTaGVsbCBzaGVsbDsKLQlzdGF0aWMgR0Mgc2hlbGxHQzsKLQlzdGF0aWMgQ29sb3Igc2hlbGxCYWNrZ3JvdW5kOwotCXN0YXRpYyBJbWFnZUxvYWRlciBsb2FkZXI7Ci0Jc3RhdGljIEltYWdlRGF0YVtdIGltYWdlRGF0YUFycmF5OwotCXN0YXRpYyBUaHJlYWQgYW5pbWF0ZVRocmVhZDsKLQlzdGF0aWMgSW1hZ2UgaW1hZ2U7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlR0lGQmFja2dyb3VuZCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCXNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRTaXplKDMwMCwgMzAwKTsKLQkJc2hlbGwub3BlbigpOwotCQlzaGVsbEdDID0gbmV3IEdDKHNoZWxsKTsKLQkJc2hlbGxCYWNrZ3JvdW5kID0gc2hlbGwuZ2V0QmFja2dyb3VuZCgpOwotCi0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLmdpZiJ9KTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJdHJ5IHsKLQkJCQlpbWFnZURhdGFBcnJheSA9IGxvYWRlci5sb2FkKGZpbGVOYW1lKTsKLQkJCQlpZiAoaW1hZ2VEYXRhQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQlhbmltYXRlVGhyZWFkID0gbmV3IFRocmVhZCgiQW5pbWF0aW9uIikgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCS8qIENyZWF0ZSBhbiBvZmYtc2NyZWVuIGltYWdlIHRvIGRyYXcgb24sIGFuZCBmaWxsIGl0IHdpdGggdGhlIHNoZWxsIGJhY2tncm91bmQuICovCi0JCQkJCQkJSW1hZ2Ugb2ZmU2NyZWVuSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5XaWR0aCwgbG9hZGVyLmxvZ2ljYWxTY3JlZW5IZWlnaHQpOwotCQkJCQkJCUdDIG9mZlNjcmVlbkltYWdlR0MgPSBuZXcgR0Mob2ZmU2NyZWVuSW1hZ2UpOwotCQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChzaGVsbEJhY2tncm91bmQpOwotCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZmlsbFJlY3RhbmdsZSgwLCAwLCBsb2FkZXIubG9naWNhbFNjcmVlbldpZHRoLCBsb2FkZXIubG9naWNhbFNjcmVlbkhlaWdodCk7Ci0JCQkJCQkJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCS8qIENyZWF0ZSB0aGUgZmlyc3QgaW1hZ2UgYW5kIGRyYXcgaXQgb24gdGhlIG9mZi1zY3JlZW4gaW1hZ2UuICovCi0JCQkJCQkJCWludCBpbWFnZURhdGFJbmRleCA9IDA7CQotCQkJCQkJCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2VEYXRhQXJyYXlbaW1hZ2VEYXRhSW5kZXhdOwotCQkJCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCQkJCQkJCW9mZlNjcmVlbkltYWdlR0MuZHJhd0ltYWdlKAotCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQsCi0JCQkJCQkJCQlpbWFnZURhdGEueCwKLQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJaW1hZ2VEYXRhLndpZHRoLAotCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCk7Ci0KLQkJCQkJCQkJLyogTm93IGxvb3AgdGhyb3VnaCB0aGUgaW1hZ2VzLCBjcmVhdGluZyBhbmQgZHJhd2luZyBlYWNoIG9uZQotCQkJCQkJCQkgKiBvbiB0aGUgb2ZmLXNjcmVlbiBpbWFnZSBiZWZvcmUgZHJhd2luZyBpdCBvbiB0aGUgc2hlbGwuICovCi0JCQkJCQkJCWludCByZXBlYXRDb3VudCA9IGxvYWRlci5yZXBlYXRDb3VudDsKLQkJCQkJCQkJd2hpbGUgKGxvYWRlci5yZXBlYXRDb3VudCA9PSAwIHx8IHJlcGVhdENvdW50ID4gMCkgewotCQkJCQkJCQkJc3dpdGNoIChpbWFnZURhdGEuZGlzcG9zYWxNZXRob2QpIHsKLQkJCQkJCQkJCWNhc2UgU1dULkRNX0ZJTExfQkFDS0dST1VORDoKLQkJCQkJCQkJCQkvKiBGaWxsIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYmVmb3JlIGRyYXdpbmcuICovCi0JCQkJCQkJCQkJQ29sb3IgYmdDb2xvciA9IG51bGw7Ci0JCQkJCQkJCQkJaWYgKHVzZUdJRkJhY2tncm91bmQgJiYgbG9hZGVyLmJhY2tncm91bmRQaXhlbCAhPSAtMSkgewotCQkJCQkJCQkJCQliZ0NvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIGltYWdlRGF0YS5wYWxldHRlLmdldFJHQihsb2FkZXIuYmFja2dyb3VuZFBpeGVsKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCW9mZlNjcmVlbkltYWdlR0Muc2V0QmFja2dyb3VuZChiZ0NvbG9yICE9IG51bGwgPyBiZ0NvbG9yIDogc2hlbGxCYWNrZ3JvdW5kKTsKLQkJCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmZpbGxSZWN0YW5nbGUoaW1hZ2VEYXRhLngsIGltYWdlRGF0YS55LCBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCWlmIChiZ0NvbG9yICE9IG51bGwpIGJnQ29sb3IuZGlzcG9zZSgpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJY2FzZSBTV1QuRE1fRklMTF9QUkVWSU9VUzoKLQkJCQkJCQkJCQkvKiBSZXN0b3JlIHRoZSBwcmV2aW91cyBpbWFnZSBiZWZvcmUgZHJhd2luZy4gKi8KLQkJCQkJCQkJCQlvZmZTY3JlZW5JbWFnZUdDLmRyYXdJbWFnZSgKLQkJCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJCTAsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLmhlaWdodCwKLQkJCQkJCQkJCQkJaW1hZ2VEYXRhLngsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJCQlpbWFnZURhdGEud2lkdGgsCi0JCQkJCQkJCQkJCWltYWdlRGF0YS5oZWlnaHQpOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJCWltYWdlRGF0YUluZGV4ID0gKGltYWdlRGF0YUluZGV4ICsgMSkgJSBpbWFnZURhdGFBcnJheS5sZW5ndGg7Ci0JCQkJCQkJCQlpbWFnZURhdGEgPSBpbWFnZURhdGFBcnJheVtpbWFnZURhdGFJbmRleF07Ci0JCQkJCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkJCQkJCQkJb2ZmU2NyZWVuSW1hZ2VHQy5kcmF3SW1hZ2UoCi0JCQkJCQkJCQkJaW1hZ2UsCi0JCQkJCQkJCQkJMCwKLQkJCQkJCQkJCQkwLAotCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0LAotCQkJCQkJCQkJCWltYWdlRGF0YS54LAotCQkJCQkJCQkJCWltYWdlRGF0YS55LAotCQkJCQkJCQkJCWltYWdlRGF0YS53aWR0aCwKLQkJCQkJCQkJCQlpbWFnZURhdGEuaGVpZ2h0KTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogRHJhdyB0aGUgb2ZmLXNjcmVlbiBpbWFnZSB0byB0aGUgc2hlbGwuICovCi0JCQkJCQkJCQlzaGVsbEdDLmRyYXdJbWFnZShvZmZTY3JlZW5JbWFnZSwgMCwgMCk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCS8qIFNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGRlbGF5IHRpbWUgKGFkZGluZyBjb21tb25seS11c2VkIHNsb3ctZG93biBmdWRnZSBmYWN0b3JzKS4gKi8KLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaW50IG1zID0gaW1hZ2VEYXRhLmRlbGF5VGltZSAqIDEwOwotCQkJCQkJCQkJCWlmIChtcyA8IDIwKSBtcyArPSAzMDsKLQkJCQkJCQkJCQlpZiAobXMgPCAzMCkgbXMgKz0gMTA7Ci0JCQkJCQkJCQkJVGhyZWFkLnNsZWVwKG1zKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJLyogSWYgd2UgaGF2ZSBqdXN0IGRyYXduIHRoZSBsYXN0IGltYWdlLCBkZWNyZW1lbnQgdGhlIHJlcGVhdCBjb3VudCBhbmQgc3RhcnQgYWdhaW4uICovCi0JCQkJCQkJCQlpZiAoaW1hZ2VEYXRhSW5kZXggPT0gaW1hZ2VEYXRhQXJyYXkubGVuZ3RoIC0gMSkgcmVwZWF0Q291bnQtLTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBhbmltYXRpbmcgdGhlIEdJRiIpOwotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCWlmIChvZmZTY3JlZW5JbWFnZSAhPSBudWxsICYmICFvZmZTY3JlZW5JbWFnZS5pc0Rpc3Bvc2VkKCkpIG9mZlNjcmVlbkltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJCQkJaWYgKG9mZlNjcmVlbkltYWdlR0MgIT0gbnVsbCAmJiAhb2ZmU2NyZWVuSW1hZ2VHQy5pc0Rpc3Bvc2VkKCkpIG9mZlNjcmVlbkltYWdlR0MuZGlzcG9zZSgpOwotCQkJCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiAhaW1hZ2UuaXNEaXNwb3NlZCgpKSBpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlhbmltYXRlVGhyZWFkLnNldERhZW1vbih0cnVlKTsKLQkJCQkJYW5pbWF0ZVRocmVhZC5zdGFydCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgdGhlIEdJRiIpOwotCQkJfQotCQl9Ci0KLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhZjE0Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBVSSBBdXRvbWF0aW9uIChmb3IgdGVzdGluZyB0b29scykgc25pcHBldDogcG9zdCBtb3VzZSBldmVudHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0MiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLFNXVC5OT05FKTsKLQlidXR0b24uc2V0U2l6ZSgxMDAsMTAwKTsKLQlidXR0b24uc2V0VGV4dCgiQ2xpY2siKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZSBEb3duIChidXR0b246ICIgKyBlLmJ1dHRvbiArICIgeDogIiArIGUueCArICIgeTogIiArIGUueSArICIpIik7Ci0JCX0KLQl9KTsKLQlmaW5hbCBQb2ludCBwdCA9IGRpc3BsYXkubWFwKHNoZWxsLCBudWxsLCA1MCwgNTApOwotCW5ldyBUaHJlYWQoKXsKLQkJRXZlbnQgZXZlbnQ7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMzAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9Ci0JCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0JCQlldmVudC54ID0gcHQueDsKLQkJCWV2ZW50LnkgPSBwdC55OwotCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvd247Ci0JCQlldmVudC5idXR0b24gPSAxOwotCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDMwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJfQkKLQl9LnN0YXJ0KCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRhOTI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFRyYXkgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhbiBpY29uIHdpdGggYSBwb3B1cCBtZW51IG9uIHRoZSBzeXN0ZW0gdHJheQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTQzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlmaW5hbCBUcmF5IHRyYXkgPSBkaXNwbGF5LmdldFN5c3RlbVRyYXkgKCk7Ci0JaWYgKHRyYXkgPT0gbnVsbCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJUaGUgc3lzdGVtIHRyYXkgaXMgbm90IGF2YWlsYWJsZSIpOwotCX0gZWxzZSB7Ci0JCWZpbmFsIFRyYXlJdGVtIGl0ZW0gPSBuZXcgVHJheUl0ZW0gKHRyYXksIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiU1dUIFRyYXlJdGVtIik7Ci0JCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzaG93Iik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuSGlkZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaGlkZSIpOwotCQkJfQotCQl9KTsKLQkJaXRlbS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVmYXVsdCBzZWxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlNZW51SXRlbSBtaSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJbWkuc2V0VGV4dCAoIkl0ZW0iICsgaSk7Ci0JCQltaS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gIiArIGV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoaSA9PSAwKSBtZW51LnNldERlZmF1bHRJdGVtKG1pKTsKLQkJfQotCQlpdGVtLmFkZExpc3RlbmVyIChTV1QuTWVudURldGVjdCwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCW1lbnUuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JfQotCXNoZWxsLnNldEJvdW5kcyg1MCwgNTAsIDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2OTYyNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggMSwwMDAsMDAwIGl0ZW1zIChsYXp5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NCB7Ci0KLXN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxMDAwMDAwOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mIChpdGVtKTsKLQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGluZGV4KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbS5nZXRUZXh0ICgpKTsKLQkJfQotCX0pOwotCXRhYmxlLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhICgyMDAsIDIwMCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQWRkIEl0ZW1zIik7Ci0JZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5OT05FKTsKLQlidXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCXRhYmxlLnNldEl0ZW1Db3VudCAoQ09VTlQpOwotCQkJbG9uZyB0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcyAoKTsKLQkJCWxhYmVsLnNldFRleHQgKCJJdGVtczogIiArIENPVU5UICsgIiwgVGltZTogIiArICh0MiAtIHQxKSArICIgKG1zKSIpOwotCQkJc2hlbGwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzY1MGYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHRMYXlvdXQgZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGludGVybmF0aW9uYWxpemVkIHN0eWxlZCB0ZXh0IG9uIGEgc2hlbGwKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJCi0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5CT0xEKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksICJNUyBNaW5jaG8iLCAyMCwgU1dULklUQUxJQyk7Ci0JCUZvbnQgZm9udDMgPSBuZXcgRm9udChkaXNwbGF5LCAiQXJhYmljIFRyYW5zcGFyZW50IiwgMTgsIFNXVC5OT1JNQUwpOwotCQkKLQkJQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQlDb2xvciBncmVlbiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQkJQ29sb3IgeWVsbG93ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKTsKLQkJQ29sb3IgZ3JheSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpOwotCQkKLQkJZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQkJVGV4dFN0eWxlIHN0eWxlMSA9IG5ldyBUZXh0U3R5bGUoZm9udDEsIHllbGxvdywgYmx1ZSk7Ci0JCVRleHRTdHlsZSBzdHlsZTIgPSBuZXcgVGV4dFN0eWxlKGZvbnQyLCBncmVlbiwgbnVsbCk7Ci0JCVRleHRTdHlsZSBzdHlsZTMgPSBuZXcgVGV4dFN0eWxlKGZvbnQzLCBibHVlLCBncmF5KTsKLQkJCi0JCWxheW91dC5zZXRUZXh0KCJFbmdsaXNoIFx1NjVFNVx1NjcyQ1x1OEE5RSAgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRBXHUwNjUxXHUwNjI5Iik7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTEsIDAsIDYpOwotCQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCA4LCAxMCk7Ci0JCWxheW91dC5zZXRTdHlsZShzdHlsZTMsIDEzLCAyMSk7Ci0JCQkJCQotCQlzaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIDEwLCAxMCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7CQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7Ci0JCWZvbnQzLmRpc3Bvc2UoKTsKLQkJbGF5b3V0LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjIyOWFmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gIAotLyoKLSAqIFVJIEF1dG9tYXRpb24gKGZvciB0ZXN0aW5nIHRvb2xzKSBzbmlwcGV0OiBwb3N0IGtleSBldmVudHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFNpemUodGV4dC5jb21wdXRlU2l6ZSgxNTAsIFNXVC5ERUZBVUxUKSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQluZXcgVGhyZWFkKCl7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJU3RyaW5nIHN0cmluZyA9ICJMb3ZlIHRoZSBtZXRob2QuIjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQljaGFyIGNoID0gc3RyaW5nLmNoYXJBdChpKTsKLQkJCQlib29sZWFuIHNoaWZ0ID0gQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGNoKTsKLQkJCQljaCA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaCk7Ci0JCQkJaWYgKHNoaWZ0KSB7Ci0JCQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5RG93bjsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IFNXVC5TSElGVDsKLQkJCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsJCi0JCQkJfQotCQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQkJCWV2ZW50LmNoYXJhY3RlciA9IGNoOwotCQkJCWRpc3BsYXkucG9zdChldmVudCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCQkJZGlzcGxheS5wb3N0KGV2ZW50KTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMTAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQotCQkJCWlmIChzaGlmdCkgewotCQkJCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQkJCQlldmVudC50eXBlID0gU1dULktleVVwOwotCQkJCQlldmVudC5rZXlDb2RlID0gU1dULlNISUZUOwotCQkJCQlkaXNwbGF5LnBvc3QoZXZlbnQpOwkKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfS5zdGFydCgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyOWQ1Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IHN0b3AgQ1IgZnJvbSBnb2luZyB0byB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0NyAgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JY29tYm8uc2V0VGV4dCgiSGVyZSBpcyBzb21lIHRleHQiKTsKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29tYm8gZGVmYXVsdCBzZWxlY3RlZCAob3ZlcnJpZGVzIGRlZmF1bHQgYnV0dG9uKSIpOwotCQl9Ci0JfSk7Ci0JY29tYm8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJaWYgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9SRVRVUk4pIHsKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQllLmRldGFpbCA9IFNXVC5UUkFWRVJTRV9OT05FOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiT2siKTsKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnV0dG9uIHNlbGVjdGVkIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk1YzI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGV4dCBleGFtcGxlIHNuaXBwZXQ6IGNoZWNrIGlmIHRoZSBicm93c2VyIGlzIGF2YWlsYWJsZSBvciBub3QKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0OCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJLyogVGhlIEJyb3dzZXIgd2lkZ2V0IHRocm93cyBhbiBTV1RFcnJvciBpZiBpdCBmYWlscyB0bwotCQkJICogaW5zdGFudGlhdGUgcHJvcGVybHkuIEFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIGNhdGNoCi0JCQkgKiB0aGlzIFNXVEVycm9yIGFuZCBkaXNhYmxlIGFueSBmZWF0dXJlIHJlcXVpcmluZyB0aGUKLQkJCSAqIEJyb3dzZXIgd2lkZ2V0LgotCQkJICogUGxhdGZvcm0gcmVxdWlyZW1lbnRzIGZvciB0aGUgU1dUIEJyb3dzZXIgd2lkZ2V0IGFyZSBhdmFpbGFibGUKLQkJCSAqIGZyb20gdGhlIFNXVCBGQVEgd2Vic2l0ZS4gCi0JCQkgKi8KLQkJfQotCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkvKiBUaGUgQnJvd3NlciB3aWRnZXQgY2FuIGJlIHVzZWQgKi8KLQkJCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JCX0KLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM2MzE1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IHBsYWNlIGEgcHJvZ3Jlc3MgYmFyIGluIGEgdGFibGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE0OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUgKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGk9MDsgaTwyOyBpKyspIHsKLQkJCW5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJfQotCQl0YWJsZS5nZXRDb2x1bW4gKDApLnNldFRleHQgKCJUYXNrIik7Ci0JCXRhYmxlLmdldENvbHVtbiAoMSkuc2V0VGV4dCAoIlByb2dyZXNzIik7Ci0JCWZvciAoaW50IGk9MDsgaTw0MDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQgKCJUYXNrICIgKyBpKTsKLQkJCWlmICggaSAlIDUgPT0gMCkgewotCQkJCVByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhciAodGFibGUsIFNXVC5OT05FKTsKLQkJCQliYXIuc2V0U2VsZWN0aW9uIChpKTsKLQkJCQlUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IgKHRhYmxlKTsKLQkJCQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQkJCQllZGl0b3Iuc2V0RWRpdG9yIChiYXIsIGl0ZW0sIDEpOwotCQkJfQotCQl9Ci0JCXRhYmxlLmdldENvbHVtbiAoMCkucGFjayAoKTsKLQkJdGFibGUuZ2V0Q29sdW1uICgxKS5zZXRXaWR0aCAoMTI4KTsKLQkJc2hlbGwucGFjayAoKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmVkYzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVHJlZUl0ZW0gaUl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlpSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDApIC0iICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajw0OyBqKyspIHsKLQkJCVRyZWVJdGVtIGpJdGVtID0gbmV3IFRyZWVJdGVtIChpSXRlbSwgMCk7Ci0JCQlqSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDEpIC0iICsgaik7Ci0JCQlmb3IgKGludCBrPTA7IGs8NDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0ga0l0ZW0gPSBuZXcgVHJlZUl0ZW0gKGpJdGVtLCAwKTsKLQkJCQlrSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDIpIC0iICsgayk7Ci0JCQkJZm9yIChpbnQgbD0wOyBsPDQ7IGwrKykgewotCQkJCQlUcmVlSXRlbSBsSXRlbSA9IG5ldyBUcmVlSXRlbSAoa0l0ZW0sIDApOwotCQkJCQlsSXRlbS5zZXRUZXh0ICgiVHJlZUl0ZW0gKDMpIC0iICsgbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjEyZjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb29sYmFyIChyZWxheW91dCB3aGVuIHJlc2l6ZWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUwIHsKLQotc3RhdGljIGludCBpdGVtQ291bnQ7Ci1zdGF0aWMgQ29vbEl0ZW0gY3JlYXRlSXRlbShDb29sQmFyIGNvb2xCYXIsIGludCBjb3VudCkgewotICAgIFRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChpdGVtQ291bnQrKyArIiIpOwotICAgIH0KLSAgICB0b29sQmFyLnBhY2soKTsKLSAgICBQb2ludCBzaXplID0gdG9vbEJhci5nZXRTaXplKCk7Ci0gICAgQ29vbEl0ZW0gaXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRDb250cm9sKHRvb2xCYXIpOwotICAgIFBvaW50IHByZWZlcnJlZCA9IGl0ZW0uY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotICAgIGl0ZW0uc2V0UHJlZmVycmVkU2l6ZShwcmVmZXJyZWQpOwotICAgIHJldHVybiBpdGVtOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgU1dULk5PTkUpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgMyk7Ci0gICAgY3JlYXRlSXRlbShjb29sQmFyLCAyKTsKLSAgICBjcmVhdGVJdGVtKGNvb2xCYXIsIDMpOwotICAgIGNyZWF0ZUl0ZW0oY29vbEJhciwgNCk7Ci0gICAgaW50IHN0eWxlID0gU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTDsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgc3R5bGUpOwotICAgIEZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBGb3JtRGF0YSBjb29sRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGNvb2xEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgY29vbERhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLSAgICBjb29sRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgY29vbEJhci5zZXRMYXlvdXREYXRhKGNvb2xEYXRhKTsKLSAgICBjb29sQmFyLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHNoZWxsLmxheW91dCgpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgRm9ybURhdGEgdGV4dERhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICB0ZXh0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotICAgIHRleHREYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgdGV4dERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvb2xCYXIpOwotICAgIHRleHREYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YSh0ZXh0RGF0YSk7Ci0gICAgc2hlbGwub3BlbigpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYjJkZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgdmlydHVhbCB0YWJsZSBhbmQgYWRkIDEwMDAgZW50cmllcyB0byBpdCBldmVyeSA1MDAgbXMuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTUxIHsKLQotc3RhdGljIGludFtdIGRhdGEgPSBuZXcgaW50WzBdOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZJUlRVQUwpOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllLml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJaXRlbS5zZXRUZXh0KCJJdGVtICIrZGF0YVtpbmRleF0pOwotCQl9Ci0JfSk7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCQkJd2hpbGUgKGNvdW50KysgPCA1MDApIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJLy8gYWRkIDEwIHJhbmRvbSBudW1iZXJzIHRvIGFycmF5IGFuZCBzb3J0Ci0JCQkJaW50IGdyb3cgPSAxMDsKLQkJCQlpbnRbXSBuZXdEYXRhID0gbmV3IGludFtkYXRhLmxlbmd0aCArIGdyb3ddOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJCWludCBpbmRleCA9IGRhdGEubGVuZ3RoOwotCQkJCWRhdGEgPSBuZXdEYXRhOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JvdzsgaisrKSB7Ci0JCQkJCWRhdGFbaW5kZXgrK10gPSByYW5kb20ubmV4dEludCgpOwotCQkJCX0KLQkJCQlBcnJheXMuc29ydChkYXRhKTsKLQkJCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQkJdGFibGUuc2V0SXRlbUNvdW50KGRhdGEubGVuZ3RoKTsKLQkJCQkJCXRhYmxlLmNsZWFyQWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQl0cnkge1RocmVhZC5zbGVlcCg1MDApO30gY2F0Y2ggKFRocm93YWJsZSB0KSB7fQotCQkJfQotCQl9Ci0JfTsKLQl0aHJlYWQuc3RhcnQoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpIHx8IHRocmVhZC5pc0FsaXZlKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmEyZDUyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgc3RhdHVzIGxpbmUgd2hlbiBhbiBpdGVtIGlzIGFybWVkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLSAgICBGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZmluYWwgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIpOwotICAgIExpc3RlbmVyIGFybUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSkgZXZlbnQud2lkZ2V0OwotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChpdGVtLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBsYWJlbC51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgTGlzdGVuZXIgc2hvd0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgTWVudSBtZW51ID0gKE1lbnUpIGV2ZW50LndpZGdldDsKLSAgICAgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmdldFBhcmVudEl0ZW0oKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KGl0ZW0uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBsYWJlbC51cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0gICAgTGlzdGVuZXIgaGlkZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgbGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICBsYWJlbC51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgbGFiZWxEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0gICAgbGFiZWxEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0gICAgbGFiZWxEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotICAgIGxhYmVsLnNldExheW91dERhdGEobGFiZWxEYXRhKTsKLSAgICBNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0gICAgc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLSAgICBNZW51SXRlbSBmaWxlSXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0gICAgZmlsZUl0ZW0uc2V0VGV4dCgiRmlsZSIpOwotICAgIGZpbGVJdGVtLmFkZExpc3RlbmVyKFNXVC5Bcm0sIGFybUxpc3RlbmVyKTsKLSAgICBNZW51SXRlbSBlZGl0SXRlbSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0gICAgZWRpdEl0ZW0uc2V0VGV4dCgiRWRpdCIpOwotICAgIGVkaXRJdGVtLmFkZExpc3RlbmVyKFNXVC5Bcm0sIGFybUxpc3RlbmVyKTsKLSAgICBNZW51IGZpbGVNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotICAgIGZpbGVNZW51LmFkZExpc3RlbmVyKFNXVC5IaWRlLCBoaWRlTGlzdGVuZXIpOwotICAgIGZpbGVNZW51LmFkZExpc3RlbmVyKFNXVC5TaG93LCBzaG93TGlzdGVuZXIpOwotICAgIGZpbGVJdGVtLnNldE1lbnUoZmlsZU1lbnUpOwotICAgIFN0cmluZ1tdIGZpbGVTdHJpbmdzID0geyAiTmV3IiwgIkNsb3NlIiwgIkV4aXQiIH07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICBNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVNZW51LCBTV1QuUFVTSCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChmaWxlU3RyaW5nc1tpXSk7Ci0gICAgICAgIGl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIH0KLSAgICBNZW51IGVkaXRNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotICAgIGVkaXRNZW51LmFkZExpc3RlbmVyKFNXVC5IaWRlLCBoaWRlTGlzdGVuZXIpOwotICAgIGVkaXRNZW51LmFkZExpc3RlbmVyKFNXVC5TaG93LCBzaG93TGlzdGVuZXIpOwotICAgIFN0cmluZ1tdIGVkaXRTdHJpbmdzID0geyAiQ3V0IiwgIkNvcHkiLCAiUGFzdGUiIH07Ci0gICAgZWRpdEl0ZW0uc2V0TWVudShlZGl0TWVudSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICBNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtKGVkaXRNZW51LCBTV1QuUFVTSCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dChlZGl0U3RyaW5nc1tpXSk7Ci0gICAgICAgIGl0ZW0uYWRkTGlzdGVuZXIoU1dULkFybSwgYXJtTGlzdGVuZXIpOwotICAgIH0KLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjg2MmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiB1cGRhdGUgYSBzdGF0dXMgbGluZSB3aGVuIHRoZSBwb2ludGVyIGVudGVycyBhIFRvb2xJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1MyB7Ci0JCi1zdGF0aWMgU3RyaW5nIHN0YXR1c1RleHQgPSAiIjsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLSAgICBmaW5hbCBUb29sQmFyIGJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICBiYXIuc2V0Qm91bmRzKDEwLCAxMCwgMTUwLCA1MCk7Ci0gICAgZmluYWwgTGFiZWwgc3RhdHVzTGluZSA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0gICAgc3RhdHVzTGluZS5zZXRCb3VuZHMoMTAsIDkwLCAxNTAsIDMwKTsKLSAgICBuZXcgVG9vbEl0ZW0oYmFyLCBTV1QuTk9ORSkuc2V0VGV4dCgiaXRlbSAxIik7Ci0gICAgbmV3IFRvb2xJdGVtKGJhciwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0gMiIpOwotICAgIG5ldyBUb29sSXRlbShiYXIsIFNXVC5OT05FKS5zZXRUZXh0KCJpdGVtIDMiKTsKLSAgICBiYXIuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICBUb29sSXRlbSBpdGVtID0gYmFyLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBpdGVtLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RhdHVzVGV4dC5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaW5lLnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzVGV4dCA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTdjYTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IGVtYmVkIGEgSlRhYmxlIGluIFNXVCAobm8gZmxpY2tlcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmF3dC5TV1RfQVdUOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1NCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT19CQUNLR1JPVU5EIHwgU1dULkVNQkVEREVEKTsKLQkJCi0JCS8qCi0JCSogU2V0IGEgV2luZG93cyBzcGVjaWZpYyBBV1QgcHJvcGVydHkgdGhhdCBwcmV2ZW50cyBoZWF2eXdlaWdodAotCQkqIGNvbXBvbmVudHMgZnJvbSBlcmFzaW5nIHRoZWlyIGJhY2tncm91bmQuIE5vdGUgdGhhdCB0aGlzCi0JCSogaXMgYSBnbG9iYWwgcHJvcGVydHkgYW5kIGNhbm5vdCBiZSBzY29wZWQuIEl0IG1pZ2h0IG5vdCBiZQotCQkqIHN1aXRhYmxlIGZvciB5b3VyIGFwcGxpY2F0aW9uLgotCQkqLwotCQl0cnkgewotCQkJU3lzdGVtLnNldFByb3BlcnR5KCJzdW4uYXd0Lm5vZXJhc2ViYWNrZ3JvdW5kIiwidHJ1ZSIpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlcnJvcikge30KLQotCQkvKiBDcmVhdGUgYW5kIHNldHRpbmcgdXAgZnJhbWUgKi8KLQkJRnJhbWUgZnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZShjb21wb3NpdGUpOwotCQlQYW5lbCBwYW5lbCA9IG5ldyBQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpIHsKLQkJCXB1YmxpYyB2b2lkIHVwZGF0ZShqYXZhLmF3dC5HcmFwaGljcyBnKSB7Ci0JCQkJLyogRG8gbm90IGVyYXNlIHRoZSBiYWNrZ3JvdW5kICovIAotCQkJCXBhaW50KGcpOwotCQkJfQotCQl9OwotCQlmcmFtZS5hZGQocGFuZWwpOwotCQlKUm9vdFBhbmUgcm9vdCA9IG5ldyBKUm9vdFBhbmUoKTsKLQkJcGFuZWwuYWRkKHJvb3QpOwotCQlqYXZhLmF3dC5Db250YWluZXIgY29udGVudFBhbmUgPSByb290LmdldENvbnRlbnRQYW5lKCk7Ci0KLQkJLyogQ3JlYXRpbmcgY29tcG9uZW50cyAqLwotCQlpbnQgbnJvd3MgPSAxMDAwLCBuY29sdW1ucyA9IDEwOwotCQlWZWN0b3Igcm93cyA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBucm93czsgaSsrKSB7Ci0JCQlWZWN0b3Igcm93ID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuY29sdW1uczsgaisrKSB7Ci0JCQkJcm93LmFkZEVsZW1lbnQoIkl0ZW0gIiArIGkgKyAiLSIgKyBqKTsKLQkJCX0KLQkJCXJvd3MuYWRkRWxlbWVudChyb3cpOwotCQl9Ci0JCVZlY3RvciBjb2x1bW5zID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5jb2x1bW5zOyBpKyspIHsKLQkJCWNvbHVtbnMuYWRkRWxlbWVudCgiQ29sdW1uICIgKyBpKTsKLQkJfQotCQlKVGFibGUgdGFibGUgPSBuZXcgSlRhYmxlKHJvd3MsIGNvbHVtbnMpOwotCQl0YWJsZS5zZXRBdXRvUmVzaXplTW9kZShKVGFibGUuQVVUT19SRVNJWkVfT0ZGKTsKLQkJdGFibGUuY3JlYXRlRGVmYXVsdENvbHVtbnNGcm9tTW9kZWwoKTsKLQkJSlNjcm9sbFBhbmUgc2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZSh0YWJsZSk7Ci0JCWNvbnRlbnRQYW5lLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQljb250ZW50UGFuZS5hZGQoc2Nyb2xsUGFuZSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzZDhlZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBkcmF3IGFuIFggdXNpbmcgQVdUIEdyYXBoaWNzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuQ2FudmFzOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTUgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkVNQkVEREVEKTsKLQkJCi0JCS8qIERyYXcgYW4gWCB1c2luZyBBV1QgKi8KLQkJRnJhbWUgZnJhbWUgPSBTV1RfQVdULm5ld19GcmFtZShjb21wb3NpdGUpOwotCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcygpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50IChHcmFwaGljcyBnKSB7Ci0JCQkJRGltZW5zaW9uIGQgPSBnZXRTaXplKCk7Ci0JCQkJZy5kcmF3TGluZSgwLCAwLCBkLndpZHRoLCBkLmhlaWdodCk7Ci0JCQkJZy5kcmF3TGluZShkLndpZHRoLCAwLCAwLCBkLmhlaWdodCk7Ci0JCQl9Ci0JCX07Ci0JCWZyYW1lLmFkZChjYW52YXMpOwotCi0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzEwOTQ2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBjb252ZXJ0IGJldHdlZW4gU1dUIEltYWdlIGFuZCBBV1QgQnVmZmVyZWRJbWFnZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5Db2xvck1vZGVsOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkRpcmVjdENvbG9yTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuSW5kZXhDb2xvck1vZGVsOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLldyaXRhYmxlUmFzdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTYgewotCQotc3RhdGljIEJ1ZmZlcmVkSW1hZ2UgY29udmVydFRvQVdUKEltYWdlRGF0YSBkYXRhKSB7Ci0JQ29sb3JNb2RlbCBjb2xvck1vZGVsID0gbnVsbDsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gZGF0YS5wYWxldHRlOwotCWlmIChwYWxldHRlLmlzRGlyZWN0KSB7Ci0JCWNvbG9yTW9kZWwgPSBuZXcgRGlyZWN0Q29sb3JNb2RlbChkYXRhLmRlcHRoLCBwYWxldHRlLnJlZE1hc2ssIHBhbGV0dGUuZ3JlZW5NYXNrLCBwYWxldHRlLmJsdWVNYXNrKTsKLQkJQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoY29sb3JNb2RlbCwgY29sb3JNb2RlbC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpLCBmYWxzZSwgbnVsbCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzNdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJaW50IHBpeGVsID0gZGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCQlSR0IgcmdiID0gcGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotCQkJCXBpeGVsQXJyYXlbMF0gPSByZ2IucmVkOwotCQkJCXBpeGVsQXJyYXlbMV0gPSByZ2IuZ3JlZW47Ci0JCQkJcGl4ZWxBcnJheVsyXSA9IHJnYi5ibHVlOwotCQkJCXJhc3Rlci5zZXRQaXhlbHMoeCwgeSwgMSwgMSwgcGl4ZWxBcnJheSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfSBlbHNlIHsKLQkJUkdCW10gcmdicyA9IHBhbGV0dGUuZ2V0UkdCcygpOwotCQlieXRlW10gcmVkID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlieXRlW10gZ3JlZW4gPSBuZXcgYnl0ZVtyZ2JzLmxlbmd0aF07Ci0JCWJ5dGVbXSBibHVlID0gbmV3IGJ5dGVbcmdicy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJnYnMubGVuZ3RoOyBpKyspIHsKLQkJCVJHQiByZ2IgPSByZ2JzW2ldOwotCQkJcmVkW2ldID0gKGJ5dGUpcmdiLnJlZDsKLQkJCWdyZWVuW2ldID0gKGJ5dGUpcmdiLmdyZWVuOwotCQkJYmx1ZVtpXSA9IChieXRlKXJnYi5ibHVlOwotCQl9Ci0JCWlmIChkYXRhLnRyYW5zcGFyZW50UGl4ZWwgIT0gLTEpIHsKLQkJCWNvbG9yTW9kZWwgPSBuZXcgSW5kZXhDb2xvck1vZGVsKGRhdGEuZGVwdGgsIHJnYnMubGVuZ3RoLCByZWQsIGdyZWVuLCBibHVlLCBkYXRhLnRyYW5zcGFyZW50UGl4ZWwpOwotCQl9IGVsc2UgewotCQkJY29sb3JNb2RlbCA9IG5ldyBJbmRleENvbG9yTW9kZWwoZGF0YS5kZXB0aCwgcmdicy5sZW5ndGgsIHJlZCwgZ3JlZW4sIGJsdWUpOwotCQl9CQkKLQkJQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoY29sb3JNb2RlbCwgY29sb3JNb2RlbC5jcmVhdGVDb21wYXRpYmxlV3JpdGFibGVSYXN0ZXIoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQpLCBmYWxzZSwgbnVsbCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzFdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJaW50IHBpeGVsID0gZGF0YS5nZXRQaXhlbCh4LCB5KTsKLQkJCQlwaXhlbEFycmF5WzBdID0gcGl4ZWw7Ci0JCQkJcmFzdGVyLnNldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXJlZEltYWdlOwotCX0KLX0KLQotc3RhdGljIEltYWdlRGF0YSBjb252ZXJ0VG9TV1QoQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlKSB7Ci0JaWYgKGJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpIGluc3RhbmNlb2YgRGlyZWN0Q29sb3JNb2RlbCkgewotCQlEaXJlY3RDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSAoRGlyZWN0Q29sb3JNb2RlbClidWZmZXJlZEltYWdlLmdldENvbG9yTW9kZWwoKTsKLQkJUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShjb2xvck1vZGVsLmdldFJlZE1hc2soKSwgY29sb3JNb2RlbC5nZXRHcmVlbk1hc2soKSwgY29sb3JNb2RlbC5nZXRCbHVlTWFzaygpKTsKLQkJSW1hZ2VEYXRhIGRhdGEgPSBuZXcgSW1hZ2VEYXRhKGJ1ZmZlcmVkSW1hZ2UuZ2V0V2lkdGgoKSwgYnVmZmVyZWRJbWFnZS5nZXRIZWlnaHQoKSwgY29sb3JNb2RlbC5nZXRQaXhlbFNpemUoKSwgcGFsZXR0ZSk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzNdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJcmFzdGVyLmdldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJCWludCBwaXhlbCA9IHBhbGV0dGUuZ2V0UGl4ZWwobmV3IFJHQihwaXhlbEFycmF5WzBdLCBwaXhlbEFycmF5WzFdLCBwaXhlbEFycmF5WzJdKSk7Ci0JCQkJZGF0YS5zZXRQaXhlbCh4LCB5LCBwaXhlbCk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZGF0YTsJCQotCX0gZWxzZSBpZiAoYnVmZmVyZWRJbWFnZS5nZXRDb2xvck1vZGVsKCkgaW5zdGFuY2VvZiBJbmRleENvbG9yTW9kZWwpIHsKLQkJSW5kZXhDb2xvck1vZGVsIGNvbG9yTW9kZWwgPSAoSW5kZXhDb2xvck1vZGVsKWJ1ZmZlcmVkSW1hZ2UuZ2V0Q29sb3JNb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNvbG9yTW9kZWwuZ2V0TWFwU2l6ZSgpOwotCQlieXRlW10gcmVkcyA9IG5ldyBieXRlW3NpemVdOwotCQlieXRlW10gZ3JlZW5zID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCWJ5dGVbXSBibHVlcyA9IG5ldyBieXRlW3NpemVdOwotCQljb2xvck1vZGVsLmdldFJlZHMocmVkcyk7Ci0JCWNvbG9yTW9kZWwuZ2V0R3JlZW5zKGdyZWVucyk7Ci0JCWNvbG9yTW9kZWwuZ2V0Qmx1ZXMoYmx1ZXMpOwotCQlSR0JbXSByZ2JzID0gbmV3IFJHQltzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZ2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZ2JzW2ldID0gbmV3IFJHQihyZWRzW2ldICYgMHhGRiwgZ3JlZW5zW2ldICYgMHhGRiwgYmx1ZXNbaV0gJiAweEZGKTsKLQkJfQotCQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKHJnYnMpOwotCQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoYnVmZmVyZWRJbWFnZS5nZXRXaWR0aCgpLCBidWZmZXJlZEltYWdlLmdldEhlaWdodCgpLCBjb2xvck1vZGVsLmdldFBpeGVsU2l6ZSgpLCBwYWxldHRlKTsKLQkJZGF0YS50cmFuc3BhcmVudFBpeGVsID0gY29sb3JNb2RlbC5nZXRUcmFuc3BhcmVudFBpeGVsKCk7Ci0JCVdyaXRhYmxlUmFzdGVyIHJhc3RlciA9IGJ1ZmZlcmVkSW1hZ2UuZ2V0UmFzdGVyKCk7Ci0JCWludFtdIHBpeGVsQXJyYXkgPSBuZXcgaW50WzFdOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgZGF0YS53aWR0aDsgeCsrKSB7Ci0JCQkJcmFzdGVyLmdldFBpeGVsKHgsIHksIHBpeGVsQXJyYXkpOwotCQkJCWRhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWxBcnJheVswXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIGNyZWF0ZVNhbXBsZUltYWdlKERpc3BsYXkgZGlzcGxheSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwMCwgMTAwKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCWdjLmZpbGxSZWN0YW5nbGUoYm91bmRzKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JZ2MuZmlsbE92YWwoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCWdjLmRyYXdMaW5lKDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JZ2MuZHJhd0xpbmUoYm91bmRzLndpZHRoLCAwLCAwLCBib3VuZHMuaGVpZ2h0KTsKLQlnYy5kaXNwb3NlKCk7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlNXVCBJbWFnZSIpOwotCUltYWdlRGF0YSBkYXRhOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gYXJnc1swXTsKLQkJZGF0YSA9IG5ldyBJbWFnZURhdGEoZmlsZU5hbWUpOwotCX0gZWxzZSB7Ci0JCWRhdGEgPSBjcmVhdGVTYW1wbGVJbWFnZShkaXNwbGF5KTsKLQl9Ci0JZmluYWwgSW1hZ2Ugc3d0SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZmluYWwgQnVmZmVyZWRJbWFnZSBhd3RJbWFnZSA9IGNvbnZlcnRUb0FXVChkYXRhKTsKLQlmaW5hbCBJbWFnZSBzd3RJbWFnZTIgPSBuZXcgSW1hZ2UoZGlzcGxheSwgY29udmVydFRvU1dUKGF3dEltYWdlKSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWludCB5ID0gMTA7Ci0JCQlpZiAoc3d0SW1hZ2UgIT0gbnVsbCkgewotCQkJCWUuZ2MuZHJhd0ltYWdlKHN3dEltYWdlLCAxMCwgeSk7Ci0JCQkJeSArPSBzd3RJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQgKyAxMDsKLQkJCX0KLQkJCWlmIChzd3RJbWFnZTIgIT0gbnVsbCkgewotCQkJCWUuZ2MuZHJhd0ltYWdlKHN3dEltYWdlMiwgMTAsIHkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JRnJhbWUgZnJhbWUgPSBuZXcgRnJhbWUoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCWlmIChhd3RJbWFnZSAhPSBudWxsKSB7Ci0JCQkJZy5kcmF3SW1hZ2UoYXd0SW1hZ2UsIDEwICsgaW5zZXRzLmxlZnQsIDEwICsgaW5zZXRzLnRvcCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWZyYW1lLnNldFRpdGxlKCJBV1QgSW1hZ2UiKTsKLQlzaGVsbC5zZXRMb2NhdGlvbig1MCwgNTApOwotCVJlY3RhbmdsZSBib3VuZHMgPSBzd3RJbWFnZS5nZXRCb3VuZHMoKTsKLQlzaGVsbC5zZXRTaXplKGJvdW5kcy53aWR0aCArIDUwLCBib3VuZHMuaGVpZ2h0ICogMiArIDEwMCk7Ci0JUG9pbnQgc2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLQlQb2ludCBsb2NhdGlvbiA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JSW5zZXRzIGluc2V0cyA9IGZyYW1lLmdldEluc2V0cygpOwotCWZyYW1lLnNldExvY2F0aW9uKGxvY2F0aW9uLnggKyBzaXplLnggKyAxMCwgbG9jYXRpb24ueSk7Ci0JZnJhbWUuc2V0U2l6ZShzaXplLnggLSAoaW5zZXRzLmxlZnQgKyBpbnNldHMucmlnaHQpLCBzaXplLnkgLSAoaW5zZXRzLnRvcCArIGluc2V0cy5ib3R0b20pKTsKLQlmcmFtZS5zZXRWaXNpYmxlKHRydWUpOwkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChzd3RJbWFnZSAhPSBudWxsKSBzd3RJbWFnZS5kaXNwb3NlKCk7Ci0JaWYgKHN3dEltYWdlMiAhPSBudWxsKSBzd3RJbWFnZS5kaXNwb3NlKCk7Ci0JZnJhbWUuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCS8qIE5vdGU6IElmIHlvdSBhcmUgdXNpbmcgSkRLIDEuMy54LCB5b3UgbmVlZCB0byB1c2UgU3lzdGVtLmV4aXQoMCkgYXQgdGhlIGVuZCBvZiB5b3VyIHByb2dyYW0gdG8gZXhpdCBBV1QuCi0JICogVGhpcyBpcyBiZWNhdXNlIGluIDEuMy54LCBBV1QgZG9lcyBub3QgZXhpdCB3aGVuIHRoZSBmcmFtZSBpcyBkaXNwb3NlZCwgYmVjYXVzZSB0aGUgQVdUIHRocmVhZCBpcyBub3QgYSBkYWVtb24uCi0JICogVGhpcyB3YXMgZml4ZWQgaW4gSkRLIDEuNC54IHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBBV1QgU2h1dGRvd24gdGhyZWFkLgotCSAqLwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFjZGY1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBleGFtcGxlIHNuaXBwZXQ6IEVtYmVkIFdvcmQgaW4gYW4gYXBwbGV0ICh3aW4zMiBvbmx5KQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotCQotaW1wb3J0IGphdmEuYXBwbGV0Lio7Ci0JIAotcHVibGljIGNsYXNzIFNuaXBwZXQxNTcgZXh0ZW5kcyBBcHBsZXQgewotCQotCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgZGlzcGxheTsKLQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCBzd3RQYXJlbnQ7Ci0JamF2YS5hd3QuQ2FudmFzIGF3dFBhcmVudDsKLQotcHVibGljIHZvaWQgaW5pdCAoKSB7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlzZXRMYXlvdXQobmV3IGphdmEuYXd0LkdyaWRMYXlvdXQgKDEsIDEpKTsKLQkJCWF3dFBhcmVudCA9IG5ldyBqYXZhLmF3dC5DYW52YXMgKCk7Ci0JCQlhZGQgKGF3dFBhcmVudCk7Ci0JCQlkaXNwbGF5ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkgKCk7Ci0JCQlzd3RQYXJlbnQgPSBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1QubmV3X1NoZWxsIChkaXNwbGF5LCBhd3RQYXJlbnQpOwotCQkJc3d0UGFyZW50LnNldExheW91dCAobmV3IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dCAoKSk7Ci0JCQlvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZyYW1lIGZyYW1lID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUgKHN3dFBhcmVudCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT05FKTsKLQkJCW9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSBzaXRlOwotCQkJdHJ5IHsKLQkJCQlzaXRlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQ2xpZW50U2l0ZSAoZnJhbWUsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiKTsKLQkJCX0gY2F0Y2ggKG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBzdHIgPSAiQ3JlYXRlIE9sZUNsaWVudFNpdGUgRXJyb3IiICsgZS50b1N0cmluZyAoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKHN0cik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0U2l6ZSAoNTAwLCA1MDApOwotCQkJdmFsaWRhdGUgKCk7Ci0JCQlzaXRlLmRvVmVyYiAob3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PTEUuT0xFSVZFUkJfU0hPVyk7Ci0JCQkKLQkJCXdoaWxlIChzd3RQYXJlbnQgIT0gbnVsbCAmJiAhc3d0UGFyZW50LmlzRGlzcG9zZWQgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwkJCi0JCQl9CQotCQl9Ci0JfSk7Ci0JdGhyZWFkLnN0YXJ0ICgpOwotfQotIHB1YmxpYyB2b2lkIHN0b3AgKCl7Ci0gCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCAoKSl7Ci0gCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSAoKSB7Ci0gCQkJcHVibGljIHZvaWQgcnVuICgpIHsKLSAJCQkJaWYgKHN3dFBhcmVudCAhPSBudWxsICYmICFzd3RQYXJlbnQuaXNEaXNwb3NlZCAoKSkgc3d0UGFyZW50LmRpc3Bvc2UgKCk7Ci0gCQkJCXN3dFBhcmVudCA9IG51bGw7Ci0gCQkJCWRpc3BsYXkuZGlzcG9zZSAoKTsKLSAJCQkJZGlzcGxheSA9IG51bGw7Ci0gCQkJfQotIAkJfSk7Ci0gCQlyZW1vdmUgKGF3dFBhcmVudCk7Ci0gCQlhd3RQYXJlbnQgPSBudWxsOwotIAl9Ci0gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3OWZkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGV0ZXJtaW5lIG5hdGl2ZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAobW90aWYgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwubW90aWYuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNTggZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXByaXZhdGUgc3RhdGljIFNuaXBwZXQxNTggX2luc3RhbmNlID0gbmV3IFNuaXBwZXQxNTgoKTsKLXByaXZhdGUgaW50W10gaWRzOwotcHJpdmF0ZSBTdHJpbmdbXSBuYW1lczsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSBjb250cm9sID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsIFNXVC5OT05FKTsKLQlpdGVtLnNldFRleHQoIkRyYWcgZGF0YSBvdmVyIHRoaXMgc2l0ZSB0byBzZWUgdGhlIG5hdGl2ZSB0cmFuc2ZlciB0eXBlLiIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoY29udHJvbCwgRE5ELkRST1BfREVGQVVMVCB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfTU9WRSk7Ci0JdGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtTbmlwcGV0MTU4LmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewkJCQotCQkJU3RyaW5nIG9wcyA9ICIiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgb3BzICs9ICJDb3B5OyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSBvcHMgKz0gIk1vdmU7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIG9wcyArPSAiTGluazsiOwotCQkJY29udHJvbC5yZW1vdmVBbGwoKTsKLQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQlpdGVtMS5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbnMgYXJlICIrb3BzKTsKLQkJCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVRyYW5zZmVyRGF0YVtdIGRhdGEgPSBldmVudC5kYXRhVHlwZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaWQgPSBkYXRhW2ldLnR5cGU7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lRnJvbUlkKGlkKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJCWl0ZW0yLnNldFRleHQoIkRhdGEgdHlwZSBpcyAiK2lkKyIgIituYW1lKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFNuaXBwZXQxNTggZ2V0SW5zdGFuY2UgKCkgewotCXJldHVybiBfaW5zdGFuY2U7Ci19Ci1TbmlwcGV0MTU4KCkgewotfQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci19Ci1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YShUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKXsKLQlyZXR1cm4gIkhlbGxvIFdvcmxkIjsKLX0KLXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKXsKLQlyZXR1cm4gbmFtZXM7Ci19Ci1zdGF0aWMgaW50IHNoZWxsSGFuZGxlOwotcHJvdGVjdGVkIGludFtdIGdldFR5cGVJZHMoKXsKLQlpZiAoaWRzID09IG51bGwpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWludCB3aWRnZXRDbGFzcyA9IE9TLnRvcExldmVsU2hlbGxXaWRnZXRDbGFzcyAoKTsKLQkJc2hlbGxIYW5kbGUgPSBPUy5YdEFwcENyZWF0ZVNoZWxsIChudWxsLCBudWxsLCB3aWRnZXRDbGFzcywgZGlzcGxheS54RGlzcGxheSwgbnVsbCwgMCk7Ci0JCU9TLlh0U2V0TWFwcGVkV2hlbk1hbmFnZWQgKHNoZWxsSGFuZGxlLCBmYWxzZSk7Ci0JCU9TLlh0UmVhbGl6ZVdpZGdldCAoc2hlbGxIYW5kbGUpOwotCQkKLQkJaWRzID0gbmV3IGludFs4NDBdOwotCQluYW1lcyA9IG5ldyBTdHJpbmdbODQwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlkc1tpXSA9IGkraTsKLQkJCW5hbWVzW2ldID0gZ2V0TmFtZUZyb21JZChpKzEpOwotCQl9Ci0JfQotCXJldHVybiBpZHM7Ci19Ci1zdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tSWQoaW50IGlkKSB7Ci0JaW50IHhEaXNwbGF5ID0gT1MuWHREaXNwbGF5IChzaGVsbEhhbmRsZSk7Ci0JaW50IHB0ciA9IDA7Ci0JdHJ5IHsKLQkJcHRyID0gT1MuWG1HZXRBdG9tTmFtZSh4RGlzcGxheSwgaWQpOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JfQotCWlmIChwdHIgPT0gMCkgcmV0dXJuICJpbnZhbGlkICIraWQ7Ci0JaW50IGxlbmd0aCA9IE9TLnN0cmxlbihwdHIpOwotCWJ5dGVbXSBuYW1lQnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQlPUy5tZW1tb3ZlKG5hbWVCdWYsIHB0ciwgbGVuZ3RoKTsKLQlPUy5YRnJlZShwdHIpOwotCXJldHVybiBuZXcgU3RyaW5nKENvbnZlcnRlci5tYmNzVG9XY3MobnVsbCwgbmFtZUJ1ZikpLnRvTG93ZXJDYXNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTMyYmMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE1OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBtb2RpZnkgSFRNTCB0aXRsZSB0YWcKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE1OSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgU3RyaW5nIG5ld1RpdGxlID0gIk5ldyBWYWx1ZSBmb3IgVGl0bGUiOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlRXZlbnQ6ICIrZXZlbnQudGl0bGUpOwotCQkJCXNoZWxsLnNldFRleHQoZXZlbnQudGl0bGUpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qIFNldCBIVE1MIHRpdGxlIHRhZyB1c2luZyBKYXZhU2NyaXB0IGFuZCBET00gd2hlbiBwYWdlIGhhcyBiZWVuIGxvYWRlZCAqLwotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKCJkb2N1bWVudC50aXRsZT0nIituZXdUaXRsZSsiJyIpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvKiBMb2FkIGFuIEhUTUwgZG9jdW1lbnQgKi8KLQkJYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2Y2EzMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBvbmUgcmVwZWF0aW5nIHRpbWVyIChldmVyeSA1MDAgbXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgaW50IHRpbWUgPSA1MDA7Ci0JUnVubmFibGUgdGltZXIgPSBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJUG9pbnQgcG9pbnQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uICgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBzaGVsbC5nZXRCb3VuZHMgKCk7Ci0JCQlpZiAocmVjdC5jb250YWlucyAocG9pbnQpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiSW4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiT3V0Iik7Ci0JCQl9Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGhpcyk7Ci0JCX0KLQl9OwotCWRpc3BsYXkudGltZXJFeGVjICh0aW1lLCB0aW1lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwkKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWJhMmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEJyb3dzZXIgZXhhbXBsZSBzbmlwcGV0OiBxdWVyeSBET00gbm9kZSB2YWx1ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBTdHJpbmcgaHRtbCA9ICI8aHRtbD48dGl0bGU+U25pcHBldDwvdGl0bGU+PGJvZHk+PHAgaWQ9J215aWQnPkJlc3QgRnJpZW5kczwvcD48cCBpZD0nbXlpZDInPkNhdCBhbmQgRG9nPC9wPjwvYm9keT48L2h0bWw+IjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJYnJvd3Nlci5zZXREYXRhKCJxdWVyeSIsIGV2ZW50LnRleHQpOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qIAotCQkJCSAqIFVzZSBKYXZhU2NyaXB0IHRvIHF1ZXJ5IHRoZSBkZXNpcmVkIG5vZGUgY29udGVudCB0aHJvdWdoIHRoZSBEb2N1bWVudCBPYmplY3QgTW9kZWwKLQkJCQkgKiAKLQkJCQkgKiBBc3NpZ24gcmVzdWx0IHRvIHRoZSB3aW5kb3cgcHJvcGVydHkgc3RhdHVzIHRvIHBhc3MgdGhlIHJlc3VsdCB0byB0aGUgU3RhdHVzVGV4dExpc3RlbmVyCi0JCQkJICogVGhpcyB0cmljayBpcyByZXF1aXJlZCBzaW5jZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBkb2VzIG5vdCByZXR1cm4gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KLQkJCQkgKiBkaXJlY3RseS4KLQkJCQkgKi8KLQkJCQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuZXhlY3V0ZSgid2luZG93LnN0YXR1cz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOyIpOwotCQkJCWlmICghcmVzdWx0KSB7Ci0JCQkJCS8qIFNjcmlwdCBtYXkgZmFpbCBvciBtYXkgbm90IGJlIHN1cHBvcnRlZCBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4gKi8KLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTY3JpcHQgd2FzIG5vdCBleGVjdXRlZC4iKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWJyb3dzZXIuZ2V0RGF0YSgicXVlcnkiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgdmFsdWU6ICIrdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJLyogTG9hZCBhbiBIVE1MIGRvY3VtZW50ICovCi0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQzZDg5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogbW9kaWZ5IERPTSAoZXhlY3V0aW5nIGphdmFzY3JpcHQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjEgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIFN0cmluZyBodG1sID0gIjxodG1sPjx0aXRsZT5TbmlwcGV0PC90aXRsZT48Ym9keT48cCBpZD0nbXlpZCc+QmVzdCBGcmllbmRzPC9wPjxwIGlkPSdteWlkMic+Q2F0IGFuZCBEb2c8L3A+PC9ib2R5PjwvaHRtbD4iOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5CT1JERVIpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBCcm93c2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQljb21wLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULk1VTFRJKTsKLQkJdGV4dC5zZXRUZXh0KCJ2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1AnKTsgXHJcbiIrCi0JCQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0F0IGxlYXN0IHdoZW4gSSBhbSBhcm91bmQnKTtcclxuIisKLQkJCQkibmV3Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcclxuIisKLQkJCQkiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215aWQnKS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuIisKLQkJCQkiXHJcbiIrCi0JCQkJImRvY3VtZW50LmJnQ29sb3I9J3llbGxvdyc7Iik7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkV4ZWN1dGUgU2NyaXB0Iik7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5leGVjdXRlKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQkvKiBTY3JpcHQgbWF5IGZhaWwgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gY2VydGFpbiBwbGF0Zm9ybXMuICovCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2NyaXB0IHdhcyBub3QgZXhlY3V0ZWQuIik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5zZXRUZXh0KGh0bWwpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTYyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDI4NmEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBZGRpbmcgYW4gYWNjZXNzaWJsZSBsaXN0ZW5lciB0byBwcm92aWRlIHN0YXRlIGluZm9ybWF0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTYyIHsKLQotZmluYWwgc3RhdGljIFN0cmluZyBTVEFURSA9ICJDaGVja2VkSW5kaWNlcyI7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCUltYWdlIGNoZWNrZWRJbWFnZSA9IGdldENoZWNrZWRJbWFnZSAoZGlzcGxheSk7Ci0JSW1hZ2UgdW5jaGVja2VkSW1hZ2UgPSBnZXRVbmNoZWNrZWRJbWFnZSAoZGlzcGxheSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uICh0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVJdGVtIGl0ZW0xID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQlpdGVtMS5zZXRUZXh0IChuZXcgU3RyaW5nIFtdIHsiZmlyc3QgaXRlbSIsICJhIiwgImIifSk7Ci0JaXRlbTEuc2V0SW1hZ2UgKDEsIHVuY2hlY2tlZEltYWdlKTsKLQlpdGVtMS5zZXRJbWFnZSAoMiwgdW5jaGVja2VkSW1hZ2UpOwotCWl0ZW0xLnNldERhdGEgKFNUQVRFLCBudWxsKTsKLQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCWl0ZW0yLnNldFRleHQgKG5ldyBTdHJpbmcgW10geyJzZWNvbmQgaXRlbSIsICJjIiwgImQifSk7Ci0JaXRlbTIuc2V0SW1hZ2UgKDEsIHVuY2hlY2tlZEltYWdlKTsKLQlpdGVtMi5zZXRJbWFnZSAoMiwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMi5zZXREYXRhIChTVEFURSwgbmV3IGludCBbXSB7Mn0pOwotCVRhYmxlSXRlbSBpdGVtMyA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCBTV1QuTk9ORSk7Ci0JaXRlbTMuc2V0VGV4dCAobmV3IFN0cmluZyBbXSB7InRoaXJkIiwgImUiLCAiZiJ9KTsKLQlpdGVtMy5zZXRJbWFnZSAoMSwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMy5zZXRJbWFnZSAoMiwgY2hlY2tlZEltYWdlKTsKLQlpdGVtMy5zZXREYXRhIChTVEFURSwgbmV3IGludCBbXSB7MSwgMn0pOwotCWNvbHVtbjEucGFjayAoKTsKLQljb2x1bW4yLnBhY2sgKCk7Ci0JY29sdW1uMy5wYWNrICgpOwotCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IHRhYmxlLmdldEFjY2Vzc2libGUgKCk7Ci0JYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQlzdXBlci5nZXROYW1lIChlKTsKLQkJCWlmIChlLmNoaWxkSUQgPj0gMCAmJiBlLmNoaWxkSUQgPCB0YWJsZS5nZXRJdGVtQ291bnQgKCkpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGUuY2hpbGRJRCk7Ci0JCQkJUG9pbnQgcHQgPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uICgpOwotCQkJCXB0ID0gZGlzcGxheS5tYXAgKG51bGwsIHRhYmxlLCBwdCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5nZXRDb2x1bW5Db3VudCAoKTsgaSsrKSB7Ci0JCQkJCWlmIChpdGVtLmdldEJvdW5kcyAoaSkuY29udGFpbnMgKHB0KSkgewotCQkJCQkJaW50IFtdIGRhdGEgPSAoaW50IFtdKSBpdGVtLmdldERhdGEgKFNUQVRFKTsKLQkJCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGZhbHNlOwotCQkJCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykgewotCQkJCQkJCQlpZiAoZGF0YSBbal0gPT0gaSkgewotCQkJCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWUucmVzdWx0ID0gaXRlbS5nZXRUZXh0IChpKSArICIgIiArIChjaGVja2VkID8gImNoZWNrZWQiIDogInVuY2hlY2tlZCIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlhY2Nlc3NpYmxlLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCBnZXRTdGF0ZSAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlzdXBlci5nZXRTdGF0ZSAoZSk7Ci0JCQlpZiAoZS5jaGlsZElEID49IDAgJiYgZS5jaGlsZElEIDwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSB0YWJsZS5nZXRJdGVtIChlLmNoaWxkSUQpOwotCQkJCWludCBbXSBkYXRhID0gKGludCBbXSkgaXRlbS5nZXREYXRhIChTVEFURSk7Ci0JCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJCXB0ID0gZGlzcGxheS5tYXAgKG51bGwsIHRhYmxlLCBwdCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW0uZ2V0Qm91bmRzIChkYXRhIFtpXSkuY29udGFpbnMgKHB0KSkgewotCQkJCQkJCWUuZGV0YWlsIHw9IEFDQy5TVEFURV9DSEVDS0VEOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2hlY2tlZEltYWdlLmRpc3Bvc2UgKCk7Ci0JdW5jaGVja2VkSW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLXN0YXRpYyBJbWFnZSBnZXRDaGVja2VkSW1hZ2UgKERpc3BsYXkgZGlzcGxheSkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1lFTExPVykpOwotCWdjLmZpbGxPdmFsICgwLCAwLCAxNiwgMTYpOwotCWdjLnNldEZvcmVncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9EQVJLX0dSRUVOKSk7Ci0JZ2MuZHJhd0xpbmUgKDAsIDAsIDE2LCAxNik7Ci0JZ2MuZHJhd0xpbmUgKDE2LCAwLCAwLCAxNik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLXN0YXRpYyBJbWFnZSBnZXRVbmNoZWNrZWRJbWFnZSAoRGlzcGxheSBkaXNwbGF5KSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIDE2LCAxNik7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JZ2MuZmlsbE92YWwgKDAsIDAsIDE2LCAxNik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdmZDRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTZXR0aW5nIHRoZSBmb250IHN0eWxlLCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyBvZiBTdHlsZWRUZXh0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkgQUJDREVGR0hJSktMTSBOT1BRUlNUVVZXWFlaIik7Ci0JLy8gbWFrZSAwMTIzNDU2Nzg5IGFwcGVhciBib2xkCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5zdGFydCA9IDA7Ci0Jc3R5bGUxLmxlbmd0aCA9IDEwOwotCXN0eWxlMS5mb250U3R5bGUgPSBTV1QuQk9MRDsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUxKTsKLQkvLyBtYWtlIEFCQ0RFRkdISUpLTE0gaGF2ZSBhIHJlZCBmb250Ci0JU3R5bGVSYW5nZSBzdHlsZTIgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMi5zdGFydCA9IDExOwotCXN0eWxlMi5sZW5ndGggPSAxMzsKLQlzdHlsZTIuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMik7Ci0JLy8gbWFrZSBOT1BRUlNUVVZXWFlaIGhhdmUgYSBibHVlIGJhY2tncm91bmQKLQlTdHlsZVJhbmdlIHN0eWxlMyA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUzLnN0YXJ0ID0gMjU7Ci0Jc3R5bGUzLmxlbmd0aCA9IDEzOwotCXN0eWxlMy5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlMyk7Ci0JCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5NDVmNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogT3ZlcnJpZGUgdGhlIHRleHQgdGhhdCBpcyBzcG9rZW4gZm9yIGEgbmF0aXZlIEJ1dHRvbi4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcygxMCwgMTAsIDIwMCwgMjAwKTsKLQotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQoIiZUeXBpY2FsIGJ1dHRvbiIpOwotCWJ1dHRvbjEuc2V0Qm91bmRzKDEwLDEwLDE4MCwzMCk7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCgiJk92ZXJpZGRlbiBidXR0b24iKTsKLQlidXR0b24yLnNldEJvdW5kcygxMCw1MCwxODAsMzApOwotCWJ1dHRvbjIuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCWUucmVzdWx0ID0gIlNwZWFrIHRoaXMgaW5zdGVhZCBvZiB0aGUgYnV0dG9uIHRleHQiOwotCQl9Ci0JfSk7Ci0JCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjYjE4Yi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgQ1RhYkZvbGRlciB3aXRoIG1pbiBhbmQgbWF4IGJ1dHRvbnMsIGFzIHdlbGwgYXMgY2xvc2UgYnV0dG9uIGFuZCAKLSAqIGltYWdlIG9ubHkgb24gc2VsZWN0ZWQgdGFiLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxNiwgMTYpOwotCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDE2LCAxNik7Ci0JZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDMsIDMsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQlmb2xkZXIuc2V0U2ltcGxlKGZhbHNlKTsKLQlmb2xkZXIuc2V0VW5zZWxlY3RlZEltYWdlVmlzaWJsZShmYWxzZSk7Ci0JZm9sZGVyLnNldFVuc2VsZWN0ZWRDbG9zZVZpc2libGUoZmFsc2UpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuQ0xPU0UpOwotCQlpdGVtLnNldFRleHQoIkl0ZW0gIitpKTsKLQkJaXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdGV4dC5zZXRUZXh0KCJUZXh0IGZvciBpdGVtICIraSsiXG5cbm9uZSwgdHdvLCB0aHJlZVxuXG5hYmNkZWZnaGlqa2xtbm9wIik7Ci0JCWl0ZW0uc2V0Q29udHJvbCh0ZXh0KTsKLQl9Ci0JZm9sZGVyLnNldE1pbmltaXplVmlzaWJsZSh0cnVlKTsKLQlmb2xkZXIuc2V0TWF4aW1pemVWaXNpYmxlKHRydWUpOwotCWZvbGRlci5hZGRDVGFiRm9sZGVyMkxpc3RlbmVyKG5ldyBDVGFiRm9sZGVyMkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1pbmltaXplKENUYWJGb2xkZXJFdmVudCBldmVudCkgewotCQkJZm9sZGVyLnNldE1pbmltaXplZCh0cnVlKTsKLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtYXhpbWl6ZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWZvbGRlci5zZXRNYXhpbWl6ZWQodHJ1ZSk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQlzaGVsbC5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVzdG9yZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWZvbGRlci5zZXRNaW5pbWl6ZWQoZmFsc2UpOwotCQkJZm9sZGVyLnNldE1heGltaXplZChmYWxzZSk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3MjdmMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ3JlYXRlIGEgU2Nyb2xsZWRDb21wb3NpdGUgd2l0aCB3cmFwcGluZyBjb250ZW50LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTY2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UxID0gZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XT1JLSU5HKTsKLQlJbWFnZSBpbWFnZTIgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKTsKLQlJbWFnZSBpbWFnZTMgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0VSUk9SKTsKLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcG9zaXRlID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQotCWZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWZvcihpbnQgaSA9IDA7IGkgPD0gNTA7IGkrKykgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJaWYgKGkgJSAzID09IDApIGxhYmVsLnNldEltYWdlKGltYWdlMSk7Ci0JCWlmIChpICUgMyA9PSAxKSBsYWJlbC5zZXRJbWFnZShpbWFnZTIpOwotCQlpZiAoaSAlIDMgPT0gMikgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UzKTsKLQl9Ci0JUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0Jc2Nyb2xsQ29tcG9zaXRlLnNldENvbnRlbnQocGFyZW50KTsKLQlzY3JvbGxDb21wb3NpdGUuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0Jc2Nyb2xsQ29tcG9zaXRlLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0Jc2Nyb2xsQ29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgciA9IHNjcm9sbENvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlzY3JvbGxDb21wb3NpdGUuc2V0TWluU2l6ZShwYXJlbnQuY29tcHV0ZVNpemUoci53aWR0aCwgU1dULkRFRkFVTFQpKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgewotCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyMTFiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgdHdvIFNjcm9sbGVkQ29tcG9zaXRlcyB0aGF0IHNjcm9sbCBpbiB0YW5kZW0uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCi0JZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzYzEsIFNXVC5QVVNIKTsKLQlidXR0b24xLnNldFRleHQgKCJCdXR0b24gMSIpOwotCWJ1dHRvbjEuc2V0U2l6ZSAoNDAwLCAzMDApOwotCXNjMS5zZXRDb250ZW50IChidXR0b24xKTsKLQotCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMiA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzYzIsIFNXVC5QVVNIKTsKLQlidXR0b24yLnNldFRleHQgKCJCdXR0b24gMiIpOwotCWJ1dHRvbjIuc2V0U2l6ZSAoMzAwLCA0MDApOwotCXNjMi5zZXRDb250ZW50IChidXR0b24yKTsKLQotCWZpbmFsIFNjcm9sbEJhciB2QmFyMSA9IHNjMS5nZXRWZXJ0aWNhbEJhciAoKTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhcjIgPSBzYzIuZ2V0VmVydGljYWxCYXIgKCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIxID0gc2MxLmdldEhvcml6b250YWxCYXIgKCk7Ci0JZmluYWwgU2Nyb2xsQmFyIGhCYXIyID0gc2MyLmdldEhvcml6b250YWxCYXIgKCk7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHggPSAgaEJhcjEuZ2V0U2VsZWN0aW9uKCkgKiAoaEJhcjIuZ2V0TWF4aW11bSgpIC0gaEJhcjIuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCBoQmFyMS5nZXRNYXhpbXVtKCkgLSBoQmFyMS5nZXRUaHVtYigpKTsKLQkJCWludCB5ID0gIHZCYXIxLmdldFNlbGVjdGlvbigpICogKHZCYXIyLmdldE1heGltdW0oKSAtIHZCYXIyLmdldFRodW1iKCkpIC8gTWF0aC5tYXgoMSwgdkJhcjEuZ2V0TWF4aW11bSgpIC0gdkJhcjEuZ2V0VGh1bWIoKSk7Ci0JCQlzYzIuc2V0T3JpZ2luICh4LCB5KTsKLQkJfQotCX07Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCAoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHggPSAgaEJhcjIuZ2V0U2VsZWN0aW9uKCkgKiAoaEJhcjEuZ2V0TWF4aW11bSgpIC0gaEJhcjEuZ2V0VGh1bWIoKSkgLyBNYXRoLm1heCgxLCBoQmFyMi5nZXRNYXhpbXVtKCkgLSBoQmFyMi5nZXRUaHVtYigpKTsKLQkJCWludCB5ID0gIHZCYXIyLmdldFNlbGVjdGlvbigpICogKHZCYXIxLmdldE1heGltdW0oKSAtIHZCYXIxLmdldFRodW1iKCkpIC8gTWF0aC5tYXgoMSwgdkJhcjIuZ2V0TWF4aW11bSgpIC0gdkJhcjIuZ2V0VGh1bWIoKSk7Ci0JCQlzYzEuc2V0T3JpZ2luICh4LCB5KTsKLQkJfQotCX07Ci0JdkJhcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMSk7Ci0JaEJhcjEuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMSk7Ci0JdkJhcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMik7Ci0JaEJhcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIgKGxpc3RlbmVyMik7Ci0KLQlzaGVsbC5zZXRTaXplICg0MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQyNDVlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmF3IGxpbmVzIGFuZCBwb2x5Z29ucyB3aXRoIGRpZmZlcmVudCBjYXAgYW5kIGpvaW4gc3R5bGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE2OCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaW50IHggPSAyMCwgeSA9IDIwLCB3ID0gMTIwLCBoID0gNjA7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCQlnYy5zZXRMaW5lV2lkdGgoMTApOwotCQkJaW50W10gY2FwcyA9IHtTV1QuQ0FQX0ZMQVQsIFNXVC5DQVBfUk9VTkQsIFNXVC5DQVBfU1FVQVJFfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2Fwcy5sZW5ndGg7IGkrKykgewotCQkJCWdjLnNldExpbmVDYXAoY2Fwc1tpXSk7Ci0JCQkJZ2MuZHJhd0xpbmUoeCwgeSwgeCArIHcsIHkpOwotCQkJCXkgKz0gMjA7Ci0JCQl9Ci0JCQlpbnRbXSBqb2lucyA9IHtTV1QuSk9JTl9CRVZFTCwgU1dULkpPSU5fTUlURVIsIFNXVC5KT0lOX1JPVU5EfTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9pbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlnYy5zZXRMaW5lSm9pbihqb2luc1tpXSk7Ci0JCQkJZ2MuZHJhd1BvbHlnb24obmV3IGludFtdIHt4LCB5LCB4ICsgdy8yLCB5ICsgaCwgeCArIHcsIHl9KTsKLQkJCQl5ICs9IGggKyAyMDsKLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTY5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGEzMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1ha2UgYSB0b2dnbGUgYnV0dG9uIGhhdmUgcmFkaW8gYmVoYXZpb3IKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNjkgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzaGVsbC5nZXRDaGlsZHJlbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbiBbaV07Ci0JCQkJaWYgKGUud2lkZ2V0ICE9IGNoaWxkICYmIGNoaWxkIGluc3RhbmNlb2YgQnV0dG9uICYmIChjaGlsZC5nZXRTdHlsZSAoKSAmIFNXVC5UT0dHTEUpICE9IDApIHsKLQkJCQkJKChCdXR0b24pIGNoaWxkKS5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkoKEJ1dHRvbikgZS53aWRnZXQpLnNldFNlbGVjdGlvbiAodHJ1ZSk7Ci0JCX0KLQl9OwotCWZvciAoaW50IGk9MDsgaTwyMDsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlRPR0dMRSk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiQiIgKyBpKTsKLQkJYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JCWlmIChpID09IDApIGJ1dHRvbi5zZXRTZWxlY3Rpb24gKHRydWUpOwotCX0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGZmODNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNsaWRlciBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNjcm9sbCBldmVudCBkZXRhaWxzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JU2xpZGVyIHNsaWRlciA9IG5ldyBTbGlkZXIgKHNoZWxsLCBTV1QuSE9SSVpPTlRBTCk7Ci0Jc2xpZGVyLnNldEJvdW5kcyAoMTAsIDEwLCAyMDAsIDMyKTsKLQlzbGlkZXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHN0cmluZyA9ICJTV1QuTk9ORSI7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJCWNhc2UgU1dULkRSQUc6IHN0cmluZyA9ICJTV1QuRFJBRyI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkhPTUU6IHN0cmluZyA9ICJTV1QuSE9NRSI7IGJyZWFrOwotCQkJCWNhc2UgU1dULkVORDogc3RyaW5nID0gIlNXVC5FTkQiOyBicmVhazsKLQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOiBzdHJpbmcgPSAiU1dULkFSUk9XX0RPV04iOyBicmVhazsKLQkJCQljYXNlIFNXVC5BUlJPV19VUDogc3RyaW5nID0gIlNXVC5BUlJPV19VUCI7IGJyZWFrOwotCQkJCWNhc2UgU1dULlBBR0VfRE9XTjogc3RyaW5nID0gIlNXVC5QQUdFX0RPV04iOyBicmVhazsKLQkJCQljYXNlIFNXVC5QQUdFX1VQOiBzdHJpbmcgPSAiU1dULlBBR0VfVVAiOyBicmVhazsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNjcm9sbCBkZXRhaWwgLT4gIiArIHN0cmluZyk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxN2I5ZTcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIFRyZWUgd2l0aCBjb2x1bW5zCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcwIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQkJY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JCVRyZWVDb2x1bW4gY29sdW1uMyA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCk7Ci0JCWNvbHVtbjMuc2V0VGV4dCgiQ29sdW1uIDMiKTsKLQkJY29sdW1uMy5zZXRXaWR0aCgyMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgIml0ZW0gIiArIGksICJhYmMiLCAiZGVmZ2hpIiB9KTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0JCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3ViSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ICJzdWJpdGVtICIgKyBqLCAiamtsbW5vcCIsICJxcnMiIH0pOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCQlzdWJzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsgInN1YnN1Yml0ZW0gIiArIGssICJ0dXYiLCAid3h5eiIgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQkJfQotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2JhZWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGRhdGEgdHJhbnNmZXIgdHlwZXMgdGhhdCBzdWJjbGFzcyBlYWNoCi0gKiBvdGhlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTcxIHsKLQotLyoKLSAqIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlPC9ib2xkPiB3aGVyZQotICogTXlUeXBlIGlzIGRlZmluZSBhczoKLSAqLwotc3RhdGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCWxvbmcgZmlsZUxlbmd0aDsKLQlsb25nIGxhc3RNb2RpZmllZDsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJNeXR5cGVUcmFuc2ZlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1ZVFlQRUlEID0gcmVnaXN0ZXJUeXBlKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNmZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JYnl0ZVtdIGphdmFUb0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCU15VHlwZSBkYXRhID0gKE15VHlwZSkgb2JqZWN0OwotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCURhdGFPdXRwdXRTdHJlYW0gd3JpdGVPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShvdXQpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IGRhdGEuZmlsZU5hbWUuZ2V0Qnl0ZXMoKTsKLQkJCXdyaXRlT3V0LndyaXRlSW50KGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUoYnVmZmVyKTsKLQkJCXdyaXRlT3V0LndyaXRlTG9uZyhkYXRhLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEubGFzdE1vZGlmaWVkKTsKLQkJCWJ1ZmZlciA9IG91dC50b0J5dGVBcnJheSgpOwotCQkJd3JpdGVPdXQuY2xvc2UoKTsKLQkJCXJldHVybiBidWZmZXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlPYmplY3QgYnl0ZUFycmF5VG9KYXZhKGJ5dGVbXSBieXRlcykgewotCQlNeVR5cGUgZGF0YSA9IG5ldyBNeVR5cGUoKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVOYW1lID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJZGF0YS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlkYXRhLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJcmVhZEluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrTXlUeXBlKG9iamVjdCkgfHwgIWlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQlETkQuZXJyb3IoRE5ELkVSUk9SX0lOVkFMSURfREFUQSk7Ci0JCX0KLQkJYnl0ZVtdIGJ1ZmZlciA9IGphdmFUb0J5dGVBcnJheShvYmplY3QpOwotCQlzdXBlci5qYXZhVG9OYXRpdmUoYnVmZmVyLCB0cmFuc2ZlckRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKGlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlckRhdGEpKSB7Ci0JCQlieXRlW10gYnVmZmVyID0gKGJ5dGVbXSkgc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gYnl0ZUFycmF5VG9KYXZhKGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IE1ZVFlQRU5BTUUgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IE1ZVFlQRUlEIH07Ci0JfQotCi0JYm9vbGVhbiBjaGVja015VHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBpcyBhbiA8Ym9sZD5hcnJheSBvZiB0eXBlIE15VHlwZTI8L2JvbGQ+Ci0gKiB3aGVyZSBNeVR5cGUyIGlzIGRlZmluZSBhczoKLSAqLwotc3RhdGljIGNsYXNzIE15VHlwZTIgZXh0ZW5kcyBNeVR5cGUgewotCVN0cmluZyB2ZXJzaW9uOwotfQotCi1zdGF0aWMgY2xhc3MgTXlUcmFuc2ZlcjIgZXh0ZW5kcyBNeVRyYW5zZmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWVRZUEUyTkFNRSA9ICJNeXR5cGUyVHJhbnNmZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNWVRZUEUySUQgPSByZWdpc3RlclR5cGUoTVlUWVBFMk5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBNWVRZUEUyTkFNRSB9OwotCX0KLQotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgTVlUWVBFMklEIH07Ci0JfQotCi0JYnl0ZVtdIGphdmFUb0J5dGVBcnJheShPYmplY3Qgb2JqZWN0KSB7Ci0JCU15VHlwZTIgZGF0YSA9IChNeVR5cGUyKSBvYmplY3Q7Ci0JCXRyeSB7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJRGF0YU91dHB1dFN0cmVhbSB3cml0ZU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dCk7Ci0JCQlieXRlW10gYnVmZmVyID0gZGF0YS5maWxlTmFtZS5nZXRCeXRlcygpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQoYnVmZmVyLmxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZShidWZmZXIpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nKGRhdGEuZmlsZUxlbmd0aCk7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcoZGF0YS5sYXN0TW9kaWZpZWQpOwotCQkJYnVmZmVyID0gZGF0YS52ZXJzaW9uLmdldEJ5dGVzKCk7Ci0JCQl3cml0ZU91dC53cml0ZUludChidWZmZXIubGVuZ3RoKTsKLQkJCXdyaXRlT3V0LndyaXRlKGJ1ZmZlcik7Ci0JCQlidWZmZXIgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJCXdyaXRlT3V0LmNsb3NlKCk7Ci0JCQlyZXR1cm4gYnVmZmVyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JT2JqZWN0IGJ5dGVBcnJheVRvSmF2YShieXRlW10gYnl0ZXMpIHsKLQkJTXlUeXBlMiBkYXRhID0gbmV3IE15VHlwZTIoKTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLQkJCURhdGFJbnB1dFN0cmVhbSByZWFkSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluKTsKLQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQoKTsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLmZpbGVOYW1lID0gbmV3IFN0cmluZyhidWZmZXIpOwotCQkJZGF0YS5maWxlTGVuZ3RoID0gcmVhZEluLnJlYWRMb25nKCk7Ci0JCQlkYXRhLmxhc3RNb2RpZmllZCA9IHJlYWRJbi5yZWFkTG9uZygpOwotCQkJc2l6ZSA9IHJlYWRJbi5yZWFkSW50KCk7Ci0JCQlidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXJlYWRJbi5yZWFkKGJ1ZmZlcik7Ci0JCQlkYXRhLnZlcnNpb24gPSBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCQlyZWFkSW4uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIGphdmFUb05hdGl2ZShPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JCWlmICghY2hlY2tNeVR5cGUyKG9iamVjdCkpIHsKLQkJCURORC5lcnJvcihETkQuRVJST1JfSU5WQUxJRF9EQVRBKTsKLQkJfQotCQlzdXBlci5qYXZhVG9OYXRpdmUob2JqZWN0LCB0cmFuc2ZlckRhdGEpOwotCX0KLQotCWJvb2xlYW4gY2hlY2tNeVR5cGUyKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCFjaGVja015VHlwZShvYmplY3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgTXlUeXBlMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja015VHlwZTIob2JqZWN0KTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwxLnNldFRleHQoIkRyYWcgU291cmNlIGZvciBNeURhdGEgYW5kIE15RGF0YTIiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwyLnNldFRleHQoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGEiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwzLnNldFRleHQoIkRyb3AgVGFyZ2V0IGZvciBNeURhdGEyIik7Ci0KLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsMSwgRE5ELkRST1BfQ09QWSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJTXlUcmFuc2ZlcjIuZ2V0SW5zdGFuY2UoKSB9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlNeVR5cGUyIG15VHlwZSA9IG5ldyBNeVR5cGUyKCk7Ci0JCQlteVR5cGUuZmlsZU5hbWUgPSAiQzpcXGFiYy50eHQiOwotCQkJbXlUeXBlLmZpbGVMZW5ndGggPSAxMDAwOwotCQkJbXlUeXBlLmxhc3RNb2RpZmllZCA9IDEyMzEyMzEzOwotCQkJbXlUeXBlLnZlcnNpb24gPSAidmVyc2lvbiAyIjsKLQkJCWV2ZW50LmRhdGEgPSBteVR5cGU7Ci0JCX0KLQl9KTsKLQlEcm9wVGFyZ2V0IHRhcmdldE15VHlwZSA9IG5ldyBEcm9wVGFyZ2V0KGxhYmVsMiwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldE15VHlwZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7IE15VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl0YXJnZXRNeVR5cGUuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kYXRhICE9IG51bGwpIHsKLQkJCQlNeVR5cGUgbXlUeXBlID0gKE15VHlwZSkgZXZlbnQuZGF0YTsKLQkJCQlpZiAobXlUeXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICJNeVR5cGU6ICIgKyBteVR5cGUuZmlsZU5hbWU7Ci0JCQkJCWxhYmVsMi5zZXRUZXh0KHN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9KTsKLQlEcm9wVGFyZ2V0IHRhcmdldE15VHlwZTIgPSBuZXcgRHJvcFRhcmdldChsYWJlbDMsIERORC5EUk9QX0NPUFkJfCBETkQuRFJPUF9ERUZBVUxUKTsKLQl0YXJnZXRNeVR5cGUyLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHsgTXlUcmFuc2ZlcjIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl0YXJnZXRNeVR5cGUyLmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpCi0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlMiBteVR5cGUgPSAoTXlUeXBlMikgZXZlbnQuZGF0YTsKLQkJCQlpZiAobXlUeXBlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICJNeVR5cGUyOiAiICsgbXlUeXBlLmZpbGVOYW1lICsgIjoiCi0JCQkJCQkJKyBteVR5cGUudmVyc2lvbjsKLQkJCQkJbGFiZWwzLnNldFRleHQoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxZWZmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR3JpZExheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgR3JpZExheW91dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkxFRlQsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTEVGVCwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJMRUZULCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBDRU5URVIiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5CT1RUT00sIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQ0VOVEVSLCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgVE9QIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5UT1AsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiUklHSFQsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuQ0VOVEVSLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIlJJR0hULCBCT1RUT00iKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJSSUdIVCwgRklMTCIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULlJJR0hULCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBUT1AiKTsKLQliLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCB0cnVlLCAxLCAxKSk7Ci0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkZJTEwsIENFTlRFUiIpOwotCWIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUsIDEsIDEpKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiRklMTCwgQk9UVE9NIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJPVFRPTSwgdHJ1ZSwgdHJ1ZSwgMSwgMSkpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJGSUxMLCBGSUxMIik7Ci0JYi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQkKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU1MWQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBCcm93c2VyIHNuaXBwZXQ6IGJyaW5nIHVwIGEgYnJvd3NlciAocG9wLXVwIGJsb2NrZXIpCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgQnJvd3NlciBicm93c2VyOwotCXRyeSB7Ci0JCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCXNoZWxsLm9wZW4oKTsKLQkvKiBhbnkgd2Vic2l0ZSB3aXRoIHBvcHVwcyAqLwotCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3LmNubi5jb20iKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi0vKiByZWdpc3RlciBXaW5kb3dFdmVudCBsaXN0ZW5lcnMgKi8KLXN0YXRpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBCcm93c2VyIGJyb3dzZXIpIHsKLQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCXNoZWxsLnNldFRleHQoIk5ldyBXaW5kb3ciKTsKLQkJCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlpbml0aWFsaXplKGRpc3BsYXksIGJyb3dzZXIpOwotCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXI7Ci0JCX0KLQl9KTsKLQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoaWRlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJLyogcG9wdXAgYmxvY2tlciAtIGlnbm9yZSB3aW5kb3dzIHdpdGggbm8gc3R5bGUgKi8KLQkJCWlmICghZXZlbnQuYWRkcmVzc0JhciAmJiAhZXZlbnQubWVudUJhciAmJiAhZXZlbnQuc3RhdHVzQmFyICYmICFldmVudC50b29sQmFyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQb3B1cCBibG9ja2VkLiIpOwotCQkJCWV2ZW50LmRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChldmVudC5sb2NhdGlvbiAhPSBudWxsKSBzaGVsbC5zZXRMb2NhdGlvbihldmVudC5sb2NhdGlvbik7Ci0JCQlpZiAoZXZlbnQuc2l6ZSAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LnNpemU7Ci0JCQkJc2hlbGwuc2V0U2l6ZShzaGVsbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSkpOwotCQkJfQotCQkJc2hlbGwub3BlbigpOwotCQl9Ci0JfSk7Ci0JYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJU2hlbGwgc2hlbGwgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQlzaGVsbC5jbG9zZSgpOwotCQl9Ci0JfSk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAxNGExLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU2ViYXN0aWFuIERhdmlkcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICBJQk0gQ29ycG9yYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgT3BlbkdMIHNuaXBwZXQ6IGRyYXcgYSBzcXVhcmUKLSAqIAotICogVGhpcyBzbmlwcGV0IHJlcXVpcmVzIHRoZSBleHBlcmltZW50YWwgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbCBwbHVnaW4sIHdoaWNoCi0gKiBpcyBub3QgaW5jbHVkZWQgaW4gc3d0IGJ5IGRlZmF1bHQuICBGb3IgaW5mb3JtYXRpb24gb24gdGhpcyBwbHVnaW4gc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9vcGVuZ2wvb3BlbmdsLmh0bWwgIAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5vcGVuZ2wuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc0IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0VGV4dCgiT3BlbkdMIGluIFNXVCIpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEoKTsKLSAgICBkYXRhLmRvdWJsZUJ1ZmZlciA9IHRydWU7Ci0gICAgZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKHNoZWxsLCBTV1QuTk9fQkFDS0dST1VORCwgZGF0YSk7Ci0gICAgY2FudmFzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICByZXNpemUoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIGluaXQoY2FudmFzKTsKLSAgICBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChjYW52YXMuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0gICAgICAgICAgICByZW5kZXIoKTsKLSAgICAgICAgICAgIGNhbnZhcy5zd2FwQnVmZmVycygpOwotICAgICAgICAgICAgY2FudmFzLmdldERpc3BsYXkoKS50aW1lckV4ZWMoNTAsIHRoaXMpOwotICAgICAgICB9Ci0gICAgfS5ydW4oKTsKLSAgICBzaGVsbC5vcGVuKCk7Ci0gICAgd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgfQotICAgIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBpbml0KEdMQ2FudmFzIGNhbnZhcykgewotICAgIGNhbnZhcy5zZXRDdXJyZW50KCk7Ci0gICAgcmVzaXplKGNhbnZhcyk7Ci0gICAgR0wuZ2xDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotICAgIEdMLmdsQ29sb3IzZigwLjBmLCAwLjBmLCAwLjBmKTsKLSAgICBHTC5nbENsZWFyRGVwdGgoMS4wZik7Ci0gICAgR0wuZ2xFbmFibGUoR0wuR0xfREVQVEhfVEVTVCk7Ci0gICAgR0wuZ2xIaW50KEdMLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wuR0xfTklDRVNUKTsKLX0KLQotc3RhdGljIHZvaWQgcmVuZGVyKCkgewotICAgIEdMLmdsQ2xlYXIoR0wuR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgR0wuZ2xUcmFuc2xhdGVmKDAuMGYsIDAuMGYsIC02LjBmKTsKLSAgICBHTC5nbEJlZ2luKEdMLkdMX1FVQURTKTsKLSAgICBHTC5nbFZlcnRleDNmKC0xLjBmLCAxLjBmLCAwLjBmKTsKLSAgICBHTC5nbFZlcnRleDNmKDEuMGYsIDEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoMS4wZiwgLTEuMGYsIDAuMGYpOwotICAgIEdMLmdsVmVydGV4M2YoLTEuMGYsIC0xLjBmLCAwLjBmKTsKLSAgICBHTC5nbEVuZCgpOwotfQotCi1zdGF0aWMgdm9pZCByZXNpemUoR0xDYW52YXMgY2FudmFzKSB7Ci0gICAgY2FudmFzLnNldEN1cnJlbnQoKTsKLSAgICBSZWN0YW5nbGUgcmVjdCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhKCk7Ci0gICAgaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLSAgICBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgocmVjdC5oZWlnaHQsIDEpOwotICAgIEdMLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgR0wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KSB3aWR0aCAvIChmbG9hdCkgaGVpZ2h0OwotICAgIEdMVS5nbHVQZXJzcGVjdGl2ZSg0NS4wZiwgYXNwZWN0LCAwLjVmLCA0MDAuMGYpOwotICAgIEdMLmdsTWF0cml4TW9kZShHTC5HTF9NT0RFTFZJRVcpOwotICAgIEdMLmdsTG9hZElkZW50aXR5KCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZmM5NzMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRXhjbHVkZSBhIHdpZGdldCBmcm9tIGEgR3JpZExheW91dAotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMCIpOwotCi0JZmluYWwgQnV0dG9uIGJIaWRkZW4gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYkhpZGRlbi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQlkYXRhLmV4Y2x1ZGUgPSB0cnVlOwotCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCWJIaWRkZW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMyIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gNCIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5DSEVDSyk7Ci0JYi5zZXRUZXh0KCJoaWRlIik7Ci0JYi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKSBiSGlkZGVuLmdldExheW91dERhdGEoKTsKLQkJCWRhdGEuZXhjbHVkZSA9IGIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQliSGlkZGVuLnNldFZpc2libGUoIWRhdGEuZXhjbHVkZSk7Ci0JCQlzaGVsbC5sYXlvdXQoZmFsc2UpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYWY3NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFJvd0xheW91dCBzbmlwcGV0OiBhbGlnbiB3aWRnZXRzIGluIGEgcm93Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE3NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCk7Ci0JbGF5b3V0LndyYXAgPSB0cnVlOwotCWxheW91dC5maWxsID0gZmFsc2U7Ci0JbGF5b3V0Lmp1c3RpZnkgPSB0cnVlOwotCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCi0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMSIpOwotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQliLnNldFRleHQoIkJ1dHRvbiAyIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDMiKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJOb3Qgc2hvd24iKTsKLQliLnNldFZpc2libGUoZmFsc2UpOwotCVJvd0RhdGEgZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5leGNsdWRlID0gdHJ1ZTsKLQliLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDIwMCBoaWdoIik7Ci0JZGF0YSA9IG5ldyBSb3dEYXRhKCk7Ci0JZGF0YS5oZWlnaHQgPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgd2lkZSIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEud2lkdGggPSAyMDA7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE3Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmE4ZWNhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBSb3dMYXlvdXQgc25pcHBldDogYWxpZ24gd2lkZ2V0cyBpbiBhIGNvbHVtbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4xCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxNzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlSb3dMYXlvdXQgbGF5b3V0ID0gbmV3IFJvd0xheW91dChTV1QuVkVSVElDQUwpOwotCWxheW91dC53cmFwID0gdHJ1ZTsKLQlsYXlvdXQuZmlsbCA9IHRydWU7Ci0JbGF5b3V0Lmp1c3RpZnkgPSBmYWxzZTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCi0JYi5zZXRUZXh0KCJCdXR0b24gMiIpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAzIik7Ci0KLQliID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0VGV4dCgiTm90IHNob3duIik7Ci0JYi5zZXRWaXNpYmxlKGZhbHNlKTsKLQlSb3dEYXRhIGRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuZXhjbHVkZSA9IHRydWU7Ci0JYi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliLnNldFRleHQoIkJ1dHRvbiAyMDAgaGlnaCIpOwotCWRhdGEgPSBuZXcgUm93RGF0YSgpOwotCWRhdGEuaGVpZ2h0ID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCWIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYi5zZXRUZXh0KCJCdXR0b24gMjAwIHdpZGUiKTsKLQlkYXRhID0gbmV3IFJvd0RhdGEoKTsKLQlkYXRhLndpZHRoID0gMjAwOwotCWIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTRiYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEhvdyB0byBhY2Nlc3MgQWJvdXQsIFByZWZlcmVuY2VzIGFuZCBRdWl0IG1lbnVzIG9uIGNhcmJvbi4KLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc4IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBrSElDb21tYW5kUHJlZmVyZW5jZXMgPSAoJ3AnIDw8IDI0KSArICgncicgPDwgMTYpCi0JCQkrICgnZScgPDwgOCkgKyAnZic7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga0hJQ29tbWFuZEFib3V0ID0gKCdhJyA8PCAyNCkgKyAoJ2InIDw8IDE2KQotCQkJKyAoJ28nIDw8IDgpICsgJ3UnOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtISUNvbW1hbmRTZXJ2aWNlcyA9ICgncycgPDwgMjQpICsgKCdlJyA8PCAxNikKLQkJCSsgKCdyJyA8PCA4KSArICd2JzsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKSB7Ci0JRGlzcGxheS5zZXRBcHBOYW1lKCJBcHBNZW51Iik7IC8vIHNldHMgbmFtZSBpbiBEb2NrCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlob29rQXBwbGljYXRpb25NZW51KGRpc3BsYXksICJBYm91dCBBcHBNZW51Iik7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiTWFpbiBXaW5kb3ciKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1zdGF0aWMgdm9pZCBob29rQXBwbGljYXRpb25NZW51KERpc3BsYXkgZGlzcGxheSwgZmluYWwgU3RyaW5nIGFib3V0TmFtZSkgewotCS8vIENhbGxiYWNrIHRhcmdldAotCU9iamVjdCB0YXJnZXQgPSBuZXcgT2JqZWN0KCkgewotCQlpbnQgY29tbWFuZFByb2MoaW50IG5leHRIYW5kbGVyLCBpbnQgdGhlRXZlbnQsIGludCB1c2VyRGF0YSkgewotCQkJaWYgKE9TLkdldEV2ZW50S2luZCh0aGVFdmVudCkgPT0gT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQpIHsKLQkJCQlISUNvbW1hbmQgY29tbWFuZCA9IG5ldyBISUNvbW1hbmQoKTsKLQkJCQlPUy5HZXRFdmVudFBhcmFtZXRlcih0aGVFdmVudCwgT1Mua0V2ZW50UGFyYW1EaXJlY3RPYmplY3QsCi0JCQkJCQlPUy50eXBlSElDb21tYW5kLCBudWxsLCBISUNvbW1hbmQuc2l6ZW9mLCBudWxsLAotCQkJCQkJY29tbWFuZCk7Ci0JCQkJc3dpdGNoIChjb21tYW5kLmNvbW1hbmRJRCkgewotCQkJCWNhc2Uga0hJQ29tbWFuZFByZWZlcmVuY2VzOgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZCgiUHJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2Uga0hJQ29tbWFuZEFib3V0OgotCQkJCQlyZXR1cm4gaGFuZGxlQ29tbWFuZChhYm91dE5hbWUpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBPUy5ldmVudE5vdEhhbmRsZWRFcnI7Ci0JCX0KLQotCQlpbnQgaGFuZGxlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQkJCU1lc3NhZ2VCb3ggcHJlZmVyZW5jZXMgPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULklDT05fV0FSTklORyk7Ci0JCQlwcmVmZXJlbmNlcy5zZXRUZXh0KGNvbW1hbmQpOwotCQkJcHJlZmVyZW5jZXMub3BlbigpOwotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJcmV0dXJuIE9TLm5vRXJyOwotCQl9Ci0JfTsKLQotCWZpbmFsIENhbGxiYWNrIGNvbW1hbmRDYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0YXJnZXQsICJjb21tYW5kUHJvYyIsIDMpOyAvLyROT04tTkxTLTEkCi0JaW50IGNvbW1hbmRQcm9jID0gY29tbWFuZENhbGxiYWNrLmdldEFkZHJlc3MoKTsKLQlpZiAoY29tbWFuZFByb2MgPT0gMCkgewotCQljb21tYW5kQ2FsbGJhY2suZGlzcG9zZSgpOwotCQlyZXR1cm47IC8vIGdpdmUgdXAKLQl9Ci0KLQkvLyBJbnN0YWxsIGV2ZW50IGhhbmRsZXIgZm9yIGNvbW1hbmRzCi0JaW50W10gbWFzayA9IG5ldyBpbnRbXSB7IE9TLmtFdmVudENsYXNzQ29tbWFuZCwgT1Mua0V2ZW50UHJvY2Vzc0NvbW1hbmQgfTsKLQlPUy5JbnN0YWxsRXZlbnRIYW5kbGVyKE9TLkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKSwgY29tbWFuZFByb2MsCi0JCQltYXNrLmxlbmd0aCAvIDIsIG1hc2ssIDAsIG51bGwpOwotCi0JLy8gY3JlYXRlIEFib3V0IC4uLiBtZW51IGNvbW1hbmQKLQlpbnRbXSBvdXRNZW51ID0gbmV3IGludFsxXTsKLQlzaG9ydFtdIG91dEluZGV4ID0gbmV3IHNob3J0WzFdOwotCWlmIChPUy5HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoMCwga0hJQ29tbWFuZFByZWZlcmVuY2VzLCAxLAotCQkJb3V0TWVudSwgb3V0SW5kZXgpID09IE9TLm5vRXJyCi0JCQkmJiBvdXRNZW51WzBdICE9IDApIHsKLQkJaW50IG1lbnUgPSBvdXRNZW51WzBdOwotCi0JCWludCBsID0gYWJvdXROYW1lLmxlbmd0aCgpOwotCQljaGFyIGJ1ZmZlcltdID0gbmV3IGNoYXJbbF07Ci0JCWFib3V0TmFtZS5nZXRDaGFycygwLCBsLCBidWZmZXIsIDApOwotCQlpbnQgc3RyID0gT1MuQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyhPUy5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAotCQkJCWJ1ZmZlciwgbCk7Ci0JCU9TLkluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhtZW51LCBzdHIsIChzaG9ydCkgMCwgMCwKLQkJCQlrSElDb21tYW5kQWJvdXQpOwotCQlPUy5DRlJlbGVhc2Uoc3RyKTsKLQotCQkvLyBhZGQgc2VwYXJhdG9yIGJldHdlZW4gQWJvdXQgJiBQcmVmZXJlbmNlcwotCQlPUy5JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcobWVudSwgMCwgKHNob3J0KSAxLAotCQkJCU9TLmtNZW51SXRlbUF0dHJTZXBhcmF0b3IsIDApOwotCi0JCS8vIGVuYWJsZSBwcmVmIG1lbnUKLQkJT1MuRW5hYmxlTWVudUNvbW1hbmQobWVudSwga0hJQ29tbWFuZFByZWZlcmVuY2VzKTsKLQotCQkvLyBkaXNhYmxlIHNlcnZpY2VzIG1lbnUKLQkJT1MuRGlzYWJsZU1lbnVDb21tYW5kKG1lbnUsIGtISUNvbW1hbmRTZXJ2aWNlcyk7Ci0JfQotCi0JLy8gc2NoZWR1bGUgZGlzcG9zYWwgb2YgY2FsbGJhY2sgb2JqZWN0Ci0JZGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbW1hbmRDYWxsYmFjay5kaXNwb3NlKCk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxNzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4MDVmOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB2ZXJpZnkgaW5wdXQgKGZvcm1hdCBmb3IgZGF0ZSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTc5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIllZWVkvTU0vREQiKTs7CQotCWZpbmFsIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQl0ZXh0LmFkZExpc3RlbmVyKFNXVC5WZXJpZnksIG5ldyBMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBpZ25vcmU7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChpZ25vcmUpIHJldHVybjsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2J1ZmZlci5sZW5ndGgoKV07Ci0JCQlidWZmZXIuZ2V0Q2hhcnMoMCwgY2hhcnMubGVuZ3RoLCBjaGFycywgMCk7Ci0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogLyogW1ldWVlZICovCi0JCQkJCQljYXNlIDE6IC8qIFlbWV1ZWSAqLwotCQkJCQkJY2FzZSAyOiAvKiBZWVtZXVkgKi8KLQkJCQkJCWNhc2UgMzogLyogWVlZW1ldICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdZJyk7IAlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgNTogLyogW01dTSovCi0JCQkJCQljYXNlIDY6IC8qIE1bTV0gKi97Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnTScpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgODogLyogW0RdRCAqLwotCQkJCQkJY2FzZSA5OiAvKiBEW0RdICovIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKCdEJyk7IGJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSA0OiAvKiBZWVlZWy9dTU0gKi8KLQkJCQkJCWNhc2UgNzogLyogTU1bL11ERCAqLyB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZCgnLycpOyBicmVhazsKLQkJCQkJCX0KLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCi0JCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJaWYgKHN0YXJ0ID4gOSkgcmV0dXJuOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA0IHx8IHN0YXJ0ICsgaW5kZXggPT0gNykgewotCQkJCQlpZiAoY2hhcnNbaV0gPT0gJy8nKSB7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLmluc2VydChpbmRleCsrLCAnLycpOwotCQkJCX0KLQkJCQlpZiAoY2hhcnNbaV0gPCAnMCcgfHwgJzknIDwgY2hhcnNbaV0pIHJldHVybjsKLQkJCQlpZiAoc3RhcnQgKyBpbmRleCA9PSA1ICYmICAnMScgPCBjaGFyc1tpXSkgcmV0dXJuOyAvKiBbTV1NICovCi0JCQkJaWYgKHN0YXJ0ICsgaW5kZXggPT0gOCAmJiAgJzMnIDwgY2hhcnNbaV0pIHJldHVybjsgLyogW0RdRCAqLwotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50IGxlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgZGF0ZSA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJZGF0ZS5yZXBsYWNlKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgsIG5ld1RleHQpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIDE5MDEpOwotCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5KQU5VQVJZKTsKLQkJCWNhbGVuZGFyLnNldChDYWxlbmRhci5EQVRFLCAxKTsKLQkJCVN0cmluZyB5eXl5ID0gZGF0ZS5zdWJzdHJpbmcoMCwgNCk7Ci0JCQlpZiAoeXl5eS5pbmRleE9mKCdZJykgPT0gLTEpIHsKLQkJCQlpbnQgeWVhciA9IEludGVnZXIucGFyc2VJbnQoeXl5eSk7Ci0JCQkJY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotCQkJfQotCQkJU3RyaW5nIG1tID0gZGF0ZS5zdWJzdHJpbmcoNSwgNyk7Ci0JCQlpZiAobW0uaW5kZXhPZignTScpID09IC0xKSB7Ci0JCQkJaW50IG1vbnRoID0gIEludGVnZXIucGFyc2VJbnQobW0pIC0gMTsKLQkJCQlpbnQgbWF4TW9udGggPSBjYWxlbmRhci5nZXRBY3R1YWxNYXhpbXVtKENhbGVuZGFyLk1PTlRIKTsKLQkJCQlpZiAoMCA+IG1vbnRoIHx8IG1vbnRoID4gbWF4TW9udGgpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKTsKLQkJCX0KLQkJCVN0cmluZyBkZCA9IGRhdGUuc3Vic3RyaW5nKDgsMTApOwotCQkJaWYgKGRkLmluZGV4T2YoJ0QnKSA9PSAtMSkgewotCQkJCWludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KGRkKTsKLQkJCQlpbnQgbWF4RGF5ID0gY2FsZW5kYXIuZ2V0QWN0dWFsTWF4aW11bShDYWxlbmRhci5EQVRFKTsKLQkJCQlpZiAoMSA+IGRheSB8fCBkYXkgPiBtYXhEYXkpIHJldHVybjsKLQkJCQljYWxlbmRhci5zZXQoQ2FsZW5kYXIuREFURSwgZGF5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNhbGVuZGFyLmdldChDYWxlbmRhci5NT05USCkgID09IENhbGVuZGFyLkZFQlJVQVJZKSB7Ci0JCQkJCWNoYXIgZmlyc3RDaGFyID0gZGF0ZS5jaGFyQXQoOCk7Ci0JCQkJCWlmIChmaXJzdENoYXIgIT0gJ0QnICYmICcyJyA8IGZpcnN0Q2hhcikgcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBsZW5ndGgpOwotCQkJaWdub3JlID0gdHJ1ZTsKLQkJCXRleHQuaW5zZXJ0KG5ld1RleHQpOwotCQkJaWdub3JlID0gZmFsc2U7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhiZmI5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0b29sIGJhciAodGV4dCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsICgpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JYmFyLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5ICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0gCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2YzMWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENyZWF0ZSBhIG5vbi1yZWN0YW5ndWxhciBzaGVsbCB0byBzaW11bGF0ZSB0cmFuc3BhcmVuY3kKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotCS8vU2hlbGwgbXVzdCBiZSBjcmVhdGVkIHdpdGggc3R5bGUgU1dULk5PX1RSSU0KLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotCXNoZWxsLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JLy9kZWZpbmUgYSByZWdpb24gCi0JUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQlSZWN0YW5nbGUgcGl4ZWwgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEsIDEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgMjAwOyB5Kz0yKSB7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IDIwMDsgeCs9MikgewotCQkJCXBpeGVsLnggPSB4OwotCQkJCXBpeGVsLnkgPSB5OwotCQkJCXJlZ2lvbi5hZGQocGl4ZWwpOwotCQkJfQotCQl9Ci0JLy9kZWZpbmUgdGhlIHNoYXBlIG9mIHRoZSBzaGVsbCB1c2luZyBzZXRSZWdpb24KLQlzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQlSZWN0YW5nbGUgc2l6ZSA9IHJlZ2lvbi5nZXRCb3VuZHMoKTsKLQlzaGVsbC5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlQb2ludCBzaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCwgMTAsIDEwLCBzaXplLngtMjAsIHNpemUueS0yMCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlyZWdpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxNTg4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBBbGxvdyB1c2VyIHRvIHJlb3JkZXIgY29sdW1ucyBhbmQgcmVvcmRlciBjb2x1bW5zIHByb2dyYW1tYXRpY2FsbHkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IFJvd0xheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5DSEVDSyk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IFJvd0RhdGEoLTEsIDMwMCkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gMSIpOwotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gNCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCVN0cmluZ1tdIHRleHQgPSBuZXcgU3RyaW5nW117aSsiIDAiLCBpKyIgMSIsIGkrIiAyIiwgaSsiIDMiLCBpKyIgNCJ9OwotCQkJaXRlbS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW92ZSAiK2Uud2lkZ2V0KTsKLQkJCX0KLQkJfTsKLQkJVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0ucGFjaygpOwotCQkJY29sdW1uc1tpXS5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJCWNvbHVtbnNbaV0uYWRkTGlzdGVuZXIoU1dULk1vdmUsIGxpc3RlbmVyKTsKLQkJfQotCQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYi5zZXRUZXh0KCJpbnZlcnQgY29sdW1uIG9yZGVyIik7Ci0JCWIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWludFtdIG9yZGVyID0gdGFibGUuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aCAvIDI7IGkrKykgewotCQkJCQlpbnQgdGVtcCA9IG9yZGVyW2ldOwotCQkJCQlvcmRlcltpXSA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXTsKLQkJCQkJb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdID0gdGVtcDsKLQkJCQl9Ci0JCQkJdGFibGUuc2V0Q29sdW1uT3JkZXIob3JkZXIpOwotCQkJfQotCQl9KTsKLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxMGYyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluayBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGxpbmsgd2lkZ2V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTgyIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHNoZWxsLCBTV1QuQk9SREVSKTsKLQkJbGluay5zZXRUZXh0KCJUaGlzIGEgdmVyeSBzaW1wbGUgPEE+bGluazwvQT4gd2lkZ2V0LiIpOwotCQlsaW5rLnNldFNpemUoMTQwLCA0MCk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjNWExZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTgzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGluayBleGFtcGxlIHNuaXBwZXQ6IGRldGVjdCBzZWxlY3Rpb24gZXZlbnRzIGluIGEgbGluayB3aWRnZXQKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4MyB7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJTGluayBsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OT05FKTsKLQkJU3RyaW5nIHRleHQgPSAiVGhlIFNXVCBjb21wb25lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSA8YT5lZmZpY2llbnQ8L2E+LCA8YT5wb3J0YWJsZTwvYT4gPGEgaHJlZj1cIm5hdGl2ZVwiPmFjY2VzcyB0byB0aGUgdXNlci1pbnRlcmZhY2UgZmFjaWxpdGllcyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbXM8L2E+IG9uIHdoaWNoIGl0IGlzIGltcGxlbWVudGVkLiI7Ci0JCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJbGluay5zZXRTaXplKDQwMCwgNDAwKTsKLQkJbGluay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWxlY3Rpb246ICIgKyBldmVudC50ZXh0KTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnBhY2sgKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxODk1YS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU3Bpbm5lciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNwaW5uZXIgd2lkZ2V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JCXNwaW5uZXIuc2V0TWluaW11bSgwKTsKLQkJc3Bpbm5lci5zZXRNYXhpbXVtKDEwMDApOwotCQlzcGlubmVyLnNldFNlbGVjdGlvbig1MDApOwotCQlzcGlubmVyLnNldEluY3JlbWVudCgxKTsKLQkJc3Bpbm5lci5zZXRQYWdlSW5jcmVtZW50KDEwMCk7Ci0JCXNwaW5uZXIucGFjaygpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZDdjNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1ha2UgYSBkcm9wcGVkIGRhdGEgdHlwZSBkZXBlbmQgb24gYSB0YXJnZXQgaXRlbSBpbiB0YWJsZQotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWlmIChpICUgMiA9PSAwKSBpdGVtLnNldFRleHQoIkRyb3AgYSBmaWxlIik7Ci0JCWlmIChpICUgMiA9PSAxKSBpdGVtLnNldFRleHQoIkRyb3AgdGV4dCIpOwotCX0KLQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCWRyYWdTb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJ0ZW1wIik7Ci0JCQkJZXZlbnQuZGF0YSA9IG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX07Ci0JCQl9Ci0JCQlpZiAoVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJCWV2ZW50LmRhdGEgPSAib25jZSB1cG9uIGEgdGltZSI7Ci0JCQl9Ci0JCX0gCi0JfSk7Ci0JRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGFibGUsIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9ERUZBVUxUKTsKLQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlkcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCUZpbGVUcmFuc2ZlciBmaWxlVHJhbnNmZXIgPSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJVGV4dFRyYW5zZmVyIHRleHRUcmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm47Ci0JCQlpbnQgaXRlbUluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWlmIChpdGVtSW5kZXggJSAyID09IDApIHsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJaWYgKGZpbGVUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2luZGV4XSkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQlpZiAoaW5kZXggPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoKSB7Ci0JCQkJCWV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IGV2ZW50LmRhdGFUeXBlc1tpbmRleF07Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJd2hpbGUgKGluZGV4IDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aCkgewotCQkJCQlpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbaW5kZXhdKSkgYnJlYWs7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGgpIHsKLQkJCQkJZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2luZGV4XTsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChmaWxlVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCQlTdHJpbmdbXSBmaWxlcyA9IChTdHJpbmdbXSlldmVudC5kYXRhOwotCQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaXRlbS5zZXRUZXh0KGZpbGVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGV4dFRyYW5zZmVyLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAxNTApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5Zjg4MDMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPEhUTUw+Ci0gIDxIRUFEPgotICAgIDxUSVRMRT5Qb3N0PC9USVRMRT4KLQk8cD5UZXN0IGZvciBQb3N0aW5nIERhdGEgaW4gSUU8L3A+Ci0KLSAgPC9IRUFEPgotCi0gIDxCT0RZPgotICAgIDxGT1JNIE1FVEhPRD0icG9zdCIKLSAgICAgICBBQ1RJT049Imh0dHA6Ly9ob3N0L2NnaS1iaW4vbWFzX2Zvcm0iPgotICAgIDxJTlBVVCBUWVBFPSJ0ZXh0IiBOQU1FPSJuYW1lIgotICAgICAgIFNJWkU9MjAgVkFMVUU9IlRyeSBpdCAocG9zdCkiPgotIDwvRk9STT4KLSAKLSAgPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTE4N2U0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUmVhZGluZyBhbmQgd3JpdGluZyB0byBhIFNBRkVBUlJBWQotICogCi0gKiBUaGlzIGV4YW1wbGUgcmVhZHMgZnJvbSBhIFBvc3REYXRhIG9iamVjdCBpbiBhIEJlZm9yZU5hdmlnYXRlMiBldmVudCBhbmQKLSAqIGNyZWF0ZXMgYSBQb3N0RGF0YSBvYmplY3QgaW4gYSBjYWxsIHRvIE5hdmlnYXRlLiAod2luMzIgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTg2IHsKLQotc3RhdGljIGludCBDb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCi0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JQnV0dG9uIGdvID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWdvLnNldFRleHQoIkdvIik7Ci0JT2xlRnJhbWUgb2xlRnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQlvbGVGcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpKTsKLQlPbGVDb250cm9sU2l0ZSBjb250cm9sU2l0ZTsKLQlPbGVBdXRvbWF0aW9uIGF1dG9tYXRpb247Ci0JdHJ5IHsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUob2xlRnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJYXV0b21hdGlvbiA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBleCkgewotCQlyZXR1cm47Ci0JfQotCQotCWZpbmFsIE9sZUF1dG9tYXRpb24gYXV0byA9IGF1dG9tYXRpb247Ci0JZ28uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgdXJsID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQlpbnRbXSByZ2Rpc3BpZCA9IGF1dG8uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCJ9KTsgCi0JCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbMV07Ci0JCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQkJaW50W10gcmdkaXNwaWROYW1lZEFyZ3MgPSBuZXcgaW50WzFdOwotCQkJcmdkaXNwaWROYW1lZEFyZ3NbMF0gPSByZ2Rpc3BpZFsxXTsKLQkJCWF1dG8uaW52b2tlKGRpc3BJZE1lbWJlciwgcmd2YXJnLCByZ2Rpc3BpZE5hbWVkQXJncyk7Ci0JCX0KLQl9KTsKLQkKLQkKLQkvLyBSZWFkIFBvc3REYXRhIHdoZW5ldmVyIHdlIG5hdmlnYXRlIHRvIGEgc2l0ZSB0aGF0IHVzZXMgaXQKLQlpbnQgQmVmb3JlTmF2aWdhdGUyID0gMHhmYTsKLQljb250cm9sU2l0ZS5hZGRFdmVudExpc3RlbmVyKEJlZm9yZU5hdmlnYXRlMiwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJVmFyaWFudCB1cmwgPSBldmVudC5hcmd1bWVudHNbMV07Ci0JCQlWYXJpYW50IHBvc3REYXRhID0gZXZlbnQuYXJndW1lbnRzWzRdOwotCQkJaWYgKHBvc3REYXRhICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvc3REYXRhID0gIityZWFkU2FmZUFycmF5KHBvc3REYXRhKSsiLCBVUkwgPSAiK3VybC5nZXRTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBOYXZpZ2F0ZSB0byB0aGlzIHdlYiBzaXRlIHdoaWNoIHVzZXMgcG9zdCBkYXRhIHRvIGZpbGwgaW4gdGhlIHRleHQgZmllbGQKLQkvLyBhbmQgcHV0IHRoZSBzdHJpbmcgImhlbGxvIHdvcmxkIiBpbnRvIHRoZSB0ZXh0IGJveAotCXRleHQuc2V0VGV4dCgiZmlsZTovLyIrU25pcHBldDE4Ni5jbGFzcy5nZXRSZXNvdXJjZSgiU25pcHBldDE4Ni5odG1sIikuZ2V0RmlsZSgpKTsKLQlpbnRbXSByZ2Rpc3BpZCA9IGF1dG9tYXRpb24uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117Ik5hdmlnYXRlIiwgIlVSTCIsICJQb3N0RGF0YSJ9KTsgCi0JaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwkKLQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbMl07Ci0Jcmd2YXJnWzBdID0gbmV3IFZhcmlhbnQodGV4dC5nZXRUZXh0KCkpOwotCXJndmFyZ1sxXSA9IHdyaXRlU2FmZUFycmF5KCJoZWxsbyB3b3JsZCIpOwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFsyXTsKLQlyZ2Rpc3BpZE5hbWVkQXJnc1swXSA9IHJnZGlzcGlkWzFdOwotCXJnZGlzcGlkTmFtZWRBcmdzWzFdID0gcmdkaXNwaWRbMl07Ci0JYXV0b21hdGlvbi5pbnZva2UoZGlzcElkTWVtYmVyLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQkJCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi0vLyBUaGUgZm9sbG93aW5nIHN0cnVjdHMgYXJlIGFjY2Vzc2VkIGluIHRoZSByZWFkU2FmZUFycmF5IGFuZCB3cml0ZVNhZmVBcnJheQotLy8gZnVuY3Rpb25zOgotLy8KLS8vIFZBUklBTlQ6Ci0vLyAJCXNob3J0IHZ0Ci0vLyAJCXNob3J0IHdSZXNlcnZlZDEKLS8vIAkJc2hvcnQgd1Jlc2VydmVkMgotLy8gCQlzaG9ydCB3UmVzZXJ2ZWQzCi0vLyAJCWludCBwYXJyYXkKLS8vCi0vLyBTQUZFQVJSQVk6Ci0vLyAgICAgIHNob3J0IGNEaW1zICAgICAgLy8gQ291bnQgb2YgZGltZW5zaW9ucyBpbiB0aGlzIGFycmF5Ci0vLyAgICAgIHNob3J0IGZGZWF0dXJlcyAgLy8gRmxhZ3MgdXNlZCBieSB0aGUgU2FmZUFycmF5Ci0vLyAgICAgIGludCBjYkVsZW1lbnRzICAgLy8gU2l6ZSBvZiBhbiBlbGVtZW50IG9mIHRoZSBhcnJheQotLy8gICAgICBpbnQgY0xvY2tzICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyB0aGUgYXJyYXkgaGFzIGJlZW4gbG9ja2VkIHdpdGhvdXQgY29ycmVzcG9uZGluZyB1bmxvY2sKLS8vICAgICAgaW50IHB2RGF0YSAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBkYXRhCi0vLyAgICAgIFNBRkVBUlJBWUJPVU5EW10gcmdzYWJvdW5kIC8vIE9uZSBib3VuZCBmb3IgZWFjaCBkaW1lbnNpb24KLS8vCi0vLyBTQUZFQVJSQVlCT1VORDoKLS8vICAgICAgaW50IGNFbGVtZW50cyAgICAvLyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkaW1lbnNpb24KLS8vICAgICAgaW50IGxMYm91bmQgICAgICAvLyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGRpbWVuc2lvbiAKLQotc3RhdGljIFN0cmluZyByZWFkU2FmZUFycmF5KFZhcmlhbnQgdmFyaWFudEJ5UmVmKSB7Ci0JLy8gUmVhZCBhIHNhZmVhcnJheSB0aGF0IGNvbnRhaW5zIGRhdGEgb2YgCi0JLy8gdHlwZSBWVF9VSTEgKHVuc2lnbmVkIHNob3J0cykgd2hpY2ggY29udGFpbnMKLQkvLyBhIHRleHQgc3RyZWFtLgotICAgIGludCBwUG9zdERhdGEgPSB2YXJpYW50QnlSZWYuZ2V0QnlSZWYoKTsKLSAgICBzaG9ydFtdIHZ0X3R5cGUgPSBuZXcgc2hvcnRbMV07Ci0gICAgT1MuTW92ZU1lbW9yeSh2dF90eXBlLCBwUG9zdERhdGEsIDIpOwotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGlmICh2dF90eXBlWzBdID09IChzaG9ydCkoT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQpKSB7Ci0gICAgICAgIGludFtdIHBWYXJpYW50ID0gbmV3IGludFsxXTsKLSAgICAgICAgT1MuTW92ZU1lbW9yeShwVmFyaWFudCwgcFBvc3REYXRhICsgOCwgNCk7Ci0gICAgICAgIHZ0X3R5cGUgPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkodnRfdHlwZSwgcFZhcmlhbnRbMF0sIDIpOwotICAgICAgICBpZiAodnRfdHlwZVswXSA9PSAoc2hvcnQpKE9MRS5WVF9BUlJBWSB8IE9MRS5WVF9VSTEpKSB7Ci0gICAgICAgICAgICBpbnRbXSBwU2FmZWFycmF5ID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocFNhZmVhcnJheSwgcFZhcmlhbnRbMF0gKyA4LCA0KTsKLSAgICAgICAgICAgIHNob3J0W10gY0RpbXMgPSBuZXcgc2hvcnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KGNEaW1zLCBwU2FmZWFycmF5WzBdLCAyKTsKLSAgICAgICAgICAgIGludFtdIHB2RGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHB2RGF0YSwgcFNhZmVhcnJheVswXSArIDEyLCA0KTsKLSAgICAgICAgICAgIGludCBzYWZlYXJyYXlib3VuZE9mZnNldCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNEaW1zWzBdOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBjRWxlbWVudHMgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkoY0VsZW1lbnRzLCBwU2FmZWFycmF5WzBdICsgMTYgKyBzYWZlYXJyYXlib3VuZE9mZnNldCwgNCk7Ci0gICAgICAgICAgICAgICAgc2FmZWFycmF5Ym91bmRPZmZzZXQgKz0gODsKLSAgICAgICAgICAgICAgICBpbnQgY2NoV2lkZUNoYXIgPSBPUy5NdWx0aUJ5dGVUb1dpZGVDaGFyIChDb2RlUGFnZSwgT1MuTUJfUFJFQ09NUE9TRUQsICBwdkRhdGFbMF0sIC0xLCBudWxsLCAwKTsKLQkJCQlpZiAoY2NoV2lkZUNoYXIgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQkJY2hhcltdIGxwV2lkZUNoYXJTdHIgPSBuZXcgY2hhciBbY2NoV2lkZUNoYXIgLSAxXTsKLQkJCQlPUy5NdWx0aUJ5dGVUb1dpZGVDaGFyIChDb2RlUGFnZSwgT1MuTUJfUFJFQ09NUE9TRUQsICBwdkRhdGFbMF0sIC0xLCBscFdpZGVDaGFyU3RyLCBscFdpZGVDaGFyU3RyLmxlbmd0aCk7Ci0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZyhscFdpZGVDaGFyU3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgVmFyaWFudCB3cml0ZVNhZmVBcnJheSAoU3RyaW5nIHN0cmluZykgewotCS8vIENyZWF0ZSBhIG9uZSBkaW1lbnNpb25hbCBzYWZlYXJyYXkgY29udGFpbmluZyB0d28gVlRfVUkxIHZhbHVlcwotCS8vIHdoZXJlIFZUX1VJMSBpcyBhbiB1bnNpZ25lZCBjaGFyCi0JCi0JLy8gRGVmaW5lIGNEaW1zLCBmRmVhdHVyZXMgYW5kIGNiRWxlbWVudHMKLQlzaG9ydCBjRGltcyA9IDE7Ci0Jc2hvcnQgRkFERl9GSVhFRFNJWkUgPSAweDEwOwotCXNob3J0IEZBREZfSEFWRVZBUlRZUEUgPSAweDgwOwotCXNob3J0IGZGZWF0dXJlcyA9IChzaG9ydCkoRkFERl9GSVhFRFNJWkUgfCBGQURGX0hBVkVWQVJUWVBFKTsKLQlpbnQgY2JFbGVtZW50cyA9IDE7Ci0JLy8gQ3JlYXRlIGEgcG9pbnRlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0Ci0JaW50IGNvdW50ID0gc3RyaW5nLmxlbmd0aCgpOwotCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2NvdW50ICsgMV07Ci0Jc3RyaW5nLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JaW50IGNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoQ29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7Ci0JaWYgKGNjaE11bHRpQnl0ZSA9PSAwKSByZXR1cm4gbnVsbDsKLQlpbnQgcHZEYXRhID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIGNjaE11bHRpQnl0ZSk7Ci0JT1MuV2lkZUNoYXJUb011bHRpQnl0ZShDb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBwdkRhdGEsIGNjaE11bHRpQnl0ZSwgbnVsbCwgbnVsbCk7Ci0JaW50IGNFbGVtZW50czEgPSBjY2hNdWx0aUJ5dGU7Ci0JaW50IGxMYm91bmQxID0gMDsKLQkvLyBDcmVhdGUgYSBzYWZlYXJyYXkgaW4gbWVtb3J5Ci0JLy8gMTIgYnl0ZXMgZm9yIGNEaW1zLCBmRmVhdHVyZXMgYW5kIGNiRWxlbWVudHMgKyA0IGJ5dGVzIGZvciBwdkRhdGEgKyBudW1iZXIgb2YgZGltZW5zaW9ucyAqIChzaXplIG9mIHNhZmVhcnJheWJvdW5kKQotCWludCBzaXplb2ZTYWZlQXJyYXkgPSAxMiArIDQgKyAxKjg7Ci0JaW50IHBTYWZlQXJyYXkgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgc2l6ZW9mU2FmZUFycmF5KTsKLQkvLyBDb3B5IHRoZSBkYXRhIGludG8gdGhlIHNhZmUgYXJyYXkKLQlpbnQgb2Zmc2V0ID0gMDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBzaG9ydFtdIHtjRGltc30sIDIpOyBvZmZzZXQgKz0gMjsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBzaG9ydFtdIHtmRmVhdHVyZXN9LCAyKTsgb2Zmc2V0ICs9IDI7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge2NiRWxlbWVudHN9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10gezB9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JT1MuTW92ZU1lbW9yeShwU2FmZUFycmF5ICsgb2Zmc2V0LCBuZXcgaW50W10ge3B2RGF0YX0sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7Y0VsZW1lbnRzMX0sIDQpOyBvZmZzZXQgKz0gNDsKLQlPUy5Nb3ZlTWVtb3J5KHBTYWZlQXJyYXkgKyBvZmZzZXQsIG5ldyBpbnRbXSB7bExib3VuZDF9LCA0KTsgb2Zmc2V0ICs9IDQ7Ci0JLy8gQ3JlYXRlIGEgdmFyaWFudCBpbiBtZW1vcnkgdG8gaG9sZCB0aGUgc2FmZWFycmF5Ci0JaW50IHBWYXJpYW50ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIFZhcmlhbnQuc2l6ZW9mKTsKLQlzaG9ydCB2dCA9IChzaG9ydCkoT0xFLlZUX0FSUkFZIHwgT0xFLlZUX1VJMSk7Ci0JT1MuTW92ZU1lbW9yeShwVmFyaWFudCwgbmV3IHNob3J0W10ge3Z0fSwgMik7Ci0JT1MuTW92ZU1lbW9yeShwVmFyaWFudCArIDgsIG5ldyBpbnRbXXtwU2FmZUFycmF5fSwgNCk7Ci0JLy8gQ3JlYXRlIGEgYnkgcmVmIHZhcmlhbnQKLQlWYXJpYW50IHZhcmlhbnRCeVJlZiA9IG5ldyBWYXJpYW50KHBWYXJpYW50LCAoc2hvcnQpKE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9WQVJJQU5UKSk7Ci0JcmV0dXJuIHZhcmlhbnRCeVJlZjsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbCBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMjc2Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08SFRNTD4KLSAgPEhFQUQ+Ci0gICAgPFRJVExFPkV2YWx1YXRlPC9USVRMRT4KLQk8cD5UZXN0IGZvciBJRSBTY3JpcHQ8L3A+Ci0gICAgPFNDUklQVD4KLSAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlKHgpCi0gICAgICB7Ci0gICAgICAgICBhbGVydCgiaGVsbG8iKQotICAgICAgICAgcmV0dXJuIGV2YWwoeCkKLSAgICAgIH0KLSAgIDwvU0NSSVBUPgotICA8L0hFQUQ+Ci0KLSAgPEJPRFk+Ci0gIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMDE2Mi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFJ1bm5pbmcgYSBzY3JpcHQgd2l0aGluIElFLiAod2luMzIgb25seSkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4NyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JT2xlQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0JdHJ5IHsKLQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJY29udHJvbFNpdGUgPSBuZXcgT2xlQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiU2hlbGwuRXhwbG9yZXIiKTsKLQkJY29udHJvbFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyBJV2ViQnJvd3NlcgotCWZpbmFsIE9sZUF1dG9tYXRpb24gd2ViQnJvd3NlciA9IG5ldyBPbGVBdXRvbWF0aW9uKGNvbnRyb2xTaXRlKTsKLQotCS8vIFdoZW4gdGhlIGRvY3VtZW50IGlzIGxvYWRlZCwgYWNjZXNzIHRoZSBkb2N1bWVudCBvYmplY3QgZm9yIHRoZSBuZXcgcGFnZQotCS8vIGFuZCBldmFsdXRlIGV4cHJlc3Npb24gdXNpbmcgU2NyaXB0LgotCWludCBEb3dubG9hZENvbXBsZXRlID0gMTA0OwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJaW50W10gaHRtbERvY3VtZW50SUQgPSB3ZWJCcm93c2VyLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdeyJEb2N1bWVudCJ9KTsgCi0JCQlpZiAoaHRtbERvY3VtZW50SUQgPT0gbnVsbCkgcmV0dXJuOwotCQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gd2ViQnJvd3Nlci5nZXRQcm9wZXJ0eShodG1sRG9jdW1lbnRJRFswXSk7Ci0JCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCS8vSUhUTUxEb2N1bWVudDIKLQkJCU9sZUF1dG9tYXRpb24gaHRtbERvY3VtZW50ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaHRtbERvY3VtZW50ID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCi0JCQkJaW50W10gc2NyaXB0SUQgPSBodG1sRG9jdW1lbnQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW117IlNjcmlwdCJ9KTsgCi0JCQkJaWYgKHNjcmlwdElEID09IG51bGwpIHJldHVybjsKLQkJCQlwVmFyUmVzdWx0ID0gaHRtbERvY3VtZW50LmdldFByb3BlcnR5KHNjcmlwdElEWzBdKTsKLQkJCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCQlPbGVBdXRvbWF0aW9uIGh0bWxXaW5kb3cgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vSUhUTUxXaW5kb3cyCi0JCQkJCWh0bWxXaW5kb3cgPSBwVmFyUmVzdWx0LmdldEF1dG9tYXRpb24oKTsKLQkJCQkJcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJCWludFtdIGV2YWx1YXRlSUQgPSBodG1sV2luZG93LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsiZXZhbHVhdGUifSk7Ci0JCQkJCWlmIChldmFsdWF0ZUlEID09IG51bGwpIHJldHVybjsKLQkJCQkJU3RyaW5nIGV4cHJlc3Npb24gPSAiNStNYXRoLnNpbig5KSI7Ci0JCQkJCVZhcmlhbnRbXSByZ3ZhcmcgPSBuZXcgVmFyaWFudFtdIHtuZXcgVmFyaWFudChleHByZXNzaW9uKX07Ci0JCQkJCXBWYXJSZXN1bHQgPSBodG1sV2luZG93Lmludm9rZShldmFsdWF0ZUlEWzBdLCByZ3ZhcmcsIG51bGwpOwotCQkJCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IDApIHJldHVybjsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGV4cHJlc3Npb24rIiA9IitwVmFyUmVzdWx0LmdldFN0cmluZygpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlodG1sV2luZG93LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWh0bWxEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQkvLyBOYXZpZ2F0ZSB0byBhIHdlYiBzaXRlCi0JaW50W10gaWRzID0gd2ViQnJvd3Nlci5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXXsiTmF2aWdhdGUiLCAiVVJMIn0pOyAKLQlWYXJpYW50W10gcmd2YXJnID0gbmV3IFZhcmlhbnRbXSB7bmV3IFZhcmlhbnQoImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0Uvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4Ny5odG1sIil9OwotCWludFtdIHJnZGlzcGlkTmFtZWRBcmdzID0gbmV3IGludFtde2lkc1sxXX07Ci0Jd2ViQnJvd3Nlci5pbnZva2UoaWRzWzBdLCByZ3ZhcmcsIHJnZGlzcGlkTmFtZWRBcmdzKTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCS8vUmVtZW1iZXIgdG8gcmVsZWFzZSBPbGVBdXRvbWF0aW9uIE9iamVjdAotCXdlYkJyb3dzZXIuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotCQotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1ZDg5Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogU2Nyb2xsIGEgd2lkZ2V0IGludG8gdmlldyBvbiBmb2N1cyBpbgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxODggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gYjEgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYjEuc2V0VGV4dCgidG9wIik7Ci0JYjEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlzYy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDEsIDEpKTsKLQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoc2MsIFNXVC5OT05FKTsKLQljLnNldExheW91dChuZXcgR3JpZExheW91dCgxMCwgdHJ1ZSkpOwotCWZvciAoaW50IGkgPSAwIDsgaSA8IDMwMDsgaSsrKSB7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiQnV0dG9uICIraSk7Ci0JfQotCUJ1dHRvbiBiMiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQliMi5zZXRUZXh0KCJib3R0b20iKTsKLQliMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JCi0Jc2Muc2V0Q29udGVudChjKTsKLQlzYy5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCXNjLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCXNjLnNldE1pblNpemUoYy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gKENvbnRyb2wpZS53aWRnZXQ7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gY2hpbGQuZ2V0Qm91bmRzKCk7Ci0JCQlSZWN0YW5nbGUgYXJlYSA9IHNjLmdldENsaWVudEFyZWEoKTsKLQkJCVBvaW50IG9yaWdpbiA9IHNjLmdldE9yaWdpbigpOwotCQkJaWYgKG9yaWdpbi54ID4gYm91bmRzLngpIG9yaWdpbi54ID0gTWF0aC5tYXgoMCwgYm91bmRzLngpOwotCQkJaWYgKG9yaWdpbi55ID4gYm91bmRzLnkpIG9yaWdpbi55ID0gTWF0aC5tYXgoMCwgYm91bmRzLnkpOwotCQkJaWYgKG9yaWdpbi54ICsgYXJlYS53aWR0aCA8IGJvdW5kcy54ICsgYm91bmRzLndpZHRoKSBvcmlnaW4ueCA9IE1hdGgubWF4KDAsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gYXJlYS53aWR0aCk7Ci0JCQlpZiAob3JpZ2luLnkgKyBhcmVhLmhlaWdodCA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCkgb3JpZ2luLnkgPSBNYXRoLm1heCgwLCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLSBhcmVhLmhlaWdodCk7Ci0JCQlzYy5zZXRPcmlnaW4ob3JpZ2luKTsKLQkJfQotCX07Ci0JQ29udHJvbFtdIGNvbnRyb2xzID0gYy5nZXRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJY29udHJvbHNbaV0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JfQotCXNoZWxsLnNldFNpemUoMzAwLCA1MDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTg5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjMwYjIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE4OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFRleHQgd2l0aCB1bmRlcmxpbmUgYW5kIHN0cmlrZSB0aHJvdWdoCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDE4OSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiU3R5bGVkVGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2giKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkgQUJDREVGR0hJSktMTSBOT1BRUlNUVVZXWFlaIik7Ci0JLy8gbWFrZSAwMTIzNDU2Nzg5IGFwcGVhciB1bmRlcmxpbmVkCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMS5zdGFydCA9IDA7Ci0Jc3R5bGUxLmxlbmd0aCA9IDEwOwotCXN0eWxlMS51bmRlcmxpbmUgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTEpOwotCS8vIG1ha2UgQUJDREVGR0hJSktMTSBoYXZlIGEgc3RyaWtlIHRocm91Z2gKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLnN0YXJ0ID0gMTE7Ci0Jc3R5bGUyLmxlbmd0aCA9IDEzOwotCXN0eWxlMi5zdHJpa2VvdXQgPSB0cnVlOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZTIpOwotCS8vIG1ha2UgTk9QUVJTVFVWV1hZWiBhcHBlYXIgdW5kZXJsaW5lZCBhbmQgaGF2ZSBhIHN0cmlrZSB0aHJvdWdoCi0JU3R5bGVSYW5nZSBzdHlsZTMgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMy5zdGFydCA9IDI1OwotCXN0eWxlMy5sZW5ndGggPSAxMzsKLQlzdHlsZTMudW5kZXJsaW5lID0gdHJ1ZTsKLQlzdHlsZTMuc3RyaWtlb3V0ID0gdHJ1ZTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUzKTsKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2OTE2OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogdmVyaWZ5IGlucHV0IChvbmx5IGFsbG93IGRpZ2l0cykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMjAwKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuVmVyaWZ5LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IGUudGV4dDsKLQkJCWNoYXIgW10gY2hhcnMgPSBuZXcgY2hhciBbc3RyaW5nLmxlbmd0aCAoKV07Ci0JCQlzdHJpbmcuZ2V0Q2hhcnMgKDAsIGNoYXJzLmxlbmd0aCwgY2hhcnMsIDApOwotCQkJZm9yIChpbnQgaT0wOyBpPGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCEoJzAnIDw9IGNoYXJzIFtpXSAmJiBjaGFycyBbaV0gPD0gJzknKSkgewotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNzFjNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKgotICogRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGluIFNwaW5uZXIKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkwIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTcGlubmVyIHdpdGggZmxvYXQgdmFsdWVzIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCWZpbmFsIFNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JLy8gYWxsb3cgMyBkZWNpbWFsIHBsYWNlcwotCXNwaW5uZXIuc2V0RGlnaXRzKDMpOwotCS8vIHNldCB0aGUgbWluaW11bSB2YWx1ZSB0byAwLjAwMQotCXNwaW5uZXIuc2V0TWluaW11bSgxKTsKLQkvLyBzZXQgdGhlIG1heGltdW0gdmFsdWUgdG8gMjAKLQlzcGlubmVyLnNldE1heGltdW0oMjAwMDApOwotCS8vIHNldCB0aGUgaW5jcmVtZW50IHZhbHVlIHRvIDAuMDEwCi0Jc3Bpbm5lci5zZXRJbmNyZW1lbnQoMTApOwotCS8vIHNldCB0aGUgc2VsZXRpb24gdG8gMy40NTYKLQlzcGlubmVyLnNldFNlbGVjdGlvbigzNDU2KTsKLQlzcGlubmVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgc2VsZWN0aW9uID0gc3Bpbm5lci5nZXRTZWxlY3Rpb24oKTsKLQkJCWludCBkaWdpdHMgPSBzcGlubmVyLmdldERpZ2l0cygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZWxlY3Rpb24gaXMgIisoc2VsZWN0aW9uIC8gTWF0aC5wb3coMTAsIGRpZ2l0cykpKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhYzFhNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBEZXRlY3Qgd2hlbiB0aGUgdXNlciBzY3JvbGxzIGEgdGV4dCBjb250cm9sCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTEgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwzMjsgaSsrKSB7Ci0JCXRleHQuYXBwZW5kIChpICsgIi1UaGlzIGlzIGEgbGluZSBvZiB0ZXh0IGluIGEgd2lkZ2V0LSIgKyBpICsgIlxuIik7Ci0JfQotCXRleHQuc2V0U2VsZWN0aW9uICgwKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lciAoKSB7Ci0JCWludCBsYXN0SW5kZXggPSB0ZXh0LmdldFRvcEluZGV4ICgpOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJaW50IGluZGV4ID0gdGV4dC5nZXRUb3BJbmRleCAoKTsKLQkJCWlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHsKLQkJCQlsYXN0SW5kZXggPSBpbmRleDsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJTY3JvbGxlZCwgdG9wSW5kZXg9IiArIGluZGV4KTsKLQkJCX0KLQkJfQotCX07Ci0JLyogTk9URTogT25seSBkZXRlY3RzIHNjcm9sbGluZyBieSB0aGUgdXNlciAqLwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlVXAsIGxpc3RlbmVyKTsKLQl0ZXh0LmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCXRleHQuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIGxpc3RlbmVyKTsKLQlTY3JvbGxCYXIgaEJhciA9IHRleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotCWlmIChoQmFyICE9IG51bGwpIHsKLQkJaEJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQlTY3JvbGxCYXIgdkJhciA9IHRleHQuZ2V0VmVydGljYWxCYXIoKTsKLQlpZiAodkJhciAhPSBudWxsKSB7Ci0JCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLQl9Ci0Jc2hlbGwucGFjayAoKTsKLQlQb2ludCBzaXplID0gc2hlbGwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoc2l6ZS4geCAtIDMyLCBzaXplLnkgLyAyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhkNmQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIFNob3cgYSBzb3J0IGluZGljYXRvciBpbiB0aGUgY29sdW1uIGhlYWRlcgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTIgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCS8vIGluaXRpYWxpemUgZGF0YSB3aXRoIGtleXMgYW5kIHJhbmRvbSB2YWx1ZXMKLQlpbnQgc2l6ZSA9IDEwMDsKLQlSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwotCWZpbmFsIGludFtdW10gZGF0YSA9IG5ldyBpbnRbc2l6ZV1bXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJZGF0YVtpXSA9IG5ldyBpbnRbXSB7aSwgcmFuZG9tLm5leHRJbnQoKX07Ci0JfQotCS8vIGNyZWF0ZSBhIHZpcnR1YWwgdGFibGUgdG8gZGlzcGxheSBkYXRhCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WSVJUVUFMKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRJdGVtQ291bnQoc2l6ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiS2V5Iik7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlZhbHVlIik7Ci0JY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZXREYXRhLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZS5pdGVtOwotCQkJaW50IGluZGV4ID0gdGFibGUuaW5kZXhPZihpdGVtKTsKLQkJCWludFtdIGRhdHVtID0gZGF0YVtpbmRleF07Ci0JCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtJbnRlZ2VyLnRvU3RyaW5nKGRhdHVtWzBdKSwKLQkJCQkJSW50ZWdlci50b1N0cmluZyhkYXR1bVsxXSkgfSk7Ci0JCX0KLQl9KTsKLQkvLyBBZGQgc29ydCBpbmRpY2F0b3IgYW5kIHNvcnQgZGF0YSB3aGVuIGNvbHVtbiBzZWxlY3RlZAotCUxpc3RlbmVyIHNvcnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJLy8gZGV0ZXJtaW5lIG5ldyBzb3J0IGNvbHVtbiBhbmQgZGlyZWN0aW9uCi0JCQlUYWJsZUNvbHVtbiBzb3J0Q29sdW1uID0gdGFibGUuZ2V0U29ydENvbHVtbigpOwotCQkJVGFibGVDb2x1bW4gY3VycmVudENvbHVtbiA9IChUYWJsZUNvbHVtbikgZS53aWRnZXQ7Ci0JCQlpbnQgZGlyID0gdGFibGUuZ2V0U29ydERpcmVjdGlvbigpOwotCQkJaWYgKHNvcnRDb2x1bW4gPT0gY3VycmVudENvbHVtbikgewotCQkJCWRpciA9IGRpciA9PSBTV1QuVVAgPyBTV1QuRE9XTiA6IFNXVC5VUDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFibGUuc2V0U29ydENvbHVtbihjdXJyZW50Q29sdW1uKTsKLQkJCQlkaXIgPSBTV1QuVVA7Ci0JCQl9Ci0JCQkvLyBzb3J0IHRoZSBkYXRhIGJhc2VkIG9uIGNvbHVtbiBhbmQgZGlyZWN0aW9uCi0JCQlmaW5hbCBpbnQgaW5kZXggPSBjdXJyZW50Q29sdW1uID09IGNvbHVtbjEgPyAwIDogMTsKLQkJCWZpbmFsIGludCBkaXJlY3Rpb24gPSBkaXI7Ci0JCQlBcnJheXMuc29ydChkYXRhLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJCWludFtdIGEgPSAoaW50W10pIGFyZzA7Ci0JCQkJCWludFtdIGIgPSAoaW50W10pIGFyZzE7Ci0JCQkJCWlmIChhW2luZGV4XSA9PSBiW2luZGV4XSkgcmV0dXJuIDA7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gU1dULlVQKSB7Ci0JCQkJCQlyZXR1cm4gYVtpbmRleF0gPCBiW2luZGV4XSA/IC0xIDogMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gYVtpbmRleF0gPCBiW2luZGV4XSA/IDEgOiAtMTsKLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIHVwZGF0ZSBkYXRhIGRpc3BsYXllZCBpbiB0YWJsZQotCQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihkaXIpOwotCQkJdGFibGUuY2xlYXJBbGwoKTsKLQkJfQotCX07Ci0JY29sdW1uMS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotCWNvbHVtbjIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc29ydExpc3RlbmVyKTsKLQl0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbjEpOwotCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oU1dULlVQKTsKLQlzaGVsbC5zZXRTaXplKHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueCwgMzAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDQxY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEFsbG93IHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGFuZCByZW9yZGVyIGNvbHVtbnMgcHJvZ3JhbW1hdGljYWxseS4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTkzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBSb3dEYXRhKC0xLCAzMDApKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAwIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hUKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAzIik7Ci0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5DRU5URVIpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uIDQiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQkJU3RyaW5nW10gdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyI6MCIsIGkrIjoxIiwgaSsiOjIiLCBpKyI6MyIsIGkrIjo0In07Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykgewotCQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCXRleHQgPSBuZXcgU3RyaW5nW117aSsiLCIraisiOjAiLCBpKyIsIitqKyI6MSIsIGkrIiwiK2orIjoyIiwgaSsiLCIraisiOjMiLCBpKyIsIitqKyI6NCJ9OwotCQkJCXN1Ykl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IDU7IGsrKykgewotCQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQkJdGV4dCA9IG5ldyBTdHJpbmdbXXtpKyIsIitqKyIsIitrKyI6MCIsIGkrIiwiK2orIiwiK2srIjoxIiwgaSsiLCIraisiLCIraysiOjIiLCBpKyIsIitqKyIsIitrKyI6MyIsIGkrIiwiK2orIiwiK2srIjo0In07Ci0JCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3ZlICIrZS53aWRnZXQpOwotCQkJfQotCQl9OwotCQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgoMTAwKTsKLQkJCWNvbHVtbnNbaV0uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JCQljb2x1bW5zW2ldLmFkZExpc3RlbmVyKFNXVC5Nb3ZlLCBsaXN0ZW5lcik7Ci0JCX0KLQkJQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JCWIuc2V0VGV4dCgiaW52ZXJ0IGNvbHVtbiBvcmRlciIpOwotCQliLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlpbnRbXSBvcmRlciA9IHRyZWUuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aCAvIDI7IGkrKykgewotCQkJCQlpbnQgdGVtcCA9IG9yZGVyW2ldOwotCQkJCQlvcmRlcltpXSA9IG9yZGVyW29yZGVyLmxlbmd0aCAtIGkgLSAxXTsKLQkJCQkJb3JkZXJbb3JkZXIubGVuZ3RoIC0gaSAtIDFdID0gdGVtcDsKLQkJCQl9Ci0JCQkJdHJlZS5zZXRDb2x1bW5PcmRlcihvcmRlcik7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDYyNTNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBXcml0ZSBhbiBhbmltYXRlZCBHSUYgdG8gYSBmaWxlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTQgewotCURpc3BsYXkgZGlzcGxheTsKLQlDb2xvciB3aGl0ZSwgcmVkLCBncmVlbiwgYmx1ZTsKLQlQYWxldHRlRGF0YSBwYWxldHRlOwotCUZvbnQgZm9udDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IFNuaXBwZXQxOTQoKS5ydW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJUkdCIHdoaXRlUkdCID0gbmV3IFJHQigweGZmLCAweGZmLCAweGZmKTsKLQkJUkdCIHJlZFJHQiA9IG5ldyBSR0IoMHhmZiwgMCwgMCk7Ci0JCVJHQiBncmVlblJHQiA9IG5ldyBSR0IoMCwgMHhmZiwgMCk7Ci0JCVJHQiBibHVlUkdCID0gbmV3IFJHQigwLCAwLCAweGZmKTsKLQkJcGFsZXR0ZSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10gewotCQkJCXdoaXRlUkdCLAkvLyAwCi0JCQkJcmVkUkdCLAkJLy8gMQotCQkJCWdyZWVuUkdCLAkvLyAyCi0JCQkJYmx1ZVJHQiB9KTsJLy8gMwotCQl3aGl0ZSA9IG5ldyBDb2xvcihkaXNwbGF5LCB3aGl0ZVJHQik7Ci0JCXJlZCA9IG5ldyBDb2xvcihkaXNwbGF5LCByZWRSR0IpOwotCQlncmVlbiA9IG5ldyBDb2xvcihkaXNwbGF5LCBncmVlblJHQik7Ci0JCWJsdWUgPSBuZXcgQ29sb3IoZGlzcGxheSwgYmx1ZVJHQik7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ29taWMgU2FucyBNUyIsIDI0LCBTV1QuQk9MRCk7Ci0JCQotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVs0XTsKLQkJZGF0YVswXSA9IG5ld0ZyYW1lKCIiLCAgd2hpdGUsIGZhbHNlLCAwLCAwLCAxMDEsIDU1LCBTV1QuRE1fRklMTF9OT05FLCA0MCk7Ci0JCWRhdGFbMV0gPSBuZXdGcmFtZSgiUyIsIHJlZCwgICB0cnVlLCAgMCwgMCwgIDMwLCA1NSwgU1dULkRNX0ZJTExfTk9ORSwgNDApOwotCQlkYXRhWzJdID0gbmV3RnJhbWUoIlciLCBncmVlbiwgdHJ1ZSwgMjgsIDAsICAzOSwgNTUsIFNXVC5ETV9GSUxMX05PTkUsIDQwKTsKLQkJZGF0YVszXSA9IG5ld0ZyYW1lKCJUIiwgYmx1ZSwgIHRydWUsIDY5LCAwLCAgMzIsIDU1LCBTV1QuRE1fRklMTF9CQUNLR1JPVU5ELCAyMDApOwotCQkKLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gZGF0YTsKLQkJbG9hZGVyLmJhY2tncm91bmRQaXhlbCA9IDA7Ci0JCWxvYWRlci5sb2dpY2FsU2NyZWVuSGVpZ2h0ID0gZGF0YVswXS5oZWlnaHQ7Ci0JCWxvYWRlci5sb2dpY2FsU2NyZWVuV2lkdGggPSBkYXRhWzBdLndpZHRoOwotCQlsb2FkZXIucmVwZWF0Q291bnQgPSAwOyAvLyBydW4gZm9yZXZlcgotCQlsb2FkZXIuc2F2ZSgic3d0LmdpZiIsIFNXVC5JTUFHRV9HSUYpOwotCi0JCXdoaXRlLmRpc3Bvc2UoKTsKLQkJcmVkLmRpc3Bvc2UoKTsKLQkJZ3JlZW4uZGlzcG9zZSgpOwotCQlibHVlLmRpc3Bvc2UoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQotCUltYWdlRGF0YSBuZXdGcmFtZShTdHJpbmcgbGV0dGVyLCBDb2xvciBjb2xvciwgYm9vbGVhbiB0cmFuc3BhcmVudCwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkgewotCQlJbWFnZURhdGEgdGVtcCA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgMiwgcGFsZXR0ZSk7IC8vIDQtY29sb3IgcGFsZXR0ZSBoYXMgZGVwdGggMgotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCB0ZW1wKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKHdoaXRlKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWdjLnNldEZvbnQoZm9udCk7Ci0JCWdjLmRyYXdTdHJpbmcobGV0dGVyLCA1LCA1KTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlJbWFnZURhdGEgZnJhbWUgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJaWYgKHRyYW5zcGFyZW50KSBmcmFtZS50cmFuc3BhcmVudFBpeGVsID0gMDsgLy8gd2hpdGUKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmcmFtZS54ID0geDsKLQkJZnJhbWUueSA9IHk7Ci0JCWZyYW1lLmRpc3Bvc2FsTWV0aG9kID0gZGlzcG9zYWxNZXRob2Q7Ci0JCWZyYW1lLmRlbGF5VGltZSA9IGRlbGF5VGltZTsKLQkJcmV0dXJuIGZyYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmY2ZjNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNXVCBPcGVuR0wgc25pcHBldDogdXNlIExXSkdMIHRvIGRyYXcgdG8gYW4gU1dUIEdMQ2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTENhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub3BlbmdsLkdMRGF0YTsKLWltcG9ydCBvcmcubHdqZ2wub3BlbmdsLkdMMTE7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5HTENvbnRleHQ7Ci1pbXBvcnQgb3JnLmx3amdsLm9wZW5nbC5nbHUuR0xVOwotaW1wb3J0IG9yZy5sd2pnbC5MV0pHTEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQxOTUgewotCXN0YXRpYyB2b2lkIGRyYXdUb3J1cyhmbG9hdCByLCBmbG9hdCBSLCBpbnQgbnNpZGVzLCBpbnQgcmluZ3MpIHsKLQkJZmxvYXQgcmluZ0RlbHRhID0gMi4wZiAqIChmbG9hdCkgTWF0aC5QSSAvIHJpbmdzOwotCQlmbG9hdCBzaWRlRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gbnNpZGVzOwotCQlmbG9hdCB0aGV0YSA9IDAuMGYsIGNvc1RoZXRhID0gMS4wZiwgc2luVGhldGEgPSAwLjBmOwotCQlmb3IgKGludCBpID0gcmluZ3MgLSAxOyBpID49IDA7IGktLSkgewotCQkJZmxvYXQgdGhldGExID0gdGhldGEgKyByaW5nRGVsdGE7Ci0JCQlmbG9hdCBjb3NUaGV0YTEgPSAoZmxvYXQpIE1hdGguY29zKHRoZXRhMSk7Ci0JCQlmbG9hdCBzaW5UaGV0YTEgPSAoZmxvYXQpIE1hdGguc2luKHRoZXRhMSk7Ci0JCQlHTDExLmdsQmVnaW4oR0wxMS5HTF9RVUFEX1NUUklQKTsKLQkJCWZsb2F0IHBoaSA9IDAuMGY7Ci0JCQlmb3IgKGludCBqID0gbnNpZGVzOyBqID49IDA7IGotLSkgewotCQkJCXBoaSArPSBzaWRlRGVsdGE7Ci0JCQkJZmxvYXQgY29zUGhpID0gKGZsb2F0KSBNYXRoLmNvcyhwaGkpOwotCQkJCWZsb2F0IHNpblBoaSA9IChmbG9hdCkgTWF0aC5zaW4ocGhpKTsKLQkJCQlmbG9hdCBkaXN0ID0gUiArIHIgKiBjb3NQaGk7Ci0JCQkJR0wxMS5nbE5vcm1hbDNmKGNvc1RoZXRhMSAqIGNvc1BoaSwgLXNpblRoZXRhMSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlHTDExLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCUdMMTEuZ2xOb3JtYWwzZihjb3NUaGV0YSAqIGNvc1BoaSwgLXNpblRoZXRhICogY29zUGhpLCBzaW5QaGkpOwotCQkJCUdMMTEuZ2xWZXJ0ZXgzZihjb3NUaGV0YSAqIGRpc3QsIC1zaW5UaGV0YSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJfQotCQkJR0wxMS5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQl0cnkgewotCQkJR0xDb250ZXh0LnVzZUNvbnRleHQoY2FudmFzKTsKLQkJfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQotCQljYW52YXMuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY2FudmFzLmdldEJvdW5kcygpOwotCQkJCWZsb2F0IGZBc3BlY3QgPSAoZmxvYXQpIGJvdW5kcy53aWR0aCAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQkJCXRyeSB7Ci0JCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkJfSBjYXRjaChMV0pHTEV4Y2VwdGlvbiBlKSB7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0KLQkJCQlHTDExLmdsVmlld3BvcnQoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCQlHTDExLmdsTWF0cml4TW9kZShHTDExLkdMX1BST0pFQ1RJT04pOwotCQkJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQlHTFUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0JCQkJR0wxMS5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOwotCQkJCUdMMTEuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR0wxMS5nbENsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7Ci0JCUdMMTEuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlHTDExLmdsSGludChHTDExLkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCwgR0wxMS5HTF9OSUNFU1QpOwotCQlHTDExLmdsQ2xlYXJEZXB0aCgxLjApOwotCQlHTDExLmdsTGluZVdpZHRoKDIpOwotCQlHTDExLmdsRW5hYmxlKEdMMTEuR0xfREVQVEhfVEVTVCk7Ci0KLQkJc2hlbGwuc2V0VGV4dCgiU1dUL0xXSkdMIEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0U2l6ZSg2NDAsIDQ4MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlpbnQgcm90ID0gMDsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJY2FudmFzLnNldEN1cnJlbnQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUdMQ29udGV4dC51c2VDb250ZXh0KGNhbnZhcyk7Ci0JCQkJCX0gY2F0Y2goTFdKR0xFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0JCQkJCUdMMTEuZ2xDbGVhcihHTDExLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDExLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCQkJCQlHTDExLmdsQ2xlYXJDb2xvciguM2YsIC41ZiwgLjhmLCAxLjBmKTsKLQkJCQkJR0wxMS5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlHTDExLmdsVHJhbnNsYXRlZigwLjBmLCAwLjBmLCAtMTAuMGYpOwotCQkJCQlmbG9hdCBmcm90ID0gcm90OwotCQkJCQlHTDExLmdsUm90YXRlZigwLjE1ZiAqIHJvdCwgMi4wZiAqIGZyb3QsIDEwLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCUdMMTEuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlHTDExLmdsUG9seWdvbk1vZGUoR0wxMS5HTF9GUk9OVF9BTkRfQkFDSywgR0wxMS5HTF9MSU5FKTsKLQkJCQkJR0wxMS5nbENvbG9yM2YoMC45ZiwgMC45ZiwgMC45Zik7Ci0JCQkJCWRyYXdUb3J1cygxLCAxLjlmICsgKChmbG9hdCkgTWF0aC5zaW4oKDAuMDA0ZiAqIGZyb3QpKSksIDE1LCAxNSk7Ci0JCQkJCWNhbnZhcy5zd2FwQnVmZmVycygpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwODFkNC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiB1c2UgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdmVyaWZ5IGlucHV0Ci0gKiBJbiB0aGlzIGNhc2UgYSBwaG9uZSBudW1iZXIgaXMgdXNlZC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IGphdmEudXRpbC5yZWdleC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk2IHsKLQkvKgotCSAqIFBob25lIG51bWJlcnMgZm9sbG93IHRoZSBydWxlIFsoXVsxLTldWzEtOV1bMS05XVspXVsxLTldWzEtOV1bMS05XVstXVsxLTldWzEtOV1bMS05XVsxLTldCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYID0gIlsoXVxcZHszfVspXVxcZHszfVstXVxcZHs0fSI7ICAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlbXBsYXRlID0gIigjIyMpIyMjLSMjIyMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRUZXh0ID0gIigwMDApMDAwLTAwMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5CT1JERVIpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJDb3VyaWVyIE5ldyIsIDEwLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JdGV4dC5zZXRUZXh0KHRlbXBsYXRlKTsJCi0JdGV4dC5hZGRMaXN0ZW5lcihTV1QuVmVyaWZ5LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCS8vY3JlYXRlIHRoZSBwYXR0ZXJuIGZvciB2ZXJpZmljYXRpb24KLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKFJFR0VYKTsJCi0JCS8vaWdub3JlIGV2ZW50IHdoZW4gY2F1c2VkIGJ5IGluc2VydGluZyB0ZXh0IGluc2lkZSBldmVudCBoYW5kbGVyCi0JCWJvb2xlYW4gaWdub3JlOwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoaWdub3JlKSByZXR1cm47Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWlmIChlLnN0YXJ0ID4gMTMgfHwgZS5lbmQgPiAxNCkgcmV0dXJuOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZS50ZXh0KTsKLQkJCQotCQkJLy9oYW5kbGUgYmFja3NwYWNlCi0JCQlpZiAoZS5jaGFyYWN0ZXIgPT0gJ1xiJykgewotCQkJCWZvciAoaW50IGkgPSBlLnN0YXJ0OyBpIDwgZS5lbmQ7IGkrKykgewotCQkJCQkvLyBza2lwIG92ZXIgc2VwYXJhdG9ycwotCQkJCQlzd2l0Y2ggKGkpIHsKLQkJCQkJCWNhc2UgMDogCi0JCQkJCQkJaWYgKGUuc3RhcnQgKyAxID09IGUuZW5kKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG5ldyBjaGFyIFtdIHsnIycsJyknfSk7Ci0JCQkJCQkJCWUuc3RhcnQtLTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA4OgotCQkJCQkJCWlmIChlLnN0YXJ0ICsgMSA9PSBlLmVuZCkgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKG5ldyBjaGFyIFtdIHsnIycsJy0nfSk7Ci0JCQkJCQkJCWUuc3RhcnQtLTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlidWZmZXIuYXBwZW5kKCctJyk7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDogYnVmZmVyLmFwcGVuZCgnIycpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQgKyBidWZmZXIubGVuZ3RoKCkpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCWlnbm9yZSA9IGZhbHNlOwotCQkJCS8vIG1vdmUgY3Vyc29yIGJhY2t3YXJkcyBvdmVyIHNlcGFyYXRvcnMKLQkJCQlpZiAoZS5zdGFydCA9PSA1IHx8IGUuc3RhcnQgPT0gOSkgZS5zdGFydC0tOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKGUuc3RhcnQsIGUuc3RhcnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGRlZmF1bHRUZXh0KTsKLQkJCWNoYXJbXSBjaGFycyA9IGUudGV4dC50b0NoYXJBcnJheSgpOwotCQkJaW50IGluZGV4ID0gZS5zdGFydCAtIDE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGUudGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCWlmIChjaGFyc1tpXSA9PSAnKCcpIGNvbnRpbnVlOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlpZiAoY2hhcnNbaV0gPT0gJyknKSBjb250aW51ZTsKLQkJCQkJCWluZGV4Kys7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA4OgotCQkJCQkJaWYgKGNoYXJzW2ldID09ICctJykgY29udGludWU7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChpbmRleCA+PSBuZXdUZXh0Lmxlbmd0aCgpKSByZXR1cm47Ci0JCQkJbmV3VGV4dC5zZXRDaGFyQXQoaW5kZXgsIGNoYXJzW2ldKTsKLQkJCX0KLQkJCS8vIGlmIHRleHQgaXMgc2VsZWN0ZWQsIGRvIG5vdCBwYXN0ZSBiZXlvbmQgcmFuZ2Ugb2Ygc2VsZWN0aW9uCi0JCQlpZiAoZS5zdGFydCA8IGUuZW5kICYmIGluZGV4ICsgMSAhPSBlLmVuZCkgcmV0dXJuOwotCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ld1RleHQpOwotCQkJaWYgKG1hdGNoZXIubG9va2luZ0F0KCkpIHsKLQkJCQl0ZXh0LnNldFNlbGVjdGlvbihlLnN0YXJ0LCBpbmRleCArIDEpOwotCQkJCWlnbm9yZSA9IHRydWU7Ci0JCQkJdGV4dC5pbnNlcnQobmV3VGV4dC5zdWJzdHJpbmcoZS5zdGFydCwgaW5kZXggKyAxKSk7Ci0JCQkJaWdub3JlID0gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQl9KTsKLQkJCi0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTYwOWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmF3IHdyYXBwZWQgdGV4dCB1c2luZyBUZXh0TGF5b3V0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk3IHsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIGxvbmdTdHJpbmcgPSAiVGhlIHByZWZlcnJlZCBzaXplIG9mIGEgd2lkZ2V0IGlzIHRoZSBtaW5pbXVtIHNpemUgbmVlZGVkIHRvIHNob3cgaXRzIGNvbnRlbnQuIEluIHRoZSBjYXNlIG9mIGEgQ29tcG9zaXRlLCB0aGUgcHJlZmVycmVkIHNpemUgaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiBpdHMgY2hpbGRyZW4uIElmIGNoaWxkcmVuIGhhdmUgYmVlbiBwb3NpdGlvbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgdGhlIENvbXBvc2l0ZSBjb21wdXRlcyBpdHMgb3duIHByZWZlcnJlZCBzaXplIGJhc2VkIG9uIHRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgY2hpbGRyZW4uIElmIGEgQ29tcG9zaXRlIGlzIHVzaW5nIGEgbGF5b3V0IGNsYXNzIHRvIHBvc2l0aW9uIGl0cyBjaGlsZHJlbiwgaXQgYXNrcyB0aGUgTGF5b3V0IHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgaXRzIGNsaWVudEFyZWEsIGFuZCB0aGVuIGl0IGFkZHMgaW4gdGhlIHRyaW0gdG8gZGV0ZXJtaW5lIGl0cyBwcmVmZXJyZWQgc2l6ZS4iOwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQuc2V0VGV4dChsb25nU3RyaW5nKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCWNhc2UgU1dULlBhaW50OgotCQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCAxMCwgMTApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuUmVzaXplOgotCQkJCWxheW91dC5zZXRXaWR0aChzaGVsbC5nZXRTaXplKCkueCAtIDIwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlJlc2l6ZSwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDE5OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYyMWZkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBwYXRoIGZyb20gc29tZSB0ZXh0Ci0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk4IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUZvbnREYXRhIGRhdGEgPSBkaXNwbGF5LmdldFN5c3RlbUZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCA5NiwgU1dULkJPTEQgfCBTV1QuSVRBTElDKTsKLQlmaW5hbCBDb2xvciBncmVlbiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQlmaW5hbCBDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JZmluYWwgUGF0aCBwYXRoOwotCXRyeSB7Ci0JCXBhdGggPSBuZXcgUGF0aChkaXNwbGF5KTsKLQkJcGF0aC5hZGRTdHJpbmcoIlNXVCIsIDAsIDAsIGZvbnQpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCS8vQWR2YW5jZWQgR3JhcGhpY3Mgbm90IHN1cHBvcnRlZC4gIAotCQkvL1RoaXMgbmV3IEFQSSByZXF1aXJlcyB0aGUgQ2Fpcm8gVmVjdG9yIGVuZ2luZSBvbiBHVEsgYW5kIE1vdGlmIGFuZCBHREkrIG9uIFdpbmRvd3MuCi0JCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybjsKLQl9Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsJCQkKLQkJCUdDIGdjID0gZS5nYzsKLQkJCWdjLnNldEJhY2tncm91bmQoZ3JlZW4pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZChibHVlKTsKLQkJCWdjLmZpbGxQYXRoKHBhdGgpOwotCQkJZ2MuZHJhd1BhdGgocGF0aCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlwYXRoLmRpc3Bvc2UoKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQxOTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2ZjgzMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MTk5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGlzdGVuIGZvciBldmVudHMgaW4gRXhjZWwgKHdpbjMyIG9ubHkpCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MTk5IHsKLQlzdGF0aWMgU3RyaW5nIElJRF9BcHBFdmVudHMgPSAiezAwMDI0NDEzLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0Nn0iOwotCS8vIEV2ZW50IElECi0Jc3RhdGljIGludCBOZXdXb3JrYm9vayAgICAgICAgICAgID0gMHgwMDAwMDYxZDsKLQlzdGF0aWMgaW50IFNoZWV0U2VsZWN0aW9uQ2hhbmdlICAgPSAweDAwMDAwNjE2OwotCXN0YXRpYyBpbnQgU2hlZXRCZWZvcmVEb3VibGVDbGljayA9IDB4MDAwMDA2MTc7Ci0Jc3RhdGljIGludCBTaGVldEJlZm9yZVJpZ2h0Q2xpY2sgID0gMHgwMDAwMDYxODsKLQlzdGF0aWMgaW50IFNoZWV0QWN0aXZhdGUgICAgICAgICAgPSAweDAwMDAwNjE5OwotCXN0YXRpYyBpbnQgU2hlZXREZWFjdGl2YXRlICAgICAgICA9IDB4MDAwMDA2MWE7Ci0Jc3RhdGljIGludCBTaGVldENhbGN1bGF0ZSAgICAgICAgID0gMHgwMDAwMDYxYjsKLQlzdGF0aWMgaW50IFNoZWV0Q2hhbmdlICAgICAgICAgICAgPSAweDAwMDAwNjFjOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tPcGVuICAgICAgICAgICA9IDB4MDAwMDA2MWY7Ci0Jc3RhdGljIGludCBXb3JrYm9va0FjdGl2YXRlICAgICAgID0gMHgwMDAwMDYyMDsKLQlzdGF0aWMgaW50IFdvcmtib29rRGVhY3RpdmF0ZSAgICAgPSAweDAwMDAwNjIxOwotCXN0YXRpYyBpbnQgV29ya2Jvb2tCZWZvcmVDbG9zZSAgICA9IDB4MDAwMDA2MjI7Ci0Jc3RhdGljIGludCBXb3JrYm9va0JlZm9yZVNhdmUgICAgID0gMHgwMDAwMDYyMzsKLQlzdGF0aWMgaW50IFdvcmtib29rQmVmb3JlUHJpbnQgICAgPSAweDAwMDAwNjI0OwotCXN0YXRpYyBpbnQgV29ya2Jvb2tOZXdTaGVldCAgICAgICA9IDB4MDAwMDA2MjU7Ci0Jc3RhdGljIGludCBXb3JrYm9va0FkZGluSW5zdGFsbCAgID0gMHgwMDAwMDYyNjsKLQlzdGF0aWMgaW50IFdvcmtib29rQWRkaW5Vbmluc3RhbGwgPSAweDAwMDAwNjI3OwotCXN0YXRpYyBpbnQgV2luZG93UmVzaXplICAgICAgICAgICA9IDB4MDAwMDA2MTI7Ci0Jc3RhdGljIGludCBXaW5kb3dBY3RpdmF0ZSAgICAgICAgID0gMHgwMDAwMDYxNDsKLQlzdGF0aWMgaW50IFdpbmRvd0RlYWN0aXZhdGUgICAgICAgPSAweDAwMDAwNjE1OwotCXN0YXRpYyBpbnQgU2hlZXRGb2xsb3dIeXBlcmxpbmsgICA9IDB4MDAwMDA3M2U7Ci0KLSBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCU9sZUNvbnRyb2xTaXRlIGNvbnRyb2xTaXRlOwotCXRyeSB7Ci0JCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbnRyb2xTaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIkV4Y2VsLlNoZWV0Iik7Ci0JCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIG9wZW4gYWN0aXZlWCBjb250cm9sIik7Ci0JCXJldHVybjsKLQl9Ci0Jc2hlbGwub3BlbigpOwotCi0JT2xlQXV0b21hdGlvbiBleGNlbFNoZWV0ID0gbmV3IE9sZUF1dG9tYXRpb24oY29udHJvbFNpdGUpOwotCWludFtdIGRpc3BJRHMgPSBleGNlbFNoZWV0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsiQXBwbGljYXRpb24ifSk7Ci0JVmFyaWFudCBwVmFyUmVzdWx0ID0gZXhjZWxTaGVldC5nZXRQcm9wZXJ0eShkaXNwSURzWzBdKTsKLQlPbGVBdXRvbWF0aW9uIGFwcGxpY2F0aW9uID0gcFZhclJlc3VsdC5nZXRBdXRvbWF0aW9uKCk7Ci0JcFZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JZXhjZWxTaGVldC5kaXNwb3NlKCk7Ci0JCi0JaW50IGV2ZW50SUQgPSBTaGVldFNlbGVjdGlvbkNoYW5nZTsKLQlPbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKE9sZUV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0aW9uIGhhcyBjaGFuZ2VkIik7Ci0JCQkvLyB0d28gYXJndW1lbnRzIHdoaWNoIG11c3QgYmUgcmVsZWFzZWQgKHJvdyBhbmQgY29sdW1uKQotCQkJVmFyaWFudFtdIGFyZ3MgPSBlLmFyZ3VtZW50czsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihhcmdzW2ldKTsKLQkJCQlhcmdzIFtpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCWNvbnRyb2xTaXRlLmFkZEV2ZW50TGlzdGVuZXIoYXBwbGljYXRpb24sIElJRF9BcHBFdmVudHMsIGV2ZW50SUQsIGxpc3RlbmVyKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JYXBwbGljYXRpb24uZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlNWJkNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogc29ydCBhIHRhYmxlIGJ5IGNvbHVtbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLSAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0gICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIGZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLSAgICBjb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0gICAgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgIGNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLSAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICBpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiYSIsICIzIn0pOwotICAgIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7ImIiLCAiMiJ9KTsKLSAgICBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgIGl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJjIiwgIjEifSk7Ci0gICAgY29sdW1uMS5zZXRXaWR0aCgxMDApOwotICAgIGNvbHVtbjIuc2V0V2lkdGgoMTAwKTsKLSAgICBMaXN0ZW5lciBzb3J0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSAoVGFibGVDb2x1bW4pZS53aWRnZXQ7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBjb2x1bW4gPT0gY29sdW1uMSA/IDAgOiAxOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZTEgPSBpdGVtc1tpXS5nZXRUZXh0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKyl7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZTIgPSBpdGVtc1tqXS5nZXRUZXh0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxhdG9yLmNvbXBhcmUodmFsdWUxLCB2YWx1ZTIpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0ge2l0ZW1zW2ldLmdldFRleHQoMCksIGl0ZW1zW2ldLmdldFRleHQoMSl9OwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRleHQodmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4pOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBjb2x1bW4xLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHNvcnRMaXN0ZW5lcik7Ci0gICAgY29sdW1uMi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzb3J0TGlzdGVuZXIpOwotICAgIHRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uMSk7Ci0gICAgdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOwotICAgIHNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54LCAzMDApOwotICAgIHNoZWxsLm9wZW4oKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmYwYmQ5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjb29sIGJhcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNvb2xCYXIgYmFyID0gbmV3IENvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlmb3IgKGludCBpPTA7IGk8MjsgaSsrKSB7Ci0JCUNvb2xJdGVtIGl0ZW0gPSBuZXcgQ29vbEl0ZW0gKGJhciwgU1dULk5PTkUpOwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoYmFyLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uICIgKyBpKTsKLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaXRlbS5zZXRQcmVmZXJyZWRTaXplIChpdGVtLmNvbXB1dGVTaXplIChzaXplLngsIHNpemUueSkpOwotCQlpdGVtLnNldENvbnRyb2wgKGJ1dHRvbik7Ci0JfQotCWJhci5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDQzZGEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEZpbGwgYSBzaGFwZSB3aXRoIGEgcHJlZGVmaW5lZCBwYXR0ZXJuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkvL2RlZmluZSBhIHBhdHRlcm4gb24gYW4gaW1hZ2UKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMDAwLCAxMDAwKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JQ29sb3IgeWVsbG93ID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfWUVMTE9XKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCh5ZWxsb3cpOwotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCAwLCAxMDAwLCAxMDAwLCB0cnVlKTsKLQlmb3IgKGludCBpPS01MDA7IGk8MTAwMDsgaSs9MTApIHsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChibHVlKTsKLQkJZ2MuZHJhd0xpbmUoaSwgMCwgNTAwICsgaSwgMTAwMCk7Ci0JCWdjLmRyYXdMaW5lKDUwMCArIGksIDAsIGksIDEwMDApOwotCX0JCi0JZ2MuZGlzcG9zZSgpOwotCWZpbmFsIFBhdHRlcm4gcGF0dGVybjsKLQl0cnkgewotCQlwYXR0ZXJuID0gbmV3IFBhdHRlcm4oZGlzcGxheSwgaW1hZ2UpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCS8vQWR2YW5jZWQgR3JhcGhpY3Mgbm90IHN1cHBvcnRlZC4gIAotCQkvL1RoaXMgbmV3IEFQSSByZXF1aXJlcyB0aGUgQ2Fpcm8gVmVjdG9yIGVuZ2luZSBvbiBHVEsgYW5kIE1vdGlmIGFuZCBHREkrIG9uIFdpbmRvd3MuCi0JCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0JYy5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVJlY3RhbmdsZSByID0gKChDb21wb3NpdGUpZXZlbnQud2lkZ2V0KS5nZXRDbGllbnRBcmVhKCk7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJZ2Muc2V0QmFja2dyb3VuZFBhdHRlcm4ocGF0dGVybik7Ci0JCQlnYy5maWxsT3ZhbCg1LCA1LCByLndpZHRoIC0gMTAsIHIuaGVpZ2h0IC0gMTApOwkKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UoKTsKLQlwYXR0ZXJuLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMWNiNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVmlydHVhbCBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIHdpdGggMSwwMDAsMDAwIGl0ZW1zIChsYXp5LCBwYWdlIHNpemUgNjQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMAotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwMSB7Ci0KLXN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFID0gNjQ7Ci1zdGF0aWMgZmluYWwgaW50IENPVU5UID0gMTAwMDAwOwotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2V0RGF0YSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mIChpdGVtKTsKLQkJCWludCBzdGFydCA9IGluZGV4IC8gUEFHRV9TSVpFICogUEFHRV9TSVpFOwotCQkJaW50IGVuZCA9IE1hdGgubWluIChzdGFydCArIFBBR0VfU0laRSwgdGFibGUuZ2V0SXRlbUNvdW50ICgpKTsKLQkJCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQkJaXRlbSA9IHRhYmxlLmdldEl0ZW0gKGkpOwotCQkJCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdGFibGUuc2V0TGF5b3V0RGF0YSAobmV3IFJvd0RhdGEgKDIwMCwgMjAwKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJBZGQgSXRlbXMiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULk5PTkUpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJdGFibGUuc2V0SXRlbUNvdW50IChDT1VOVCk7Ci0JCQlsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzICgpOwotCQkJbGFiZWwuc2V0VGV4dCAoIkl0ZW1zOiAiICsgQ09VTlQgKyAiLCBUaW1lOiAiICsgKHQyIC0gdDEpICsgIiAobXMpIFtwYWdlPSIgKyBQQUdFX1NJWkUgKyAiXSIpOwotCQkJc2hlbGwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI5MDQ3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBWaXJ0dWFsIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBwb3B1bGF0ZSB0cmVlIGxhemlseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuVklSVFVBTCB8IFNXVC5CT1JERVIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlNldERhdGEsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCWlmIChwYXJlbnRJdGVtID09IG51bGwpIHsKLQkJCQl0ZXh0ID0gIm5vZGUgIit0cmVlLmluZGV4T2YoaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRleHQgPSBwYXJlbnRJdGVtLmdldFRleHQoKSsiIC0gIitwYXJlbnRJdGVtLmluZGV4T2YoaXRlbSk7Ci0JCQl9Ci0JCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQlpdGVtLnNldEl0ZW1Db3VudCgxMCk7Ci0JCX0KLQl9KTsKLQl0cmVlLnNldEl0ZW1Db3VudCgyMCk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI2ZGU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgVGV4dExheW91dCBqdXN0aWZ5LCBhbGlnbm1lbnQgYW5kIGluZGVudCAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDMgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsJCi0Jc2hlbGwuc2V0VGV4dCgiSW5kZW50LCBKdXN0aWZ5LCBBbGlnbiIpOwotCVN0cmluZ1tdIHRleHRzID0gewotCQkiUGxhbnMgZG8gbm90IG1hdGVyaWFsaXplIG91dCBvZiBub3doZXJlLCBub3IgYXJlIHRoZXkgZW50aXJlbHkgc3RhdGljLiBUbyBlbnN1cmUgdGhlIHBsYW5uaW5nIHByb2Nlc3MgaXMgdHJhbnNwYXJlbnQgYW5kIG9wZW4gdG8gdGhlIGVudGlyZSBFY2xpcHNlIGNvbW11bml0eSwgd2UgKHRoZSBFY2xpcHNlIFBNQykgcG9zdCBwbGFucyBpbiBhbiBlbWJyeW9uaWMgZm9ybSBhbmQgcmV2aXNlIHRoZW0gdGhyb3VnaG91dCB0aGUgcmVsZWFzZSBjeWNsZS4iLAotCQkiVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBsYW4gZGVhbHMgd2l0aCB0aGUgaW1wb3J0YW50IG1hdHRlcnMgb2YgcmVsZWFzZSBkZWxpdmVyYWJsZXMsIHJlbGVhc2UgbWlsZXN0b25lcywgdGFyZ2V0IG9wZXJhdGluZyBlbnZpcm9ubWVudHMsIGFuZCByZWxlYXNlLXRvLXJlbGVhc2UgY29tcGF0aWJpbGl0eS4gVGhlc2UgYXJlIGFsbCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGNsZWFyIGZvciBhbnkgcmVsZWFzZSwgZXZlbiBpZiBubyBmZWF0dXJlcyB3ZXJlIHRvIGNoYW5nZS4iLAotCQkiVGhlIHJlbWFpbmRlciBvZiB0aGUgcGxhbiBjb25zaXN0cyBvZiBwbGFuIGl0ZW1zIGZvciB0aGUgdmFyaW91cyBFY2xpcHNlIHN1YnByb2plY3RzLiBFYWNoIHBsYW4gaXRlbSBjb3ZlcnMgYSBmZWF0dXJlIG9yIEFQSSB0aGF0IGlzIHRvIGJlIGFkZGVkIHRvIEVjbGlwc2UsIG9yIHNvbWUgYXNwZWN0IG9mIEVjbGlwc2UgdGhhdCBpcyB0byBiZSBpbXByb3ZlZC4gRWFjaCBwbGFuIGl0ZW0gaGFzIGl0cyBvd24gZW50cnkgaW4gdGhlIEVjbGlwc2UgYnVnemlsbGEgZGF0YWJhc2UsIHdpdGggYSB0aXRsZSBhbmQgYSBjb25jaXNlIHN1bW1hcnkgKHVzdWFsbHkgYSBzaW5nbGUgcGFyYWdyYXBoKSB0aGF0IGV4cGxhaW5zIHRoZSB3b3JrIGl0ZW0gYXQgYSBzdWl0YWJseSBoaWdoIGVub3VnaCBsZXZlbCBzbyB0aGF0IGV2ZXJ5b25lIGNhbiByZWFkaWx5IHVuZGVyc3RhbmQgd2hhdCB0aGUgd29yayBpdGVtIGlzIHdpdGhvdXQgaGF2aW5nIHRvIHVuZGVyc3RhbmQgdGhlIG5pdHR5LWdyaXR0eSBkZXRhaWwuIiwKLQl9OwotCWludFtdIGFsaWdubWVudHMgPSB7U1dULkxFRlQsIFNXVC5DRU5URVIsIFNXVC5SSUdIVH07Ci0JZmluYWwgVGV4dExheW91dFtdIGxheW91dHMgPSBuZXcgVGV4dExheW91dFt0ZXh0cy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0cy5sZW5ndGg7IGkrKykgewotCQlUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQlsYXlvdXQuc2V0VGV4dCh0ZXh0c1tpXSk7Ci0JCWxheW91dC5zZXRJbmRlbnQoMzApOwotCQlsYXlvdXQuc2V0SnVzdGlmeSh0cnVlKTsKLQkJbGF5b3V0LnNldEFsaWdubWVudChhbGlnbm1lbnRzW2ldKTsJCQotCQlsYXlvdXRzW2ldID0gbGF5b3V0OwotCX0KLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JCQlpbnQgd2lkdGggPSBzaGVsbC5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAyICogcG9pbnQueDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0cy5sZW5ndGg7IGkrKykgewotCQkJCVRleHRMYXlvdXQgbGF5b3V0ID0gbGF5b3V0c1tpXTsKLQkJCQlsYXlvdXQuc2V0V2lkdGgod2lkdGgpOwotCQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBwb2ludC54LCBwb2ludC55KTsKLQkJCQlwb2ludC55ICs9IGxheW91dC5nZXRCb3VuZHMoKS5oZWlnaHQgKyAxMDsKLQkJCX0JCQkKLQkJfQotCX0pOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXRzLmxlbmd0aDsgaSsrKSB7Ci0JCWxheW91dHNbaV0uZGlzcG9zZSgpOwkJCi0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI2MDhkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dExheW91dCBleGFtcGxlIHNuaXBwZXQ6IHVzaW5nIHRoZSByaXNlIGZpZWxkIG9mIGEgVGV4dFN0eWxlLgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIwNCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5ET1VCTEVfQlVGRkVSRUQpOwotCXNoZWxsLnNldFRleHQoIk1vZGlmeSBSaXNlIik7Ci0JRm9udERhdGEgZGF0YSA9IGRpc3BsYXkuZ2V0U3lzdGVtRm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDI0LCBTV1QuTk9STUFMKTsKLQlGb250IHNtYWxsRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGRhdGEuZ2V0TmFtZSgpLCA4LCBTV1QuTk9STUFMKTsKLQlHQyBnYyA9IG5ldyBHQyhzaGVsbCk7Ci0JZ2Muc2V0Rm9udChzbWFsbEZvbnQpOwotCUZvbnRNZXRyaWNzIHNtYWxsTWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZmluYWwgaW50IHNtYWxsQmFzZWxpbmUgPSBzbWFsbE1ldHJpY3MuZ2V0QXNjZW50KCkgKyBzbWFsbE1ldHJpY3MuZ2V0TGVhZGluZygpOwotCWdjLnNldEZvbnQoZm9udCk7Ci0JRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZmluYWwgaW50IGJhc2VsaW5lID0gbWV0cmljcy5nZXRBc2NlbnQoKSArIG1ldHJpY3MuZ2V0TGVhZGluZygpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dDAgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQwLnNldFRleHQoIlN1YnNjcmlwdFNjcmlwdFN1cGVyc2NyaXB0Iik7Ci0JbGF5b3V0MC5zZXRGb250KGZvbnQpOwotCVRleHRTdHlsZSBzdWJzY3JpcHQwID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCVRleHRTdHlsZSBzdXBlcnNjcmlwdDAgPSBuZXcgVGV4dFN0eWxlKHNtYWxsRm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3VwZXJzY3JpcHQwLnJpc2UgPSBiYXNlbGluZSAtIHNtYWxsQmFzZWxpbmU7Ci0JbGF5b3V0MC5zZXRTdHlsZShzdWJzY3JpcHQwLCAwLCA4KTsKLQlsYXlvdXQwLnNldFN0eWxlKHN1cGVyc2NyaXB0MCwgMTUsIDI1KTsKLQkJCi0JZmluYWwgVGV4dExheW91dCBsYXlvdXQxID0gbmV3IFRleHRMYXlvdXQoZGlzcGxheSk7Ci0JbGF5b3V0MS5zZXRUZXh0KCJTdWJzY3JpcHRTY3JpcHRTdXBlcnNjcmlwdCIpOwotCWxheW91dDEuc2V0Rm9udChmb250KTsKLQlUZXh0U3R5bGUgc3Vic2NyaXB0MSA9IG5ldyBUZXh0U3R5bGUoc21hbGxGb250LCBudWxsLCBudWxsKTsKLQlzdWJzY3JpcHQxLnJpc2UgPSAtc21hbGxCYXNlbGluZTsKLQlUZXh0U3R5bGUgc3VwZXJzY3JpcHQxID0gbmV3IFRleHRTdHlsZShzbWFsbEZvbnQsIG51bGwsIG51bGwpOwotCXN1cGVyc2NyaXB0MS5yaXNlID0gYmFzZWxpbmU7Ci0JbGF5b3V0MS5zZXRTdHlsZShzdWJzY3JpcHQxLCAwLCA4KTsKLQlsYXlvdXQxLnNldFN0eWxlKHN1cGVyc2NyaXB0MSwgMTUsIDI1KTsKLQkKLQlzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCURpc3BsYXkgZGlzcGxheSA9IGV2ZW50LmRpc3BsYXk7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCi0JCQlSZWN0YW5nbGUgcmVjdDAgPSBsYXlvdXQwLmdldEJvdW5kcygpOwotCQkJcmVjdDAueCArPSAxMDsKLQkJCXJlY3QwLnkgKz0gMTA7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QwKTsKLQkJCWxheW91dDAuZHJhdyhnYywgcmVjdDAueCwgcmVjdDAueSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLngsIHJlY3QwLnksIHJlY3QwLnggKyByZWN0MC53aWR0aCwgcmVjdDAueSk7Ci0JCQlnYy5kcmF3TGluZShyZWN0MC54LCByZWN0MC55ICsgYmFzZWxpbmUsIHJlY3QwLnggKyByZWN0MC53aWR0aCwgcmVjdDAueSArIGJhc2VsaW5lKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QwLnggKyByZWN0MC53aWR0aCAvIDIsIHJlY3QwLnksIHJlY3QwLnggKyByZWN0MC53aWR0aCAvIDIsIHJlY3QwLnkgKyByZWN0MC5oZWlnaHQpOwotCQkJCi0JCQlSZWN0YW5nbGUgcmVjdDEgPSBsYXlvdXQxLmdldEJvdW5kcygpOwotCQkJcmVjdDEueCArPSAxMDsKLQkJCXJlY3QxLnkgKz0gMjAgKyByZWN0MC5oZWlnaHQ7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QxKTsJCQkKLQkJCWxheW91dDEuZHJhdyhnYywgcmVjdDEueCwgcmVjdDEueSk7Ci0JCQkKLQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTUFHRU5UQSkpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCwgcmVjdDEueSArIHNtYWxsQmFzZWxpbmUsIHJlY3QxLnggKyByZWN0MS53aWR0aCwgcmVjdDEueSArIHNtYWxsQmFzZWxpbmUpOwotCQkJZ2MuZHJhd0xpbmUocmVjdDEueCwgcmVjdDEueSArIGJhc2VsaW5lICsgc21hbGxCYXNlbGluZSwgcmVjdDEueCArIHJlY3QxLndpZHRoLCByZWN0MS55ICsgYmFzZWxpbmUgKyBzbWFsbEJhc2VsaW5lKTsKLQkJCWdjLmRyYXdMaW5lKHJlY3QxLnggKyByZWN0MS53aWR0aCAvIDIsIHJlY3QxLnksIHJlY3QxLnggKyByZWN0MS53aWR0aCAvIDIsIHJlY3QxLnkgKyByZWN0MS5oZWlnaHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlsYXlvdXQwLmRpc3Bvc2UoKTsKLQlsYXlvdXQxLmRpc3Bvc2UoKTsKLQlzbWFsbEZvbnQuZGlzcG9zZSgpOwotCWZvbnQuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhmMTM1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUZXh0TGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNpbmcgdGhlIEdseXBoTWV0cmljcyB0byBlbWJlZGRlZCBpbWFnZXMgaW4gCi0gKiBhIFRleHRMYXlvdXQuIAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA1IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5TSEVMTF9UUklNIHwgU1dULkRPVUJMRV9CVUZGRVJFRCk7Ci0Jc2hlbGwuc2V0VGV4dCgiRW1iZWRkaW5nIG9iamVjdHMgaW4gdGV4dCIpOwotCWZpbmFsIEltYWdlW10gaW1hZ2VzID0ge25ldyBJbWFnZShkaXNwbGF5LCAzMiwgMzIpLCBuZXcgSW1hZ2UoZGlzcGxheSwgMjAsIDQwKSwgbmV3IEltYWdlKGRpc3BsYXksIDQwLCAyMCl9OwotCWludFtdIGNvbG9ycyAgPSB7U1dULkNPTE9SX0JMVUUsIFNXVC5DT0xPUl9NQUdFTlRBLCBTV1QuQ09MT1JfR1JFRU59OwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlc1tpXSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihjb2xvcnNbaV0pKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZShpbWFnZXNbaV0uZ2V0Qm91bmRzKCkpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCQotCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkJ1dHRvbiIpOwotCWJ1dHRvbi5wYWNrKCk7Ci0JU3RyaW5nIHRleHQgPSAiSGVyZSBpcyBzb21lIHRleHQgd2l0aCBhIGJsdWUgaW1hZ2UgXHVGRkZDLCBhIG1hZ2VudGEgaW1hZ2UgXHVGRkZDLCBhIGdyZWVuIGltYWdlIFx1RkZGQywgYW5kIGEgYnV0dG9uOiBcdUZGRkMuIjsKLQlmaW5hbCBpbnRbXSBpbWFnZU9mZnNldHMgPSB7MzYsIDU1LCA3Mn07Ci0JZmluYWwgVGV4dExheW91dCBsYXlvdXQgPSBuZXcgVGV4dExheW91dChkaXNwbGF5KTsKLQlsYXlvdXQuc2V0VGV4dCh0ZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2VzW2ldLmdldEJvdW5kcygpOwotCQlUZXh0U3R5bGUgaW1hZ2VTdHlsZSA9IG5ldyBUZXh0U3R5bGUobnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWltYWdlU3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoYm91bmRzLmhlaWdodCwgMCwgYm91bmRzLndpZHRoKTsgCi0JCWxheW91dC5zZXRTdHlsZShpbWFnZVN0eWxlLCBpbWFnZU9mZnNldHNbaV0sIGltYWdlT2Zmc2V0c1tpXSk7Ci0JfQotCVJlY3RhbmdsZSBib3VuZHMgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JVGV4dFN0eWxlIGJ1dHRvblN0eWxlID0gbmV3IFRleHRTdHlsZShudWxsLCBudWxsLCBudWxsKTsKLQlidXR0b25TdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhib3VuZHMuaGVpZ2h0LCAwLCBib3VuZHMud2lkdGgpOyAKLQlmaW5hbCBpbnQgYnV0dG9uT2Zmc2V0ID0gdGV4dC5sZW5ndGgoKSAtIDI7Ci0JbGF5b3V0LnNldFN0eWxlKGJ1dHRvblN0eWxlLCBidXR0b25PZmZzZXQsIGJ1dHRvbk9mZnNldCk7Ci0JCi0Jc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJUG9pbnQgbWFyZ2luID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JCQlsYXlvdXQuc2V0V2lkdGgoc2hlbGwuZ2V0Q2xpZW50QXJlYSgpLndpZHRoIC0gMiAqIG1hcmdpbi54KTsKLQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBtYXJnaW4ueCwgbWFyZ2luLnkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgb2Zmc2V0ID0gaW1hZ2VPZmZzZXRzW2ldOwotCQkJCWludCBsaW5lSW5kZXggPSBsYXlvdXQuZ2V0TGluZUluZGV4KG9mZnNldCk7Ci0JCQkJRm9udE1ldHJpY3MgbGluZU1ldHJpY3MgPSBsYXlvdXQuZ2V0TGluZU1ldHJpY3MobGluZUluZGV4KTsKLQkJCQlQb2ludCBwb2ludCA9IGxheW91dC5nZXRMb2NhdGlvbihvZmZzZXQsIGZhbHNlKTsKLQkJCQlHbHlwaE1ldHJpY3MgZ2x5cGhNZXRyaWNzID0gbGF5b3V0LmdldFN0eWxlKG9mZnNldCkubWV0cmljczsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2VzW2ldLCBwb2ludC54ICsgbWFyZ2luLngsIHBvaW50LnkgKyBtYXJnaW4ueSArIGxpbmVNZXRyaWNzLmdldEFzY2VudCgpIC0gZ2x5cGhNZXRyaWNzLmFzY2VudCk7Ci0JCQl9Ci0JCQlpbnQgbGluZUluZGV4ID0gbGF5b3V0LmdldExpbmVJbmRleChidXR0b25PZmZzZXQpOwotCQkJRm9udE1ldHJpY3MgbGluZU1ldHJpY3MgPSBsYXlvdXQuZ2V0TGluZU1ldHJpY3MobGluZUluZGV4KTsKLQkJCVBvaW50IHBvaW50ID0gbGF5b3V0LmdldExvY2F0aW9uKGJ1dHRvbk9mZnNldCwgZmFsc2UpOwotCQkJR2x5cGhNZXRyaWNzIGdseXBoTWV0cmljcyA9IGxheW91dC5nZXRTdHlsZShidXR0b25PZmZzZXQpLm1ldHJpY3M7Ci0JCQlidXR0b24uc2V0TG9jYXRpb24ocG9pbnQueCArIG1hcmdpbi54LCBwb2ludC55ICsgbWFyZ2luLnkgKyBsaW5lTWV0cmljcy5nZXRBc2NlbnQoKSAtIGdseXBoTWV0cmljcy5hc2NlbnQpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWxheW91dC5kaXNwb3NlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDUzYjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEEgYnV0dG9uIHdpdGggdGV4dCBhbmQgaW1hZ2UKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBHcmlkTGF5b3V0KCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIik7Ci0Jc2hlbGwuc2V0U2l6ZSgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWUwOTBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVXNlIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIHRvIHJlZmxlY3QsIHJvdGF0ZSBhbmQgc2hlYXIgaW1hZ2VzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDcgewkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCQotCQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMTAsIDYwKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiVGltZXMiLCAzMCwgU1dULkJPTEQpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDExMCwgNjApOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0JCWdjLmRyYXdUZXh0KCJTV1QiLCAxMCwgMTAsIHRydWUpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQkKLQkJZmluYWwgUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk1hdHJpeCBUcmFuZm9ybWF0aW9ucyIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsKLQkJY2FudmFzLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewkKLQkJCQlHQyBnYyA9IGUuZ2M7Ci0JCQkJZ2Muc2V0QWR2YW5jZWQodHJ1ZSk7Ci0JCQkJaWYgKCFnYy5nZXRBZHZhbmNlZCgpKXsKLQkJCQkJZ2MuZHJhd1RleHQoIkFkdmFuY2VkIGdyYXBoaWNzIG5vdCBzdXBwb3J0ZWQiLCAzMCwgMzAsIHRydWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCS8vIE9yaWdpbmFsIGltYWdlCi0JCQkJaW50IHggPSAzMCwgeSA9IDMwOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgeCwgeSk7IAotCQkJCXggKz0gcmVjdC53aWR0aCArIDMwOwotCQkJCQotCQkJCVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKGRpc3BsYXkpOwotCQkJCQotCQkJCS8vIE5vdGUgdGhhdCB0aGUgdHJhbmZvcm0gaXMgYXBwbGllZCB0byB0aGUgd2hvbGUgR0MgdGhlcmVmb3JlCi0JCQkJLy8gdGhlIGNvb3JkaW5hdGVzIG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG9vLgotCQkJCQotCQkJCS8vIFJlZmxlY3QgYXJvdW5kIHRoZSB5IGF4aXMuCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKC0xLCAwLCAwLCAxLCAwICwwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIC0xKngtcmVjdC53aWR0aCwgeSk7Ci0JCQkJCi0JCQkJeCA9IDMwOyB5ICs9IHJlY3QuaGVpZ2h0ICsgMzA7Ci0JCQkJCi0JCQkJLy8gUmVmbGVjdCBhcm91bmQgdGhlIHggYXhpcy4gCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIDAsIDAsIC0xLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIC0xKnktcmVjdC5oZWlnaHQpOwotCQkJCQotCQkJCXggKz0gcmVjdC53aWR0aCArIDMwOwotCQkJCQotCQkJCS8vIFJlZmxlY3QgYXJvdW5kIHRoZSB4IGFuZCB5IGF4ZXMJCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKC0xLCAwLCAwLCAtMSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAtMSp4LXJlY3Qud2lkdGgsIC0xKnktcmVjdC5oZWlnaHQpOwotCQkJCQotCQkJCXggPSAzMDsgeSArPSByZWN0LmhlaWdodCArIDMwOwotCQkJCQotCQkJCS8vIFNoZWFyIGluIHRoZSB4LWRpcmVjdGlvbgotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cygxLCAwLCAtMSwgMSwgMCwgMCk7Ci0JCQkJZ2Muc2V0VHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCAzMDAsIHkpOwotCQkJCQotCQkJCS8vIFNoZWFyIGluIHktZGlyZWN0aW9uCi0JCQkJdHJhbnNmb3JtLnNldEVsZW1lbnRzKDEsIC0xLCAwLCAxLCAwLCAwKTsKLQkJCQlnYy5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLQkJCQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDE1MCwgNDc1KTsKLQkJCQkKLQkJCQkvLyBSb3RhdGUgYnkgNDUgZGVncmVlcwkKLQkJCQlmbG9hdCBjb3M0NSA9IChmbG9hdClNYXRoLmNvcyg0NSk7Ci0JCQkJZmxvYXQgc2luNDUgPSAoZmxvYXQpTWF0aC5zaW4oNDUpOwotCQkJCXRyYW5zZm9ybS5zZXRFbGVtZW50cyhjb3M0NSwgc2luNDUsIC1zaW40NSwgY29zNDUsIDAsIDApOwotCQkJCWdjLnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotCQkJCWdjLmRyYXdJbWFnZShpbWFnZSwgMzUwLCAxMDApOwotCQkJCQotCQkJCXRyYW5zZm9ybS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2hlbGwuc2V0U2l6ZSgzNTAsIDU1MCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0JCi0KLQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODg2NWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDaGFuZ2UgaHVlLCBzYXR1cmF0aW9uIGFuZCBicmlnaHRuZXNzIG9mIGEgY29sb3IKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMDggewkgCi0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEoMHhmZiwgMHhmZjAwLCAweGZmMDAwMCk7CQotCQotCS8vIEltYWdlRGF0YSBzaG93aW5nIHZhcmlhdGlvbnMgb2YgaHVlCQotCUltYWdlRGF0YSBodWVEYXRhID0gbmV3IEltYWdlRGF0YSgzNjAsIDEwMCwgMjQsIHBhbGV0dGUpOwkKLQlmbG9hdCBodWUgPSAwOwotCWZvciAoaW50IHggPSAwOyB4IDwgaHVlRGF0YS53aWR0aDsgeCsrKSB7Ci0JCWZvciAoaW50IHkgPSAwOyB5IDwgaHVlRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKGh1ZSwgMWYsIDFmKSk7Ci0JCQlodWVEYXRhLnNldFBpeGVsKHgsIHksIHBpeGVsKTsKLQkJfQotCQlodWUgKz0gMzYwZiAvIGh1ZURhdGEud2lkdGg7Ci0JfQotCi0JLy8gSW1hZ2VEYXRhIHNob3dpbmcgc2F0dXJhdGlvbiBvbiB4IGF4aXMgYW5kIGJyaWdodG5lc3Mgb24geSBheGlzCi0JSW1hZ2VEYXRhIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YSA9IG5ldyBJbWFnZURhdGEoMzYwLCAzNjAsIDI0LCBwYWxldHRlKTsKLQlmbG9hdCBzYXR1cmF0aW9uID0gMGY7Ci0JZmxvYXQgYnJpZ2h0bmVzcyA9IDFmOwotCWZvciAoaW50IHggPSAwOyB4IDwgc2F0dXJhdGlvbkJyaWdodG5lc3NEYXRhLndpZHRoOyB4KyspIHsKLQkJYnJpZ2h0bmVzcyA9IDFmOwotCQlmb3IgKGludCB5ID0gMDsgeSA8IHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5oZWlnaHQ7IHkrKykgewotCQkJaW50IHBpeGVsID0gcGFsZXR0ZS5nZXRQaXhlbChuZXcgUkdCKDM2MGYsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MpKTsJCi0JCQlzYXR1cmF0aW9uQnJpZ2h0bmVzc0RhdGEuc2V0UGl4ZWwoeCwgeSwgcGl4ZWwpOwotCQkJYnJpZ2h0bmVzcyAtPSAxZiAvIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS5oZWlnaHQ7Ci0JCX0KLQkJc2F0dXJhdGlvbiArPSAxZiAvIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YS53aWR0aDsKLQl9Ci0JCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JSW1hZ2UgaHVlSW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaHVlRGF0YSk7Ci0JSW1hZ2Ugc2F0dXJhdGlvbkltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHNhdHVyYXRpb25CcmlnaHRuZXNzRGF0YSk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiSHVlLCBTYXR1cmF0aW9uLCBCcmlnaHRuZXNzIik7Ci0JR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCWdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTY7Ci0Jc2hlbGwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwkJCi0JCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldEltYWdlKGh1ZUltYWdlKTsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlLCAyLCAxKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwkKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7IC8vc3BhY2VyCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldFRleHQoIkh1ZSIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMiwgMSk7Ci0JbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkxFRlQpOwotCWxhYmVsLnNldFRleHQoIkJyaWdodG5lc3MiKTsKLQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIFNXVC5DRU5URVIpOwotCWxhYmVsLnNldEltYWdlKHNhdHVyYXRpb25JbWFnZSk7Ci0JZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCWxhYmVsLnNldExheW91dERhdGEgKGRhdGEpOwotCQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCBTV1QuQ0VOVEVSKTsgLy9zcGFjZXIKLQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkNFTlRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiU2F0dXJhdGlvbiIpOwotCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0JaHVlSW1hZ2UuZGlzcG9zZSgpOwotCXNhdHVyYXRpb25JbWFnZS5kaXNwb3NlKCk7CQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkyNTAyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIE9wZW5HTCBzbmlwcGV0OiB1c2UgSk9HTCB0byBkcmF3IHRvIGFuIFNXVCBHTENhbnZhcwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vcGVuZ2wuR0xDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9wZW5nbC5HTERhdGE7Ci0KLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0w7Ci1pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLkdMQ29udGV4dDsKLWltcG9ydCBqYXZheC5tZWRpYS5vcGVuZ2wuR0xEcmF3YWJsZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWVkaWEub3BlbmdsLmdsdS5HTFU7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjA5IHsKLQlzdGF0aWMgdm9pZCBkcmF3VG9ydXMoR0wgZ2wsIGZsb2F0IHIsIGZsb2F0IFIsIGludCBuc2lkZXMsIGludCByaW5ncykgewotCQlmbG9hdCByaW5nRGVsdGEgPSAyLjBmICogKGZsb2F0KSBNYXRoLlBJIC8gcmluZ3M7Ci0JCWZsb2F0IHNpZGVEZWx0YSA9IDIuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBuc2lkZXM7Ci0JCWZsb2F0IHRoZXRhID0gMC4wZiwgY29zVGhldGEgPSAxLjBmLCBzaW5UaGV0YSA9IDAuMGY7Ci0JCWZvciAoaW50IGkgPSByaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlmbG9hdCB0aGV0YTEgPSB0aGV0YSArIHJpbmdEZWx0YTsKLQkJCWZsb2F0IGNvc1RoZXRhMSA9IChmbG9hdCkgTWF0aC5jb3ModGhldGExKTsKLQkJCWZsb2F0IHNpblRoZXRhMSA9IChmbG9hdCkgTWF0aC5zaW4odGhldGExKTsKLQkJCWdsLmdsQmVnaW4oR0wuR0xfUVVBRF9TVFJJUCk7Ci0JCQlmbG9hdCBwaGkgPSAwLjBmOwotCQkJZm9yIChpbnQgaiA9IG5zaWRlczsgaiA+PSAwOyBqLS0pIHsKLQkJCQlwaGkgKz0gc2lkZURlbHRhOwotCQkJCWZsb2F0IGNvc1BoaSA9IChmbG9hdCkgTWF0aC5jb3MocGhpKTsKLQkJCQlmbG9hdCBzaW5QaGkgPSAoZmxvYXQpIE1hdGguc2luKHBoaSk7Ci0JCQkJZmxvYXQgZGlzdCA9IFIgKyByICogY29zUGhpOwotCQkJCWdsLmdsTm9ybWFsM2YoY29zVGhldGExICogY29zUGhpLCAtc2luVGhldGExICogY29zUGhpLCBzaW5QaGkpOwotCQkJCWdsLmdsVmVydGV4M2YoY29zVGhldGExICogZGlzdCwgLXNpblRoZXRhMSAqIGRpc3QsIHIgKiBzaW5QaGkpOwotCQkJCWdsLmdsTm9ybWFsM2YoY29zVGhldGEgKiBjb3NQaGksIC1zaW5UaGV0YSAqIGNvc1BoaSwgc2luUGhpKTsKLQkJCQlnbC5nbFZlcnRleDNmKGNvc1RoZXRhICogZGlzdCwgLXNpblRoZXRhICogZGlzdCwgciAqIHNpblBoaSk7Ci0JCQl9Ci0JCQlnbC5nbEVuZCgpOwotCQkJdGhldGEgPSB0aGV0YTE7Ci0JCQljb3NUaGV0YSA9IGNvc1RoZXRhMTsKLQkJCXNpblRoZXRhID0gc2luVGhldGExOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWNvbXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlHTERhdGEgZGF0YSA9IG5ldyBHTERhdGEgKCk7Ci0JCWRhdGEuZG91YmxlQnVmZmVyID0gdHJ1ZTsKLQkJZmluYWwgR0xDYW52YXMgY2FudmFzID0gbmV3IEdMQ2FudmFzKGNvbXAsIFNXVC5OT05FLCBkYXRhKTsKLQotCQljYW52YXMuc2V0Q3VycmVudCgpOwotCQlmaW5hbCBHTENvbnRleHQgY29udGV4dCA9IEdMRHJhd2FibGVGYWN0b3J5LmdldEZhY3RvcnkoKS5jcmVhdGVFeHRlcm5hbEdMQ29udGV4dCgpOwotCi0JCWNhbnZhcy5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjYW52YXMuZ2V0Qm91bmRzKCk7Ci0JCQkJZmxvYXQgZkFzcGVjdCA9IChmbG9hdCkgYm91bmRzLndpZHRoIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJY29udGV4dC5tYWtlQ3VycmVudCgpOwotCQkJCUdMIGdsID0gY29udGV4dC5nZXRHTCAoKTsKLQkJCQlnbC5nbFZpZXdwb3J0KDAsIDAsIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMLkdMX1BST0pFQ1RJT04pOwotCQkJCWdsLmdsTG9hZElkZW50aXR5KCk7Ci0JCQkJR0xVIGdsdSA9IG5ldyBHTFUoKTsKLQkJCQlnbHUuZ2x1UGVyc3BlY3RpdmUoNDUuMGYsIGZBc3BlY3QsIDAuNWYsIDQwMC4wZik7Ci0JCQkJZ2wuZ2xNYXRyaXhNb2RlKEdMLkdMX01PREVMVklFVyk7Ci0JCQkJZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQkJCQljb250ZXh0LnJlbGVhc2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY29udGV4dC5tYWtlQ3VycmVudCgpOwotCQlHTCBnbCA9IGNvbnRleHQuZ2V0R0wgKCk7Ci0JCWdsLmdsQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKLQkJZ2wuZ2xDb2xvcjNmKDEuMGYsIDAuMGYsIDAuMGYpOwotCQlnbC5nbEhpbnQoR0wuR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULCBHTC5HTF9OSUNFU1QpOwotCQlnbC5nbENsZWFyRGVwdGgoMS4wKTsKLQkJZ2wuZ2xMaW5lV2lkdGgoMik7Ci0JCWdsLmdsRW5hYmxlKEdMLkdMX0RFUFRIX1RFU1QpOwotCQljb250ZXh0LnJlbGVhc2UoKTsKLQotCQlzaGVsbC5zZXRUZXh0KCJTV1QvSk9HTCBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldFNpemUoNjQwLCA0ODApOwotCQlzaGVsbC5vcGVuKCk7Ci0KLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJaW50IHJvdCA9IDA7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFjYW52YXMuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWNhbnZhcy5zZXRDdXJyZW50KCk7Ci0JCQkJCWNvbnRleHQubWFrZUN1cnJlbnQoKTsKLQkJCQkJR0wgZ2wgPSBjb250ZXh0LmdldEdMICgpOwotCQkJCQlnbC5nbENsZWFyKEdMLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTC5HTF9ERVBUSF9CVUZGRVJfQklUKTsKLQkJCQkJZ2wuZ2xDbGVhckNvbG9yKC4zZiwgLjVmLCAuOGYsIDEuMGYpOwotCQkJCQlnbC5nbExvYWRJZGVudGl0eSgpOwotCQkJCQlnbC5nbFRyYW5zbGF0ZWYoMC4wZiwgMC4wZiwgLTEwLjBmKTsKLQkJCQkJZmxvYXQgZnJvdCA9IHJvdDsKLQkJCQkJZ2wuZ2xSb3RhdGVmKDAuMTVmICogcm90LCAyLjBmICogZnJvdCwgMTAuMGYgKiBmcm90LCAxLjBmKTsKLQkJCQkJZ2wuZ2xSb3RhdGVmKDAuM2YgKiByb3QsIDMuMGYgKiBmcm90LCAxLjBmICogZnJvdCwgMS4wZik7Ci0JCQkJCXJvdCsrOwotCQkJCQlnbC5nbFBvbHlnb25Nb2RlKEdMLkdMX0ZST05UX0FORF9CQUNLLCBHTC5HTF9MSU5FKTsKLQkJCQkJZ2wuZ2xDb2xvcjNmKDAuOWYsIDAuOWYsIDAuOWYpOwotCQkJCQlkcmF3VG9ydXMoZ2wsIDEsIDEuOWYgKyAoKGZsb2F0KSBNYXRoLnNpbigoMC4wMDRmICogZnJvdCkpKSwgMTUsIDE1KTsKLQkJCQkJY2FudmFzLnN3YXBCdWZmZXJzKCk7Ci0JCQkJCWNvbnRleHQucmVsZWFzZSgpOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmEwMDguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2FudmFzIGV4YW1wbGUgc25pcHBldDogaW1wbGVtZW50IHRhYiB0cmF2ZXJzYWwgKGJlaGF2ZSBsaWtlIGEgdGFiIGdyb3VwKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQnV0dG9uIGIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWIuc2V0Qm91bmRzICgxMCwgMTAsIDEwMCwgMzIpOwotCWIuc2V0VGV4dCAoIkJ1dHRvbiIpOwotCXNoZWxsLnNldERlZmF1bHRCdXR0b24gKGIpOwotCWZpbmFsIENhbnZhcyBjID0gbmV3IENhbnZhcyAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMuc2V0Qm91bmRzICgxMCwgNTAsIDEwMCwgMzIpOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsKLQkJCQkvKiBEbyB0YWIgZ3JvdXAgdHJhdmVyc2FsICovCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9UQUJfTkVYVDoJCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTOgotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVDoJCi0JCQkJY2FzZSBTV1QuVFJBVkVSU0VfUEFHRV9QUkVWSU9VUzoKLQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuRm9jdXNJbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWMuc2V0QmFja2dyb3VuZCAocmVkKTsKLQkJfQotCX0pOwotCWMuYWRkTGlzdGVuZXIgKFNXVC5Gb2N1c091dCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWMuc2V0QmFja2dyb3VuZCAoYmx1ZSk7Ci0JCX0KLQl9KTsKLQljLmFkZExpc3RlbmVyIChTV1QuS2V5RG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIktFWSIpOwotCQkJZm9yIChpbnQgaT0wOyBpPDY0OyBpKyspIHsKLQkJCQlDb2xvciBjMSA9IHJlZCwgYzIgPSBibHVlOwotCQkJCWlmIChjLmlzRm9jdXNDb250cm9sICgpKSB7Ci0JCQkJCWMxID0gYmx1ZTsgIGMyID0gcmVkOwotCQkJCX0KLQkJCQljLnNldEJhY2tncm91bmQgKGMxKTsKLQkJCQljLnVwZGF0ZSAoKTsKLQkJCQljLnNldEJhY2tncm91bmQgKGMyKTsKLQkJCX0KLQkJfQotCX0pOwotCVRleHQgdCA9IG5ldyBUZXh0IChzaGVsbCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCXQuc2V0Qm91bmRzICgxMCwgODUsIDEwMCwgMzIpOwotCi0JVGV4dCByID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSKTsKLQlyLnNldEJvdW5kcyAoMTAsIDEyMCwgMTAwLCAzMik7Ci0JCi0JYy5zZXRGb2N1cyAoKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU2YTYwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIHRleHQgYmV0d2VlbiB0d28gU3R5bGVkVGV4dCB3aWRnZXRzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEwIHsKLQlzdGF0aWMgU3RyaW5nIHN0cmluZzEgPSAiQSBkcmFnIHNvdXJjZSBpcyB0aGUgcHJvdmlkZXIgb2YgZGF0YSBpbiBhIERyYWcgYW5kIERyb3AgZGF0YSB0cmFuc2ZlciBhcyB3ZWxsIGFzICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG9yaWdpbmF0b3Igb2YgdGhlIERyYWcgYW5kIERyb3Agb3BlcmF0aW9uLiBUaGUgZGF0YSBwcm92aWRlZCBieSB0aGUgZHJhZyBzb3VyY2UgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXkgYmUgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBsb2NhdGlvbiBpbiB0aGUgc2FtZSB3aWRnZXQsIHRvIGEgZGlmZmVyZW50IHdpZGdldCAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiwgb3IgdG8gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gYWx0b2dldGhlci4gRm9yIGV4YW1wbGUsICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IGNhbiBkcmFnIHRleHQgZnJvbSB5b3VyIGFwcGxpY2F0aW9uIGFuZCBkcm9wIGl0IG9uIGFuIGVtYWlsIGFwcGxpY2F0aW9uLCBvciB5b3UgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBkcmFnIGFuIGl0ZW0gaW4gYSB0cmVlIGFuZCBkcm9wIGl0IGJlbG93IGEgZGlmZmVyZW50IG5vZGUgaW4gdGhlIHNhbWUgdHJlZS4iOwotCi0Jc3RhdGljIFN0cmluZyBzdHJpbmcyID0gIkEgZHJvcCB0YXJnZXQgcmVjZWl2ZXMgZGF0YSBpbiBhIERyYWcgYW5kIERyb3Agb3BlcmF0aW9uLiBUaGUgZGF0YSByZWNlaXZlZCBieSAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZHJvcCB0YXJnZXQgbWF5IGhhdmUgY29tZSBmcm9tIHRoZSBzYW1lIHdpZGdldCwgZnJvbSBhIGRpZmZlcmVudCB3aWRnZXQgd2l0aGluICIrCi0JICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzYW1lIGFwcGxpY2F0aW9uLCBvciBmcm9tIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIGFsdG9nZXRoZXIuIEZvciBleGFtcGxlLCB5b3UgIisKLQkgICAgICAgICAgICAgICAgICAgICAgICAiY2FuIGRyYWcgdGV4dCBmcm9tIGFuIGVtYWlsIGFwcGxpY2F0aW9uIGFuZCBkcm9wIGl0IG9uIHlvdXIgYXBwbGljYXRpb24sIG9yIHlvdSBjb3VsZCAiKwotCSAgICAgICAgICAgICAgICAgICAgICAgICJkcmFnIGFuIGl0ZW0gaW4gYSB0cmVlIGFuZCBkcm9wIGl0IGJlbG93IGEgZGlmZmVyZW50IG5vZGUgaW4gdGhlIHNhbWUgdHJlZS4iOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlpbnQgc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVI7Ci0JZmluYWwgU3R5bGVkVGV4dCB0ZXh0MSA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBzdHlsZSk7Ci0JdGV4dDEuc2V0VGV4dChzdHJpbmcxKTsKLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRleHQxLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0Jc291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIobmV3IERyYWdTb3VyY2VBZGFwdGVyKCkgewotCQlQb2ludCBzZWxlY3Rpb247Ci0JCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZSkgewotCQkJc2VsZWN0aW9uID0gdGV4dDEuZ2V0U2VsZWN0aW9uKCk7Ci0JCQllLmRvaXQgPSBzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnU2V0RGF0YShEcmFnU291cmNlRXZlbnQgZSkgewotCQkJZS5kYXRhID0gdGV4dDEuZ2V0VGV4dChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnktMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCXRleHQxLnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uLngsIHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLngsICIiKTsKLQkJCX0KLQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCX0KLQl9KTsKLQkKLQlmaW5hbCBTdHlsZWRUZXh0IHRleHQyID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIHN0eWxlKTsKLQl0ZXh0Mi5zZXRUZXh0KHN0cmluZzIpOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQodGV4dDIsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTkspOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkKLQkJCQllLmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGUpIHsKLQkJCWlmIChlLmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKQotCQkJCWUuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBlKSB7Ci0JCQl0ZXh0Mi5pbnNlcnQoKFN0cmluZyllLmRhdGEpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTEuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4NTk4Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU1dUIFN0eWxlZFRleHQgc25pcHBldDogdXNlIHJpc2UgYW5kIGZvbnQgd2l0aCBTdHlsZVJhbmdlLiAKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjExIHsKLQotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiWW91IGNhbiBzZXQgYW55IGZvbnQgeW91IHdhbnQgaW4gYSByYW5nZS4gWW91IGNhbiBhbHNvIHNldCBhIGJhc2VsaW5lIHJpc2UgYW5kIGFsbCBvdGhlciBvbGQgZmVhdHVyZXMiICsgCi0JCSIgbGlrZSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kLCBhbmQgbWl4IHRoZW0gYW55IHdheSB5b3Ugd2FudC4gVG90YWxseSBhd2Vzb21lLiI7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJRm9udERhdGEgZGF0YSA9IHN0eWxlZFRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgZGF0YS5nZXRIZWlnaHQoKSAqIDIsIGRhdGEuZ2V0U3R5bGUoKSk7Ci0JCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCBkYXRhLmdldE5hbWUoKSwgZGF0YS5nZXRIZWlnaHQoKSAqIDQgLyA1LCBkYXRhLmdldFN0eWxlKCkpOwotCQlTdHlsZVJhbmdlW10gc3R5bGVzID0gbmV3IFN0eWxlUmFuZ2VbOF07Ci0JCXN0eWxlc1swXSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1swXS5mb250ID0gZm9udDE7IAotCQlzdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbMV0ucmlzZSA9IGRhdGEuZ2V0SGVpZ2h0KCkgLyAzOyAKLQkJc3R5bGVzWzJdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzJdLmJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTik7IAotCQlzdHlsZXNbM10gPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlzdHlsZXNbM10uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX01BR0VOVEEpOyAKLQkJc3R5bGVzWzRdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzRdLmZvbnQgPSBmb250MjsgCi0JCXN0eWxlc1s0XS5mb3JlZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7OwotCQlzdHlsZXNbNF0udW5kZXJsaW5lID0gdHJ1ZTsKLQkJc3R5bGVzWzVdID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJc3R5bGVzWzVdLnJpc2UgPSAtZGF0YS5nZXRIZWlnaHQoKSAvIDM7IAotCQlzdHlsZXNbNV0uc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJc3R5bGVzWzVdLnVuZGVybGluZSA9IHRydWU7Ci0JCXN0eWxlc1s2XSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1s2XS5mb250ID0gZm9udDE7IAotCQlzdHlsZXNbNl0uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVyk7Ci0JCXN0eWxlc1s2XS5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JCXN0eWxlc1s3XSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXN0eWxlc1s3XS5yaXNlID0gIGRhdGEuZ2V0SGVpZ2h0KCkgLyAzOwotCQlzdHlsZXNbN10udW5kZXJsaW5lID0gdHJ1ZTsKLQkJc3R5bGVzWzddLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwotCQlzdHlsZXNbN10uZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCXN0eWxlc1s3XS5iYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCQkKLQkJaW50W10gcmFuZ2VzID0gbmV3IGludFtdIHsxNiwgNCwgNjEsIDEzLCAxMDcsIDEwLCAxMjIsIDEwLCAxMzQsIDMsIDE0MywgNiwgMTYwLCA3LCAxNjgsIDd9OwotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2VzKHJhbmdlcywgc3R5bGVzKTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvbnQxLmRpc3Bvc2UoKTsKLQkJZm9udDIuZGlzcG9zZSgpOwkJCi0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZjNiNy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLS8qKgotICogU3R5bGVkVGV4dCBzbmlwcGV0OiBlbWJlZCBpbWFnZXMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjEyIHsKLQkKLQlzdGF0aWMgU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCXN0YXRpYyBTdHJpbmcgdGV4dCA9IAotCQkiVGhpcyBzbmlwcGV0IHNob3dzIGhvdyB0byBlbWJlZCBpbWFnZXMgaW4gYSBTdHlsZWRUZXh0LlxuIisKLQkJIkhlcmUgaXMgb25lOiBcdUZGRkMsIGFuZCBoZXJlIGlzIGFub3RoZXI6IFx1RkZGQy4iKwotCQkiVXNlIHRoZSBhZGQgYnV0dG9uIHRvIGFkZCBhbiBpbWFnZSBmcm9tIHlvdXIgZmlsZXN5c3RlbSB0byB0aGUgU3R5bGVkVGV4dCBhdCB0aGUgY3VycmVudCBjYXJldCBvZmZzZXQuIjsKLQlzdGF0aWMgSW1hZ2VbXSBpbWFnZXM7Ci0Jc3RhdGljIGludFtdIG9mZnNldHM7Ci0KLQlzdGF0aWMgdm9pZCBhZGRJbWFnZShJbWFnZSBpbWFnZSwgaW50IG9mZnNldCkgewotCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UgKCk7Ci0JCXN0eWxlLnN0YXJ0ID0gb2Zmc2V0OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQlzdHlsZS5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcyhyZWN0LmhlaWdodCwgMCwgcmVjdC53aWR0aCk7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JCWltYWdlcyA9IG5ldyBJbWFnZVtdIHsKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fUVVFU1RJT04pLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTiksCi0JCX07Ci0JCW9mZnNldHMgPSBuZXcgaW50W2ltYWdlcy5sZW5ndGhdOwotCQlpbnQgbGFzdE9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gdGV4dC5pbmRleE9mKCJcdUZGRkMiLCBsYXN0T2Zmc2V0KTsKLQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQlhZGRJbWFnZShpbWFnZXNbaV0sIG9mZnNldCk7Ci0JCQlsYXN0T2Zmc2V0ID0gb2Zmc2V0ICsgMTsKLQkJfQotCQkKLQkJLy8gdXNlIGEgdmVyaWZ5IGxpc3RlbmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgdXAgdG8gZGF0ZQotCQlzdHlsZWRUZXh0LmFkZFZlcmlmeUxpc3RlbmVyKG5ldyBWZXJpZnlMaXN0ZW5lcigpICB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCQlpbnQgc3RhcnQgPSBlLnN0YXJ0OwotCQkJCWludCByZXBsYWNlQ2hhckNvdW50ID0gZS5lbmQgLSBlLnN0YXJ0OwotCQkJCWludCBuZXdDaGFyQ291bnQgPSBlLnRleHQubGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBvZmZzZXRzW2ldOwotCQkJCQlpZiAoc3RhcnQgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IHN0YXJ0ICsgcmVwbGFjZUNoYXJDb3VudCkgewotCQkJCQkJLy8gdGhpcyBpbWFnZSBpcyBiZWluZyBkZWxldGVkIGZyb20gdGhlIHRleHQKLQkJCQkJCWlmIChpbWFnZXNbaV0gIT0gbnVsbCAmJiAhaW1hZ2VzW2ldLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCWltYWdlc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQkJaW1hZ2VzW2ldID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCW9mZnNldCA9IC0xOwotCQkJCQl9Ci0JCQkJCWlmIChvZmZzZXQgIT0gLTEgJiYgb2Zmc2V0ID49IHN0YXJ0KSBvZmZzZXQgKz0gbmV3Q2hhckNvdW50IC0gcmVwbGFjZUNoYXJDb3VudDsKLQkJCQkJb2Zmc2V0c1tpXSA9IG9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZWRUZXh0LmFkZFBhaW50T2JqZWN0TGlzdGVuZXIobmV3IFBhaW50T2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYWludE9iamVjdChQYWludE9iamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gZXZlbnQuc3R5bGU7Ci0JCQkJaW50IHN0YXJ0ID0gc3R5bGUuc3RhcnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBvZmZzZXRzW2ldOwotCQkJCQlpZiAoc3RhcnQgPT0gb2Zmc2V0KSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCQkJCWludCB4ID0gZXZlbnQueDsKLQkJCQkJCWludCB5ID0gZXZlbnQueSArIGV2ZW50LmFzY2VudCAtIHN0eWxlLm1ldHJpY3MuYXNjZW50OwkJCQkJCQotCQkJCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIkFkZCBJbWFnZSIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOwotCQkJCVN0cmluZyBmaWxlbmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGZpbGVuYW1lKTsKLQkJCQkJCWludCBvZmZzZXQgPSBzdHlsZWRUZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2Uob2Zmc2V0LCAwLCAiXHVGRkZDIik7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJd2hpbGUgKGluZGV4IDwgb2Zmc2V0cy5sZW5ndGgpIHsKLQkJCQkJCQlpZiAob2Zmc2V0c1tpbmRleF0gPT0gLTEgJiYgaW1hZ2VzW2luZGV4XSA9PSBudWxsKSBicmVhazsKLQkJCQkJCQlpbmRleCsrOwotCQkJCQkJfQotCQkJCQkJaWYgKGluZGV4ID09IG9mZnNldHMubGVuZ3RoKSB7Ci0JCQkJCQkJaW50W10gdG1wT2Zmc2V0cyA9IG5ldyBpbnRbaW5kZXggKyAxXTsKLQkJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9mZnNldHMsIDAsIHRtcE9mZnNldHMsIDAsIG9mZnNldHMubGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXRzID0gdG1wT2Zmc2V0czsKLQkJCQkJCQlJbWFnZVtdIHRtcEltYWdlcyA9IG5ldyBJbWFnZVtpbmRleCArIDFdOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkoaW1hZ2VzLCAwLCB0bXBJbWFnZXMsIDAsIGltYWdlcy5sZW5ndGgpOwotCQkJCQkJCWltYWdlcyA9IHRtcEltYWdlczsKLQkJCQkJCX0KLQkJCQkJCW9mZnNldHNbaW5kZXhdID0gb2Zmc2V0OwotCQkJCQkJaW1hZ2VzW2luZGV4XSA9IGltYWdlOwotCQkJCQkJYWRkSW1hZ2UoaW1hZ2UsIG9mZnNldCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJbWFnZSBpbWFnZSA9IGltYWdlc1tpXTsKLQkJCWlmIChpbWFnZSAhPSBudWxsICYmICFpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDliNDMwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgU3R5bGVkVGV4dCBzbmlwcGV0OiB1c2UgaW5kZW50LCBhbGlnbm1lbnQgYW5kIGp1c3RpZnkuCi0gKiAKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTMgewotCi0Jc3RhdGljIFN0cmluZyB0ZXh0ID0gCi0JCSJUaGUgZmlyc3QgcGFyYWdyYXBoIGhhcyBhbiBpbmRlbnRhdGlvbiBvZiBmaWZ0eSBwaXhlbHMuIEluZGVudGF0aW9uIGlzIHRoZSBhbW91bnQgb2Ygd2hpdGUgc3BhY2UgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGxpbmUgb2YgYSBwYXJhZ3JhcGguIElmIHRoaXMgcGFyYWdyYXBoIHdyYXBzIHRvIHNldmVyYWwgbGluZXMgeW91IHNob3VsZCBzZWUgdGhlIGluZGVudGF0aW9uIG9ubHkgb24gdGhlIGZpcnN0IGxpbmUuXG5cbiIgKwotCQkiVGhlIHNlY29uZCBwYXJhZ3JhcGggaXMgY2VudGVyIGFsaWduZWQuIEFsaWdubWVudCBvbmx5IHdvcmtzIHdoZW4gdGhlIFN0eWxlZFRleHQgaXMgdXNpbmcgd29yZCB3cmFwLiBBbGlnbm1lbnQsIGFzIHdpdGggYWxsIG90aGVyIGxpbmUgYXR0cmlidXRlcywgY2FuIGJlIHNldCBmb3IgdGhlIHdob2xlIHdpZGdldCBvciBqdXN0IGZvciBhIHNldCBvZiBsaW5lcy5cblxuIiArCi0JCSJUaGUgdGhpcmQgcGFyYWdyYXBoIGlzIGp1c3RpZmllZC4gTGlrZSBhbGlnbm1lbnQsIGp1c3RpZnkgb25seSB3b3JrcyB3aGVuIHRoZSBTdHlsZWRUZXh0IGlzIHVzaW5nIHdvcmQgd3JhcC4gSWYgdGhlIHBhcmFncmFwaCB3cmFwcyB0byBzZXZlcmFsIGxpbmVzLCB0aGUganVzdGlmaWNhdGlvbiBpcyBwZXJmb3JtZWQgb24gYWxsIGxpbmVzIGJ1dCB0aGUgbGFzdCBvbmUuXG5cbiIgKwkJCi0JCSJUaGUgbGFzdCBwYXJhZ3JhcGggaXMganVzdGlmaWVkIGFuZCByaWdodCBhbGlnbmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBhbGlnbm1lbnQgaXMgb25seSBub3RpY2VhYmxlIGluIHRoZSBmaW5hbCBsaW5lLiI7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5XUkFQIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lSW5kZW50KDAsIDEsIDUwKTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lQWxpZ25tZW50KDIsIDEsIFNXVC5DRU5URVIpOwotCQlzdHlsZWRUZXh0LnNldExpbmVKdXN0aWZ5KDQsIDEsIHRydWUpOwotCQlzdHlsZWRUZXh0LnNldExpbmVBbGlnbm1lbnQoNiwgMSwgU1dULlJJR0hUKTsKLQkJc3R5bGVkVGV4dC5zZXRMaW5lSnVzdGlmeSg2LCAxLCB0cnVlKTsKLQkJCi0JCXNoZWxsLnNldFNpemUoMzAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDQ2NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHNldCBhIGJhY2tncm91bmQgaW1hZ2UgKGEgZHluYW1pYyBncmFkaWVudCkKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE0IHsKLQlzdGF0aWMgSW1hZ2Ugb2xkSW1hZ2U7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0QmFja2dyb3VuZE1vZGUgKFNXVC5JTkhFUklUX0RFRkFVTFQpOwotCQlGaWxsTGF5b3V0IGxheW91dDEgPSBuZXcgRmlsbExheW91dCAoU1dULlZFUlRJQ0FMKTsKLQkJbGF5b3V0MS5tYXJnaW5XaWR0aCA9IGxheW91dDEubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCXNoZWxsLnNldExheW91dCAobGF5b3V0MSk7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwIChzaGVsbCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0ICgiR3JvdXAgIik7Ci0JCVJvd0xheW91dCBsYXlvdXQyID0gbmV3IFJvd0xheW91dCAoU1dULlZFUlRJQ0FMKTsKLQkJbGF5b3V0Mi5tYXJnaW5XaWR0aCA9IGxheW91dDIubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Mi5zcGFjaW5nID0gMTA7Ci0JCWdyb3VwLnNldExheW91dCAobGF5b3V0Mik7Ci0JCWZvciAoaW50IGk9MDsgaTw4OyBpKyspIHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChncm91cCwgU1dULlJBRElPKTsKLQkJCWJ1dHRvbi5zZXRUZXh0ICgiQnV0dG9uICIgKyBpKTsKLQkJfQotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULlJlc2l6ZSwgbmV3IExpc3RlbmVyICgpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgTWF0aC5tYXggKDEsIHJlY3Qud2lkdGgpLCAxKTsJCi0JCQkJR0MgZ2MgPSBuZXcgR0MgKG5ld0ltYWdlKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxVRSkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSAocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIDEsIGZhbHNlKTsKLQkJCQlnYy5kaXNwb3NlICgpOwotCQkJCXNoZWxsLnNldEJhY2tncm91bmRJbWFnZSAobmV3SW1hZ2UpOwotCQkJCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQkJCW9sZEltYWdlID0gbmV3SW1hZ2U7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5wYWNrICgpOwotCQlzaGVsbC5vcGVuICgpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQkJaWYgKG9sZEltYWdlICE9IG51bGwpIG9sZEltYWdlLmRpc3Bvc2UgKCk7Ci0JCWRpc3BsYXkuZGlzcG9zZSAoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzMzMWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IHRha2UgYSBzY3JlZW4gc2hvdCB3aXRoIGEgR0MKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiQ2FwdHVyZSIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkKLQkJCS8qIFRha2UgdGhlIHNjcmVlbiBzaG90ICovCi0JCQlHQyBnYyA9IG5ldyBHQyhkaXNwbGF5KTsKLQkJCWZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRpc3BsYXkuZ2V0Qm91bmRzKCkpOwotCQkJZ2MuY29weUFyZWEoaW1hZ2UsIDAsIDApOwotCQkJZ2MuZGlzcG9zZSgpOwotCQkJCi0JCQlTaGVsbCBwb3B1cCA9IG5ldyBTaGVsbChzaGVsbCwgU1dULlNIRUxMX1RSSU0pOwotCQkJcG9wdXAuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJcG9wdXAuc2V0VGV4dCgiSW1hZ2UiKTsKLQkJCXBvcHVwLnNldEJvdW5kcyg1MCwgNTAsIDIwMCwgMjAwKTsKLQkJCXBvcHVwLmFkZExpc3RlbmVyKFNXVC5DbG9zZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZSAocG9wdXAsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzYywgU1dULk5PTkUpOwotCQkJc2Muc2V0Q29udGVudChjYW52YXMpOwotCQkJY2FudmFzLnNldEJvdW5kcyhkaXNwbGF5LmdldEJvdW5kcyAoKSk7Ci0JCQljYW52YXMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQkJCWUuZ2MuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXBvcHVwLm9wZW4oKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZThmN2M0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sIFRpcHMgZXhhbXBsZSBzbmlwcGV0OiBzaG93IGEgdG9vbCB0aXAgaW5zaWRlIGEgcmVjdGFuZ2xlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE2IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JCWZpbmFsIENvbG9yIFtdIGNvbG9ycyA9IHsKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpLAotCQkJZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKSwKLQkJCWRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKSwKLQkJfTsKLQkJZmluYWwgUmVjdGFuZ2xlIFtdIHJlY3RzID0gewotCQkJbmV3IFJlY3RhbmdsZSAoMTAsIDEwLCAzMCwgMzApLAotCQkJbmV3IFJlY3RhbmdsZSAoMjAsIDQ1LCAyNSwgMzUpLAotCQkJbmV3IFJlY3RhbmdsZSAoODAsIDgwLCAxMCwgMTApLAotCQl9OwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCWNhc2UgU1dULk1vdXNlRW50ZXI6Ci0JCQkJCWNhc2UgU1dULk1vdXNlTW92ZToKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxyZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChyZWN0cyBbaV0uY29udGFpbnMgKGV2ZW50LngsIGV2ZW50LnkpKSB7Ci0JCQkJCQkJCVN0cmluZyB0ZXh0ID0gIlRvb2xUaXAgIiArIGk7Ci0JCQkJCQkJCWlmICghKHRleHQuZXF1YWxzIChzaGVsbC5nZXRUb29sVGlwVGV4dCAoKSkpKSB7Ci0JCQkJCQkJCQlzaGVsbC5zZXRUb29sVGlwVGV4dCAoIlRvb2xUaXAgIiArIGkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzaGVsbC5zZXRUb29sVGlwVGV4dCAobnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJfQotCQl9OwotCQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbW91c2VMaXN0ZW5lcik7Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VFbnRlciwgbW91c2VMaXN0ZW5lcik7Ci0JCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCWZvciAoaW50IGk9MDsgaTxyZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcnMgW2ldKTsKLQkJCQkJZ2MuZmlsbFJlY3RhbmdsZSAocmVjdHMgW2ldKTsKLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZSAocmVjdHMgW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjUxMWU0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBTdHlsZWRUZXh0IHNuaXBwZXQ6IGVtYmVkIGNvbnRyb2xzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxNyB7Ci0JCi0Jc3RhdGljIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAKLQkJIlRoaXMgc25pcHBldCBzaG93cyBob3cgdG8gZW1iZWQgd2lkZ2V0cyBpbiBhIFN0eWxlZFRleHQuXG4iKwotCQkiSGVyZSBpcyBvbmU6IFx1RkZGQywgYW5kIGhlcmUgaXMgYW5vdGhlcjogXHVGRkZDLiI7Ci0Jc3RhdGljIGludFtdIG9mZnNldHM7Ci0Jc3RhdGljIENvbnRyb2xbXSBjb250cm9sczsKLQlzdGF0aWMgaW50IE1BUkdJTiA9IDU7Ci0JCi0Jc3RhdGljIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGNvbnRyb2wsIGludCBvZmZzZXQpIHsKLQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlICgpOwotCQlzdHlsZS5zdGFydCA9IG9mZnNldDsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJY29udHJvbC5wYWNrKCk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gY29udHJvbC5nZXRCb3VuZHMoKTsKLQkJaW50IGFzY2VudCA9IDIqcmVjdC5oZWlnaHQvMzsKLQkJaW50IGRlc2NlbnQgPSByZWN0LmhlaWdodCAtIGFzY2VudDsKLQkJc3R5bGUubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoYXNjZW50ICsgTUFSR0lOLCBkZXNjZW50ICsgTUFSR0lOLCByZWN0LndpZHRoICsgMipNQVJHSU4pOwotCQlzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDMyLCBTV1QuTk9STUFMKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZWRUZXh0LnNldEZvbnQoZm9udCk7Ci0JCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXN0eWxlZFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJY29udHJvbHMgPSBuZXcgQ29udHJvbFsyXTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc3R5bGVkVGV4dCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIDEiKTsKLQkJY29udHJvbHNbMF0gPSBidXR0b247Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHN0eWxlZFRleHQsIFNXVC5OT05FKTsKLQkJY29tYm8uYWRkKCJpdGVtIDEiKTsKLQkJY29tYm8uYWRkKCJhbm90aGVyIGl0ZW0iKTsKLQkJY29udHJvbHNbMV0gPSBjb21ibzsKLQkJb2Zmc2V0cyA9IG5ldyBpbnRbY29udHJvbHMubGVuZ3RoXTsKLQkJaW50IGxhc3RPZmZzZXQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gdGV4dC5pbmRleE9mKCJcdUZGRkMiLCBsYXN0T2Zmc2V0KTsKLQkJCW9mZnNldHNbaV0gPSBvZmZzZXQ7Ci0JCQlhZGRDb250cm9sKGNvbnRyb2xzW2ldLCBvZmZzZXRzW2ldKTsKLQkJCWxhc3RPZmZzZXQgPSBvZmZzZXQgKyAxOwotCQl9Ci0JCQotCQkvLyB1c2UgYSB2ZXJpZnkgbGlzdGVuZXIgdG8ga2VlcCB0aGUgb2Zmc2V0cyB1cCB0byBkYXRlCi0JCXN0eWxlZFRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobmV3IFZlcmlmeUxpc3RlbmVyKCkgIHsKLQkJCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZSkgewotCQkJCWludCBzdGFydCA9IGUuc3RhcnQ7Ci0JCQkJaW50IHJlcGxhY2VDaGFyQ291bnQgPSBlLmVuZCAtIGUuc3RhcnQ7Ci0JCQkJaW50IG5ld0NoYXJDb3VudCA9IGUudGV4dC5sZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgc3RhcnQgKyByZXBsYWNlQ2hhckNvdW50KSB7Ci0JCQkJCQkvLyB0aGlzIHdpZGdldCBpcyBiZWluZyBkZWxldGVkIGZyb20gdGhlIHRleHQKLQkJCQkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsICYmICFjb250cm9sc1tpXS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQljb250cm9sc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCQkJY29udHJvbHNbaV0gPSBudWxsOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0ID0gLTE7Ci0JCQkJCX0KLQkJCQkJaWYgKG9mZnNldCAhPSAtMSAmJiBvZmZzZXQgPj0gc3RhcnQpIG9mZnNldCArPSBuZXdDaGFyQ291bnQgLSByZXBsYWNlQ2hhckNvdW50OwotCQkJCQlvZmZzZXRzW2ldID0gb2Zmc2V0OwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyByZXBvc2l0aW9uIHdpZGdldHMgb24gcGFpbnQgZXZlbnQKLQkJc3R5bGVkVGV4dC5hZGRQYWludE9iamVjdExpc3RlbmVyKG5ldyBQYWludE9iamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRPYmplY3RFdmVudCBldmVudCkgewotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZTsKLQkJCQlpbnQgc3RhcnQgPSBzdHlsZS5zdGFydDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50IG9mZnNldCA9IG9mZnNldHNbaV07Ci0JCQkJCWlmIChzdGFydCA9PSBvZmZzZXQpIHsKLQkJCQkJCVBvaW50IHB0ID0gY29udHJvbHNbaV0uZ2V0U2l6ZSgpOwotCQkJCQkJaW50IHggPSBldmVudC54ICsgTUFSR0lOOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgZXZlbnQuYXNjZW50IC0gMipwdC55LzM7Ci0JCQkJCQljb250cm9sc1tpXS5zZXRMb2NhdGlvbih4LCB5KTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCQotCQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDI0YTQwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTV1QgU3R5bGVkVGV4dCBzbmlwcGV0OiB1c2UgZ3JhZGllbnQgYmFja2dyb3VuZC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIxOCB7Ci0KLQlzdGF0aWMgU3RyaW5nIHRleHQgPSAiUGxhbnMgZG8gbm90IG1hdGVyaWFsaXplIG91dCBvZiBub3doZXJlLCBub3IgYXJlIHRoZXkgZW50aXJlbHkgc3RhdGljLiBUbyBlbnN1cmUgdGhlIHBsYW5uaW5nIHByb2Nlc3MgaXMgIiArCi0JCSJ0cmFuc3BhcmVudCBhbmQgb3BlbiB0byB0aGUgZW50aXJlIEVjbGlwc2UgY29tbXVuaXR5LCB3ZSAodGhlIEVjbGlwc2UgUE1DKSBwb3N0IHBsYW5zIGluIGFuIGVtYnJ5b25pYyAiKwotCQkiZm9ybSBhbmQgcmV2aXNlIHRoZW0gdGhyb3VnaG91dCB0aGUgcmVsZWFzZSBjeWNsZS4gXG4iKwotCQkiVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBsYW4gZGVhbHMgd2l0aCB0aGUgaW1wb3J0YW50IG1hdHRlcnMgb2YgcmVsZWFzZSBkZWxpdmVyYWJsZXMsIHJlbGVhc2UgbWlsZXN0b25lcywgdGFyZ2V0ICIrCi0JCSJvcGVyYXRpbmcgZW52aXJvbm1lbnRzLCBhbmQgcmVsZWFzZS10by1yZWxlYXNlIGNvbXBhdGliaWxpdHkuIFRoZXNlIGFyZSBhbGwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBjbGVhciBmb3IgIisKLQkJImFueSByZWxlYXNlLCBldmVuIGlmIG5vIGZlYXR1cmVzIHdlcmUgdG8gY2hhbmdlLiAgXG4iOwotCXN0YXRpYyBJbWFnZSBvbGRJbWFnZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVAgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHRleHQpOwotCQlGb250RGF0YSBkYXRhID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZGF0YS5nZXROYW1lKCksIDE2LCBTV1QuQk9MRCk7Ci0JCXN0eWxlZFRleHQuc2V0Rm9udChmb250KTsKLQkJc3R5bGVkVGV4dC5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKSk7Ci0JCXN0eWxlZFRleHQuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IHN0eWxlZFRleHQuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCQlJbWFnZSBuZXdJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMSwgTWF0aC5tYXggKDEsIHJlY3QuaGVpZ2h0KSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0MgKG5ld0ltYWdlKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfWUVMTE9XKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlIChyZWN0LngsIHJlY3QueSwgMSwgcmVjdC5oZWlnaHQsIHRydWUpOwotCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJc3R5bGVkVGV4dC5zZXRCYWNrZ3JvdW5kSW1hZ2UgKG5ld0ltYWdlKTsKLQkJCQlpZiAob2xkSW1hZ2UgIT0gbnVsbCkgb2xkSW1hZ2UuZGlzcG9zZSAoKTsKLQkJCQlvbGRJbWFnZSA9IG5ld0ltYWdlOwotCQkJfQotCQl9KTsJCi0JCXNoZWxsLnNldFNpemUoNzAwLCA0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWlmIChvbGRJbWFnZSAhPSBudWxsKSBvbGRJbWFnZS5kaXNwb3NlICgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM3NjA5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFJlZ2lvbiBzbmlwcGV0OiBDcmVhdGUgbm9uLXJlY3Rhbmd1bGFyIHNoZWxsIGZyb20gYW4gaW1hZ2Ugd2l0aCB0cmFuc3BhcmVuY3kKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjE5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgICAgICBmaW5hbCBJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotICAgICAgICBmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotICAgICAgICBSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotICAgICAgICBmaW5hbCBJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgIGlmIChpbWFnZURhdGEuYWxwaGFEYXRhICE9IG51bGwpIHsKLSAgICAgICAgCVJlY3RhbmdsZSBwaXhlbCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMSwgMSk7Ci0gICAgICAgIAlmb3IgKGludCB5ID0gMDsgeSA8IGltYWdlRGF0YS5oZWlnaHQ7IHkrKykgewotCSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgaW1hZ2VEYXRhLndpZHRoOyB4KyspIHsKLQkgICAgICAgICAgICAgICAgaWYgKGltYWdlRGF0YS5nZXRBbHBoYSh4LCB5KSA9PSAyNTUpIHsKLQkgICAgICAgICAgICAgICAgCXBpeGVsLnggPSBpbWFnZURhdGEueCArIHg7Ci0gICAgCQkJCQlwaXhlbC55ID0gaW1hZ2VEYXRhLnkgKyB5OwotCSAgICAgICAgICAgICAgICAgICAgcmVnaW9uLmFkZChwaXhlbCk7Ci0JICAgICAgICAgICAgICAgIH0gCi0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAJSW1hZ2VEYXRhIG1hc2sgPSBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotICAgICAgICAJUmVjdGFuZ2xlIHBpeGVsID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxLCAxKTsKLSAgICAJCWZvciAoaW50IHkgPSAwOyB5IDwgbWFzay5oZWlnaHQ7IHkrKykgewotICAgIAkJCWZvciAoaW50IHggPSAwOyB4IDwgbWFzay53aWR0aDsgeCsrKSB7Ci0gICAgCQkJCWlmIChtYXNrLmdldFBpeGVsKHgsIHkpICE9IDApIHsKLSAgICAJCQkJCXBpeGVsLnggPSBpbWFnZURhdGEueCArIHg7Ci0gICAgCQkJCQlwaXhlbC55ID0gaW1hZ2VEYXRhLnkgKyB5OwotICAgIAkJCQkJcmVnaW9uLmFkZChwaXhlbCk7Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgICAgIH0KLSAgICAgICAgc2hlbGwuc2V0UmVnaW9uKHJlZ2lvbik7Ci0KLSAgICAgICAgTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgCWludCBzdGFydFgsIHN0YXJ0WTsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpICB7Ci0gICAgICAgICAgICAJaWYgKGUudHlwZSA9PSBTV1QuS2V5RG93biAmJiBlLmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7Ci0gICAgICAgICAgICAJCXNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIAl9Ci0JCQkJaWYgKGUudHlwZSA9PSBTV1QuTW91c2VEb3duICYmIGUuYnV0dG9uID09IDEpIHsKLQkJCQkJc3RhcnRYID0gZS54OwotCQkJCQlzdGFydFkgPSBlLnk7IAotCQkJCX0KLQkJCQlpZiAoZS50eXBlID09IFNXVC5Nb3VzZU1vdmUgJiYgKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpICE9IDApIHsKLQkJCQkJUG9pbnQgcCA9IHNoZWxsLnRvRGlzcGxheShlLngsIGUueSk7Ci0JCQkJCXAueCAtPSBzdGFydFg7Ci0JCQkJCXAueSAtPSBzdGFydFk7Ci0JCQkJCXNoZWxsLnNldExvY2F0aW9uKHApOwotCQkJCX0KLQkJCQlpZiAoZS50eXBlID09IFNXVC5QYWludCkgewotCQkJCQllLmdjLmRyYXdJbWFnZShpbWFnZSwgaW1hZ2VEYXRhLngsIGltYWdlRGF0YS55KTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNoZWxsLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBsKTsKLSAgICAgICAgc2hlbGwuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG93biwgbCk7Ci0gICAgICAgIHNoZWxsLmFkZExpc3RlbmVyKFNXVC5Nb3VzZU1vdmUsIGwpOwotICAgICAgICBzaGVsbC5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIGwpOwotCi0gICAgICAgIHNoZWxsLnNldFNpemUoaW1hZ2VEYXRhLnggKyBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS55ICsgaW1hZ2VEYXRhLmhlaWdodCk7Ci0gICAgICAgIHNoZWxsLm9wZW4gKCk7Ci0gICAgICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnNsZWVwICgpOwotICAgICAgICB9Ci0gICAgICAgIHJlZ2lvbi5kaXNwb3NlKCk7Ci0gICAgICAgIGltYWdlLmRpc3Bvc2UgKCk7Ci0gICAgICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjViNWJhLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRleHQgZXhhbXBsZSBzbmlwcGV0OiBzZWxlY3QgYWxsIHRoZSB0ZXh0IGluIHRoZSBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCAwKTsKLQl0ZXh0LnNldFRleHQgKCJBU0RGIik7Ci0JdGV4dC5zZXRTaXplICg2NCwgMzIpOwotCXRleHQuc2VsZWN0QWxsICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTE0YjdlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogSW1hZ2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBUcmVlSXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjIwIHsJCi0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgSW1hZ2UgaW1hZ2UgPSBkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX0lORk9STUFUSU9OKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJJbWFnZXMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIFRyZWVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUcmVlIHRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0cmVlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CQkJCi0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gMzsKLQlmb3IgKGludCBpPTA7IGk8aXRlbUNvdW50OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbTEgPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtMS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWZvciAoaW50IGM9MTsgYyA8IGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCWl0ZW0xLnNldFRleHQoYywgIml0ZW0gWyIraSsiLSIrYysiXSIpOwotCQl9Ci0JCWZvciAoaW50IGo9MDsgajxpdGVtQ291bnQ7IGorKykgewotCQkJVHJlZUl0ZW0gaXRlbTIgPSBuZXcgVHJlZUl0ZW0oaXRlbTEsIFNXVC5OT05FKTsKLQkJCWl0ZW0yLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiXSIpOwotCQkJZm9yIChpbnQgYz0xOyBjPGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCQlpdGVtMi5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIi0iK2MrIl0iKTsKLQkJCX0KLQkJCWZvciAoaW50IGs9MDsgazxpdGVtQ291bnQ7IGsrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0zID0gbmV3IFRyZWVJdGVtKGl0ZW0yLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbTMuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyIgIitrKyJdIik7Ci0JCQkJZm9yIChpbnQgYz0xOyBjPGNvbHVtbkNvdW50OyBjKyspIHsKLQkJCQkJaXRlbTMuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyIgIitrKyItIitjKyJdIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsJCQkKLQkJCXN3aXRjaChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQkJZXZlbnQud2lkdGggKz0gcmVjdC53aWR0aDsKLQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCByZWN0LmhlaWdodCArIDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCWludCB4ID0gZXZlbnQueCArIGV2ZW50LndpZHRoOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIGV2ZW50LnkgKyBvZmZzZXQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwkJCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuTWVhc3VyZUl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgcGFpbnRMaXN0ZW5lcik7CQkKLQotCWZvcihpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9CQotCXNoZWxsLnNldFNpemUoNTAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZihpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDllNTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogU2Nyb2xsIHRhYmxlIHdoZW4gbW91c2UgYXQgdG9wIG9yIGJvdHRvbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMSB7Ci0Jc3RhdGljIFJ1bm5hYmxlIEhlYXJ0YmVhdDsKLQlzdGF0aWMgYm9vbGVhbiBUcmFja2luZzsKLQlzdGF0aWMgaW50IFNjcm9sbFNwZWVkID0gNDA7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMC5zZXRUZXh0KCJDb2x1bW4gMCIpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4xLnNldFRleHQoIkNvbHVtbiAxIik7Ci0JVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjIuc2V0VGV4dCgiQ29sdW1uIDIiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDk7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIraSk7Ci0JCWl0ZW0uc2V0VGV4dCgxLCAiY29sdW1uIDEgLSAiK2kpOwotCQlpdGVtLnNldFRleHQoMiwgImNvbHVtbiAyIC0gIitpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCA5OyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraik7Ci0JCQlzdWJJdGVtLnNldFRleHQoMSwgImNvbHVtbiAxIC0gIitpKyIgIitqKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgyLCAiY29sdW1uIDIgLSAiK2krIiAiK2opOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA5OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBzdWJzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHN1Ykl0ZW0sIFNXVC5OT05FKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoIml0ZW0gIitpKyIgIitqKyIgIitrKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoMSwgImNvbHVtbiAxIC0gIitpKyIgIitqKyIgIitrKTsKLQkJCQlzdWJzdWJJdGVtLnNldFRleHQoMiwgImNvbHVtbiAyIC0gIitpKyIgIitqKyIgIitrKTsKLQkJCX0KLQkJfQotCX0KLQljb2x1bW4wLnBhY2soKTsKLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQkKLQlIZWFydGJlYXQgPSBuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghVHJhY2tpbmcgfHwgdHJlZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCVBvaW50IGN1cnNvciA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24oKTsKLQkJCWN1cnNvciA9IGRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGN1cnNvcik7Ci0JCQlTY3JvbGwodHJlZSwgY3Vyc29yLngsIGN1cnNvci55KTsKLQkJCWRpc3BsYXkudGltZXJFeGVjKFNjcm9sbFNwZWVkLCBIZWFydGJlYXQpOwotCQl9Ci0JfTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSBTV1QuTW91c2VFbnRlcjoKLQkJCQlUcmFja2luZyA9IHRydWU7Ci0JCQkJZGlzcGxheS50aW1lckV4ZWMoMCwgSGVhcnRiZWF0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULk1vdXNlRXhpdDoKLQkJCQlUcmFja2luZyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZUVudGVyLCBsaXN0ZW5lcik7IAotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1vdXNlRXhpdCwgbGlzdGVuZXIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotc3RhdGljIHZvaWQgU2Nyb2xsKFRyZWUgdHJlZSwgaW50IHgsIGludCB5KSB7Ci0JVHJlZUl0ZW0gaXRlbSA9IHRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoeCwgeSkpOwotCWlmIChpdGVtID09IG51bGwpIHJldHVybjsKLQlSZWN0YW5nbGUgYXJlYSA9IHRyZWUuZ2V0Q2xpZW50QXJlYSgpOwotCWludCBoZWFkZXJIZWlnaHQgPSB0cmVlLmdldEhlYWRlckhlaWdodCgpOwotCWludCBpdGVtSGVpZ2h0PSB0cmVlLmdldEl0ZW1IZWlnaHQoKTsKLQlUcmVlSXRlbSBuZXh0SXRlbSA9IG51bGw7Ci0JaWYgKHkgPCBhcmVhLnkgKyBoZWFkZXJIZWlnaHQgKyAyICogaXRlbUhlaWdodCkgewotCQluZXh0SXRlbSA9IFByZXZpb3VzSXRlbSh0cmVlLCBpdGVtKTsKLQl9Ci0JaWYgKHkgPiBhcmVhLnkgKyBhcmVhLmhlaWdodCAtIDIgKiBpdGVtSGVpZ2h0KSB7Ci0JCW5leHRJdGVtID0gTmV4dEl0ZW0odHJlZSwgaXRlbSk7Ci0JfQotCWlmIChuZXh0SXRlbSAhPSBudWxsKSB0cmVlLnNob3dJdGVtKG5leHRJdGVtKTsKLX0KLQotc3RhdGljIFRyZWVJdGVtIFByZXZpb3VzSXRlbShUcmVlIHRyZWUsIFRyZWVJdGVtIGl0ZW0pIHsKLQlpZiAoaXRlbSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQlUcmVlSXRlbSBjaGlsZEl0ZW0gPSBpdGVtOwotCVRyZWVJdGVtIHBhcmVudEl0ZW0gPSBjaGlsZEl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCWludCBpbmRleCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuaW5kZXhPZihjaGlsZEl0ZW0pIDogcGFyZW50SXRlbS5pbmRleE9mKGNoaWxkSXRlbSk7Ci0JaWYgKGluZGV4ID09IDApIHsKLQkJcmV0dXJuIHBhcmVudEl0ZW07Ci0JfSBlbHNlIHsKLQkJVHJlZUl0ZW0gbmV4dEl0ZW0gPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmdldEl0ZW0oaW5kZXgtMSkgOiBwYXJlbnRJdGVtLmdldEl0ZW0oaW5kZXgtMSk7Ci0JCWludCBjb3VudCA9IG5leHRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQl3aGlsZSAoY291bnQgPiAwICYmIG5leHRJdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJCW5leHRJdGVtID0gbmV4dEl0ZW0uZ2V0SXRlbShjb3VudCAtIDEpOwotCQkJY291bnQgPSBuZXh0SXRlbS5nZXRJdGVtQ291bnQoKTsKLQkJfQotCQlyZXR1cm4gbmV4dEl0ZW07Ci0JfQotfQotc3RhdGljIFRyZWVJdGVtIE5leHRJdGVtKFRyZWUgdHJlZSwgVHJlZUl0ZW0gaXRlbSkgewotCWlmIChpdGVtID09IG51bGwpIHJldHVybiBudWxsOwotCWlmIChpdGVtLmdldEV4cGFuZGVkKCkpIHsKLQkJcmV0dXJuIGl0ZW0uZ2V0SXRlbSgwKTsKLQl9IGVsc2UgewotCQlUcmVlSXRlbSBjaGlsZEl0ZW0gPSBpdGVtOwotCQlUcmVlSXRlbSBwYXJlbnRJdGVtID0gY2hpbGRJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJaW50IGluZGV4ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5pbmRleE9mKGNoaWxkSXRlbSkgOiBwYXJlbnRJdGVtLmluZGV4T2YoY2hpbGRJdGVtKTsKLQkJaW50IGNvdW50ID0gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtQ291bnQoKSA6IHBhcmVudEl0ZW0uZ2V0SXRlbUNvdW50KCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoaW5kZXggKyAxIDwgY291bnQpIHsKLQkJCQlyZXR1cm4gcGFyZW50SXRlbSA9PSBudWxsID8gdHJlZS5nZXRJdGVtKGluZGV4ICsgMSkgOiBwYXJlbnRJdGVtLmdldEl0ZW0oaW5kZXggKyAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBhcmVudEl0ZW0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQljaGlsZEl0ZW0gPSBwYXJlbnRJdGVtOwotCQkJCQlwYXJlbnRJdGVtID0gY2hpbGRJdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQkJaW5kZXggPSBwYXJlbnRJdGVtID09IG51bGwgPyB0cmVlLmluZGV4T2YoY2hpbGRJdGVtKSA6IHBhcmVudEl0ZW0uaW5kZXhPZihjaGlsZEl0ZW0pOwotCQkJCQljb3VudCA9IHBhcmVudEl0ZW0gPT0gbnVsbCA/IHRyZWUuZ2V0SXRlbUNvdW50KCkgOiBwYXJlbnRJdGVtLmdldEl0ZW1Db3VudCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5OTM4NS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBleGFtcGxlIHNuaXBwZXQ6IFN0eWxlZFRleHQgYnVsbGV0ZWQgbGlzdCBleGFtcGxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjIyIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsJCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJTdHlsZWRUZXh0IEJ1bGxldCBFeGFtcGxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0IChzaGVsbCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl0ZXh0LmFwcGVuZCgiSGVyZSBpcyBTdHlsZWRUZXh0IHdpdGggc29tZSBidWxsZXRlZCBsaXN0czpcblxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHRleHQuYXBwZW5kKCJSZWQgQnVsbGV0IExpc3QgSXRlbSAiICsgaSArICJcbiIpOwotCXRleHQuYXBwZW5kKCJcbiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB0ZXh0LmFwcGVuZCgiTnVtYmVyZWQgTGlzdCBJdGVtICIgKyBpICsgIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHRleHQuYXBwZW5kKCJTdWIgTGlzdCBJdGVtICIgKyBpICsgIlxuIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHRleHQuYXBwZW5kKCJOdW1iZXJlZCBMaXN0IEl0ZW0gIiArICgyICsgaSkgKyAiXG4iKTsKLQl0ZXh0LmFwcGVuZCgiXG4iKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgdGV4dC5hcHBlbmQoIkN1c3RvbSBEcmF3IExpc3QgSXRlbSAiICsgaSArICJcbiIpOwkKLQlzdHlsZWRUZXh0LnNldFRleHQodGV4dC50b1N0cmluZygpKTsKLQkJCi0JU3R5bGVSYW5nZSBzdHlsZTAgPSBuZXcgU3R5bGVSYW5nZSgpOwotCXN0eWxlMC5tZXRyaWNzID0gbmV3IEdseXBoTWV0cmljcygwLCAwLCA0MCk7Ci0Jc3R5bGUwLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUJ1bGxldCBidWxsZXQwID0gbmV3IEJ1bGxldCAoc3R5bGUwKTsKLQlTdHlsZVJhbmdlIHN0eWxlMSA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUxLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDUwKTsKLQlzdHlsZTEuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCUJ1bGxldCBidWxsZXQxID0gbmV3IEJ1bGxldCAoU1QuQlVMTEVUX05VTUJFUiB8IFNULkJVTExFVF9URVhULCBzdHlsZTEpOwotCWJ1bGxldDEudGV4dCA9ICIuIjsKLQlTdHlsZVJhbmdlIHN0eWxlMiA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0Jc3R5bGUyLm1ldHJpY3MgPSBuZXcgR2x5cGhNZXRyaWNzKDAsIDAsIDgwKTsKLQlzdHlsZTIuZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKTsKLQlCdWxsZXQgYnVsbGV0MiA9IG5ldyBCdWxsZXQgKFNULkJVTExFVF9URVhULCBzdHlsZTIpOwotCWJ1bGxldDIudGV4dCA9ICJcdTI3MTMiOwotCVN0eWxlUmFuZ2Ugc3R5bGUzID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZTMubWV0cmljcyA9IG5ldyBHbHlwaE1ldHJpY3MoMCwgMCwgNTApOwotCUJ1bGxldCBidWxsZXQzID0gbmV3IEJ1bGxldCAoU1QuQlVMTEVUX0NVU1RPTSwgc3R5bGUyKTsKLQotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCgyLCA0LCBidWxsZXQwKTsKLQlzdHlsZWRUZXh0LnNldExpbmVCdWxsZXQoNywgMiwgYnVsbGV0MSk7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDksIDQsIGJ1bGxldDIpOwotCXN0eWxlZFRleHQuc2V0TGluZUJ1bGxldCgxMywgMiwgYnVsbGV0MSk7Ci0Jc3R5bGVkVGV4dC5zZXRMaW5lQnVsbGV0KDE2LCA0LCBidWxsZXQzKTsKLQotCXN0eWxlZFRleHQuYWRkUGFpbnRPYmplY3RMaXN0ZW5lcihuZXcgUGFpbnRPYmplY3RMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRPYmplY3QoUGFpbnRPYmplY3RFdmVudCBldmVudCkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gZXZlbnQuZGlzcGxheTsKLQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBldmVudC5zdHlsZTsKLQkJCUZvbnQgZm9udCA9IHN0eWxlLmZvbnQ7Ci0JCQlpZiAoZm9udCA9PSBudWxsKSBmb250ID0gc3R5bGVkVGV4dC5nZXRGb250KCk7Ci0JCQlUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCQkJbGF5b3V0LnNldEFzY2VudChldmVudC5hc2NlbnQpOwotCQkJbGF5b3V0LnNldERlc2NlbnQoZXZlbnQuZGVzY2VudCk7Ci0JCQlsYXlvdXQuc2V0Rm9udChmb250KTsKLQkJCWxheW91dC5zZXRUZXh0KCJcdTIwMjMgMS4iICsgZXZlbnQuYnVsbGV0SW5kZXggKyAiKSIpOwotCQkJbGF5b3V0LmRyYXcoZXZlbnQuZ2MsIGV2ZW50LnggKyAxMCwgZXZlbnQueSk7Ci0JCQlsYXlvdXQuZGlzcG9zZSgpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODQ0ZDIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogRXhwYW5kQmFyIGV4YW1wbGUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyMyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0Jc2hlbGwuc2V0VGV4dCgiRXhwYW5kQmFyIEV4YW1wbGUiKTsKLQlFeHBhbmRCYXIgYmFyID0gbmV3IEV4cGFuZEJhciAoc2hlbGwsIFNXVC5WX1NDUk9MTCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgU25pcHBldDIyMy5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlY2xpcHNlLnBuZyIpKTsgCi0JCi0JLy8gRmlyc3QgaXRlbQotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0ICgpOwotCWxheW91dC5tYXJnaW5MZWZ0ID0gbGF5b3V0Lm1hcmdpblRvcCA9IGxheW91dC5tYXJnaW5SaWdodCA9IGxheW91dC5tYXJnaW5Cb3R0b20gPSAxMDsKLQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlBVU0giKTsKLQlidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JYnV0dG9uLnNldFRleHQoIlNXVC5SQURJTyIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24gKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULkNIRUNLIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbiAoY29tcG9zaXRlLCBTV1QuVE9HR0xFKTsKLQlidXR0b24uc2V0VGV4dCgiU1dULlRPR0dMRSIpOwotCUV4cGFuZEl0ZW0gaXRlbTAgPSBuZXcgRXhwYW5kSXRlbSAoYmFyLCBTV1QuTk9ORSwgMCk7Ci0JaXRlbTAuc2V0VGV4dCgiV2hhdCBpcyB5b3VyIGZhdm9yaXRlIGJ1dHRvbiIpOwotCWl0ZW0wLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMC5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTAuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCS8vIFNlY29uZCBpdGVtCi0JY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAoYmFyLCBTV1QuTk9ORSk7Ci0JbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQgKDIsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luTGVmdCA9IGxheW91dC5tYXJnaW5Ub3AgPSBsYXlvdXQubWFyZ2luUmlnaHQgPSBsYXlvdXQubWFyZ2luQm90dG9tID0gMTA7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldEltYWdlKGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fRVJST1IiKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0SW1hZ2UoZGlzcGxheS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTikpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0KCJTV1QuSUNPTl9JTkZPUk1BVElPTiIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpKTsKLQlsYWJlbCA9IG5ldyBMYWJlbCAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiU1dULklDT05fV0FSTklORyIpOwotCWxhYmVsID0gbmV3IExhYmVsIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRJbWFnZShkaXNwbGF5LmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1FVRVNUSU9OKSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNXVC5JQ09OX1FVRVNUSU9OIik7Ci0JRXhwYW5kSXRlbSBpdGVtMSA9IG5ldyBFeHBhbmRJdGVtIChiYXIsIFNXVC5OT05FLCAxKTsKLQlpdGVtMS5zZXRUZXh0KCJXaGF0IGlzIHlvdXIgZmF2b3JpdGUgaWNvbiIpOwotCWl0ZW0xLnNldEhlaWdodChjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLQlpdGVtMS5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JaXRlbTEuc2V0SW1hZ2UoaW1hZ2UpOwotCQotCS8vIFRoaXJkIGl0ZW0KLQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChiYXIsIFNXVC5OT05FKTsKLQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCAoMiwgdHJ1ZSk7Ci0JbGF5b3V0Lm1hcmdpbkxlZnQgPSBsYXlvdXQubWFyZ2luVG9wID0gbGF5b3V0Lm1hcmdpblJpZ2h0ID0gbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNjYWxlIik7CQotCW5ldyBTY2FsZSAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNwaW5uZXIiKTsJCi0JbmV3IFNwaW5uZXIgKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JbGFiZWwgPSBuZXcgTGFiZWwgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQoIlNsaWRlciIpOwkKLQluZXcgU2xpZGVyIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlFeHBhbmRJdGVtIGl0ZW0yID0gbmV3IEV4cGFuZEl0ZW0gKGJhciwgU1dULk5PTkUsIDIpOwotCWl0ZW0yLnNldFRleHQoIldoYXQgaXMgeW91ciBmYXZvcml0ZSByYW5nZSB3aWRnZXQiKTsKLQlpdGVtMi5zZXRIZWlnaHQoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0JaXRlbTIuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCWl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQkKLQlpdGVtMS5zZXRFeHBhbmRlZCh0cnVlKTsKLQliYXIuc2V0U3BhY2luZyg4KTsKLQlzaGVsbC5zZXRTaXplKDQwMCwgMzUwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIHsKLQkJCWRpc3BsYXkuc2xlZXAgKCk7Ci0JCX0KLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTA4N2UuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIGltcGxlbWVudCByYWRpbyBiZWhhdmlvciBmb3Igc2V0U2VsZWN0aW9uKCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIyNCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0IChTV1QuVkVSVElDQUwpKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQgKCJCIiArIGkpOwotCQlpZiAoaSA9PSAwKSBidXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQl9Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQgKCJTZXQgU2VsZWN0aW9uIHRvIEI0Iik7Ci0JYnV0dG9uLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCUNvbnRyb2wgW10gY2hpbGRyZW4gPSBzaGVsbC5nZXRDaGlsZHJlbiAoKTsKLQkJCUJ1dHRvbiBuZXdCdXR0b24gPSAoQnV0dG9uKSBjaGlsZHJlbiBbNF07Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2ldOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEJ1dHRvbiAmJiAoY2hpbGQuZ2V0U3R5bGUgKCkgJiBTV1QuUkFESU8pICE9IDApIHsKLQkJCQkJKChCdXR0b24pIGNoaWxkKS5zZXRTZWxlY3Rpb24gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQluZXdCdXR0b24uc2V0U2VsZWN0aW9uICh0cnVlKTsKLQkJfQotCX0pOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliMzcwNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotICAKLS8qCi0gKiBUb29sdGlwIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgYmFsbG9vbiB0b29sdGlwIGZvciBhIHRyYXkgaXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCWZpbmFsIFRvb2xUaXAgdGlwID0gbmV3IFRvb2xUaXAoc2hlbGwsIFNXVC5CQUxMT09OIHwgU1dULklDT05fSU5GT1JNQVRJT04pOwotCXRpcC5zZXRNZXNzYWdlKCJIZXJlIGlzIGEgbWVzc2FnZSBmb3IgdGhlIHVzZXIuIFdoZW4gdGhlIG1lc3NhZ2UgaXMgdG9vIGxvbmcgaXQgd3JhcHMuIEkgc2hvdWxkIHNheSBzb21ldGhpbmcgY29vbCBidXQgbm90aGluZyBjb21lcyB0byBteSBtaW5kLiIpOwotCVRyYXkgdHJheSA9IGRpc3BsYXkuZ2V0U3lzdGVtVHJheSgpOwotCWlmICh0cmF5ICE9IG51bGwpIHsKLQkJVHJheUl0ZW0gaXRlbSA9IG5ldyBUcmF5SXRlbSh0cmF5LCBTV1QuTk9ORSk7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIFNuaXBwZXQyMjUuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZWNsaXBzZS5wbmciKSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCQl0aXAuc2V0VGV4dCgiTm90aWZpY2F0aW9uIGZyb20gYSB0cmF5IGl0ZW0iKTsKLQkJaXRlbS5zZXRUb29sVGlwKHRpcCk7Ci0JfSBlbHNlIHsKLQkJdGlwLnNldFRleHQoIk5vdGlmaWNhdGlvbiBmcm9tIGFueXdoZXJlIik7Ci0JCXRpcC5zZXRMb2NhdGlvbig0MDAsIDQwMCk7Ci0JfQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQcmVzcyBmb3IgYmFsbG9vbiB0aXAiKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJdGlwLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0KLQl9KTsKLQlidXR0b24ucGFjaygpOwotCXNoZWxsLnNldEJvdW5kcyg1MCwgNTAsIDMwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTI2NjAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IERyYXcgYSBjdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMjYgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkN1c3RvbSBncmFkaWVudCBzZWxlY3Rpb24gZm9yIFRyZWUiKTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRyZWUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDM7Ci0JZm9yIChpbnQgaT0wOyBpPGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbTEuc2V0VGV4dCgiaXRlbSAiK2kpOwotCQlmb3IgKGludCBjPTE7IGMgPCBjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQlpdGVtMS5zZXRUZXh0KGMsICJpdGVtIFsiK2krIi0iK2MrIl0iKTsKLQkJfQotCQlmb3IgKGludCBqPTA7IGo8aXRlbUNvdW50OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0yID0gbmV3IFRyZWVJdGVtKGl0ZW0xLCBTV1QuTk9ORSk7Ci0JCQlpdGVtMi5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIl0iKTsKLQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJaXRlbTIuc2V0VGV4dChjLCAiaXRlbSBbIitpKyIgIitqKyItIitjKyJdIik7Ci0JCQl9Ci0JCQlmb3IgKGludCBrPTA7IGs8aXRlbUNvdW50OyBrKyspIHsKLQkJCQlUcmVlSXRlbSBpdGVtMyA9IG5ldyBUcmVlSXRlbShpdGVtMiwgU1dULk5PTkUpOwotCQkJCWl0ZW0zLnNldFRleHQoIml0ZW0gWyIraSsiICIraisiICIraysiXSIpOwotCQkJCWZvciAoaW50IGM9MTsgYzxjb2x1bW5Db3VudDsgYysrKSB7Ci0JCQkJCWl0ZW0zLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiICIraysiLSIrYysiXSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdHJlZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQkJCi0JCQlpZiAoKGV2ZW50LmRldGFpbCAmIFNXVC5TRUxFQ1RFRCkgIT0gMCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0cmVlLmdldENsaWVudEFyZWEoKTsKLQkJCQkvKgotCQkJCSAqIElmIHlvdSB3aXNoIHRvIHBhaW50IHRoZSBzZWxlY3Rpb24gYmV5b25kIHRoZSBlbmQgb2YKLQkJCQkgKiBsYXN0IGNvbHVtbiwgeW91IG11c3QgY2hhbmdlIHRoZSBjbGlwcGluZyByZWdpb24uCi0JCQkJICovCi0JCQkJaW50IGNvbHVtbkNvdW50ID0gdHJlZS5nZXRDb2x1bW5Db3VudCgpOwotCQkJCWlmIChldmVudC5pbmRleCA9PSBjb2x1bW5Db3VudCAtIDEgfHwgY29sdW1uQ291bnQgPT0gMCkgewotCQkJCQlpbnQgd2lkdGggPSBhcmVhLnggKyBhcmVhLndpZHRoIC0gZXZlbnQueDsKLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKLQkJCQkJCWdjLmdldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uYWRkKGV2ZW50LngsIGV2ZW50LnksIHdpZHRoLCBldmVudC5oZWlnaHQpOyAKLQkJCQkJCWdjLnNldENsaXBwaW5nKHJlZ2lvbik7Ci0JCQkJCQlyZWdpb24uZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLnNldEFkdmFuY2VkKHRydWUpOwotCQkJCWlmIChnYy5nZXRBZHZhbmNlZCgpKSBnYy5zZXRBbHBoYSgxMjcpOwkJCQkJCQkJCi0JCQkJUmVjdGFuZ2xlIHJlY3QgPSBldmVudC5nZXRCb3VuZHMoKTsKLQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCUNvbG9yIGJhY2tncm91bmQgPSBnYy5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCByZWN0LnksIDUwMCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCQkvLyByZXN0b3JlIGNvbG9ycyBmb3Igc3Vic2VxdWVudCBkcmF3aW5nCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9CQkJCQkJCi0JCX0KLQl9KTsJCQotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRyZWUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9CQotCXRyZWUuc2V0U2VsZWN0aW9uKHRyZWUuZ2V0SXRlbSgwKSk7Ci0Jc2hlbGwuc2V0U2l6ZSg1MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsJCi19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFiNThmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogTXVsdGlwbGUgbGluZXMgaW4gYSBUcmVlSXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI3IHsJCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIk11bHRpcGxlIGxpbmVzIGluIGEgVHJlZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSA0OwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsKLQkJY29sdW1uLnNldFdpZHRoKDEwMCk7Ci0JfQotCWludCBpdGVtQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtMSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0xLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgYz0xOyBjIDwgY29sdW1uQ291bnQ7IGMrKykgewotCQkJaXRlbTEuc2V0VGV4dChjLCAiaXRlbSBbIitpKyItIitjKyJdIik7Ci0JCX0KLQkJZm9yIChpbnQgaj0wOyBqPGl0ZW1Db3VudDsgaisrKSB7Ci0JCQlUcmVlSXRlbSBpdGVtMiA9IG5ldyBUcmVlSXRlbShpdGVtMSwgU1dULk5PTkUpOwotCQkJaXRlbTIuc2V0VGV4dCgiaXRlbSBbIitpKyIgIitqKyJdIik7Ci0JCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCWl0ZW0yLnNldFRleHQoYywgIml0ZW0gWyIraSsiICIraisiLSIrYysiXSIpOwotCQkJfQotCQkJZm9yIChpbnQgaz0wOyBrPGl0ZW1Db3VudDsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbTMgPSBuZXcgVHJlZUl0ZW0oaXRlbTIsIFNXVC5OT05FKTsKLQkJCQlpdGVtMy5zZXRUZXh0KCJpdGVtIFsiK2krIiAiK2orIiAiK2srIl0iKTsKLQkJCQlmb3IgKGludCBjPTE7IGM8Y29sdW1uQ291bnQ7IGMrKykgewotCQkJCQlpdGVtMy5zZXRUZXh0KGMsICJpdGVtIFsiK2krIiAiK2orIiAiK2srIi0iK2MrIl0iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSlldmVudC5pdGVtOwotCQkJCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoaXRlbSwgZXZlbnQuaW5kZXgpOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsKLQkJCQkJZXZlbnQud2lkdGggPSBzaXplLng7Ci0JCQkJCWV2ZW50LmhlaWdodCA9IE1hdGgubWF4KGV2ZW50LmhlaWdodCwgc2l6ZS55KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgU1dULlBhaW50SXRlbTogewotCQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChpdGVtLCBldmVudC5pbmRleCk7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwkJCQkJCi0JCQkJCWludCBvZmZzZXQyID0gZXZlbnQuaW5kZXggPT0gMCA/IE1hdGgubWF4KDAsIChldmVudC5oZWlnaHQgLSBzaXplLnkpIC8gMikgOiAwOwotCQkJCQlldmVudC5nYy5kcmF3VGV4dCh0ZXh0LCBldmVudC54LCBldmVudC55ICsgb2Zmc2V0MiwgdHJ1ZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5FcmFzZUl0ZW06IHsJCi0JCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULkZPUkVHUk9VTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgZ2V0VGV4dChUcmVlSXRlbSBpdGVtLCBpbnQgY29sdW1uKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGl0ZW0uZ2V0VGV4dChjb2x1bW4pOwotCQkJaWYgKGNvbHVtbiAhPSAwKSB7Ci0JCQkJVHJlZUl0ZW0gcGFyZW50ID0gaXRlbS5nZXRQYXJlbnRJdGVtKCk7Ci0JCQkJaW50IGluZGV4ID0gcGFyZW50ID09IG51bGwgPyB0cmVlLmluZGV4T2YoaXRlbSkgOiBwYXJlbnQuaW5kZXhPZihpdGVtKTsKLQkJCQlpZiAoKGluZGV4K2NvbHVtbikgJSAzID09IDEpewotCQkJCQl0ZXh0ICs9IlxubmV3IGxpbmUiOwotCQkJCX0KLQkJCQlpZiAoKGluZGV4K2NvbHVtbikgJSAzID09IDIpIHsKLQkJCQkJdGV4dCArPSJcbm5ldyBsaW5lXG5uZXcgbGluZSI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQl9OwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgcGFpbnRMaXN0ZW5lcik7Ci0KLQlzaGVsbC5zZXRTaXplKDYwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyODcxMC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogRHJhdyBhIGJhciBncmFwaAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI4IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsJCQotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5zZXRUZXh0KCJTaG93IHJlc3VsdHMgYXMgYSBiYXIgY2hhcnQgaW4gVGFibGUiKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkJPUkRFUik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiQnVnIFN0YXR1cyIpOwotCWNvbHVtbjEuc2V0V2lkdGgoMTAwKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMi5zZXRUZXh0KCJQZXJjZW50Iik7Ci0JY29sdW1uMi5zZXRXaWR0aCgyMDApOwotCVN0cmluZ1tdIGxhYmVscyA9IG5ldyBTdHJpbmdbXXsiUmVzb2x2ZWQiLCAiTmV3IiwgIldvbid0IEZpeCIsICJJbnZhbGlkIn07Ci0JZm9yIChpbnQgaT0wOyBpPGxhYmVscy5sZW5ndGg7IGkrKykgewotCQkgVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCSBpdGVtLnNldFRleHQobGFiZWxzW2ldKTsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJaW50W10gcGVyY2VudHMgPSBuZXcgaW50W10gezUwLCAzMCwgNSwgMTV9OwotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmluZGV4ID09IDEpIHsKLQkJCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQkJaW50IHBlcmNlbnQgPSBwZXJjZW50c1tpbmRleF07Ci0JCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9ZRUxMT1cpKTsKLQkJCQlpbnQgd2lkdGggPSAoY29sdW1uMi5nZXRXaWR0aCgpIC0gMSkgKiBwZXJjZW50IC8gMTAwOwotCQkJCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aCwgZXZlbnQuaGVpZ2h0LCB0cnVlKTsJCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgtMSwgZXZlbnQuaGVpZ2h0LTEpOwotCQkJCWdjLmRyYXdSZWN0YW5nbGUocmVjdDIpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBwZXJjZW50KyIlIjsKLQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsJCQkJCQotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpOwotCQkJCWdjLmRyYXdUZXh0KHRleHQsIGV2ZW50LngrMiwgZXZlbnQueStvZmZzZXQsIHRydWUpOwotCQkJCWdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJZ2Muc2V0QmFja2dyb3VuZChmb3JlZ3JvdW5kKTsKLQkJCX0KLQkJfQotCX0pOwkJCi0JCQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIyOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzMyOTBjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMjkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGEgY3VzdG9tIGdyYWRpZW50IHNlbGVjdGlvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjI5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJDdXN0b20gZ3JhZGllbnQgc2VsZWN0aW9uIGZvciBUYWJsZSIpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlpbnQgY29sdW1uQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gIitpKyIgYSIsICJpdGVtICIraSsiIGIiLCAiaXRlbSAiK2krIiBjIn0pOwotCX0JCQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULkVyYXNlSXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewkJCQotCQkJaWYoKGV2ZW50LmRldGFpbCAmIFNXVC5TRUxFQ1RFRCkgIT0gMCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0YWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJLyoKLQkJCQkgKiBJZiB5b3Ugd2lzaCB0byBwYWludCB0aGUgc2VsZWN0aW9uIGJleW9uZCB0aGUgZW5kIG9mCi0JCQkJICogbGFzdCBjb2x1bW4sIHlvdSBtdXN0IGNoYW5nZSB0aGUgY2xpcHBpbmcgcmVnaW9uLgotCQkJCSAqLwotCQkJCWludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JCQkJaWYgKGV2ZW50LmluZGV4ID09IGNvbHVtbkNvdW50IC0gMSB8fCBjb2x1bW5Db3VudCA9PSAwKSB7Ci0JCQkJCWludCB3aWR0aCA9IGFyZWEueCArIGFyZWEud2lkdGggLSBldmVudC54OwotCQkJCQlpZiAod2lkdGggPiAwKSB7Ci0JCQkJCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbigpOwotCQkJCQkJZ2MuZ2V0Q2xpcHBpbmcocmVnaW9uKTsKLQkJCQkJCXJlZ2lvbi5hZGQoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgsIGV2ZW50LmhlaWdodCk7IAotCQkJCQkJZ2Muc2V0Q2xpcHBpbmcocmVnaW9uKTsKLQkJCQkJCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZ2Muc2V0QWR2YW5jZWQodHJ1ZSk7Ci0JCQkJaWYgKGdjLmdldEFkdmFuY2VkKCkpIGdjLnNldEFscGhhKDEyNyk7CQkJCQkJCQkKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGV2ZW50LmdldEJvdW5kcygpOwotCQkJCUNvbG9yIGZvcmVncm91bmQgPSBnYy5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQkJQ29sb3IgYmFja2dyb3VuZCA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQkJZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIHJlY3QueSwgNTAwLCByZWN0LmhlaWdodCwgZmFsc2UpOwotCQkJCS8vIHJlc3RvcmUgY29sb3JzIGZvciBzdWJzZXF1ZW50IGRyYXdpbmcKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCQkJCWdjLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJZXZlbnQuZGV0YWlsICY9IH5TV1QuU0VMRUNURUQ7CQkJCQkKLQkJCX0JCQkJCQkKLQkJfQotCX0pOwkJCi0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9CQotCXRhYmxlLnNldFNlbGVjdGlvbih0YWJsZS5nZXRJdGVtKDApKTsKLQlzaGVsbC5zZXRTaXplKDUwMCwgMjAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwkKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIzNjkwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRyYWNrZXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0cmFja2VyIChkcmFnIG9uIG1vdXNlIGRvd24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVRyYWNrZXIgdHJhY2tlciA9IG5ldyBUcmFja2VyIChzaGVsbCwgU1dULk5PTkUpOwotCQkJdHJhY2tlci5zZXRSZWN0YW5nbGVzIChuZXcgUmVjdGFuZ2xlIFtdIHsKLQkJCQluZXcgUmVjdGFuZ2xlIChlLngsIGUueSwgMTAwLCAxMDApLAotCQkJfSk7Ci0JCQl0cmFja2VyLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTA2MmRiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBJbWFnZXMgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhIFRhYmxlSXRlbQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjMwIHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fSU5GT1JNQVRJT04pOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIkltYWdlcyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgVGFibGVJdGVtIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsJCQkKLQlpbnQgY29sdW1uQ291bnQgPSAzOwotCWZvciAoaW50IGk9MDsgaTxjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dCgiQ29sdW1uICIgKyBpKTsJCi0JfQotCWludCBpdGVtQ291bnQgPSA4OwotCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gIitpKyIgYSIsICJpdGVtICIraSsiIGIiLCAiaXRlbSAiK2krIiBjIn0pOwotCX0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CQkKLQkJCXN3aXRjaChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQkJZXZlbnQud2lkdGggKz0gcmVjdC53aWR0aDsKLQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCByZWN0LmhlaWdodCArIDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCWludCB4ID0gZXZlbnQueCArIGV2ZW50LndpZHRoOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHgsIGV2ZW50LnkgKyBvZmZzZXQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwkJCi0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBwYWludExpc3RlbmVyKTsJCQotCi0JZm9yKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9CQotCXNoZWxsLnNldFNpemUoNTAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlpZihpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODE2NGUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogZXhhbXBsZSBzbmlwcGV0OiBNdWx0aXBsZSBsaW5lcyBwZXIgVGFibGVJdGVtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzEgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJNdWx0aXBsZSBsaW5lcyBpbiBhIFRhYmxlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIraSsiIGEiLCAiaXRlbSAiK2krIiBiIiwgIml0ZW0gIitpKyIgYyIsICJpdGVtICIraSsiIGQifSk7Ci0JfQkKLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWV2ZW50Lml0ZW07Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChpdGVtLCBldmVudC5pbmRleCk7Ci0JCQkJCVBvaW50IHNpemUgPSBldmVudC5nYy50ZXh0RXh0ZW50KHRleHQpOwotCQkJCQlldmVudC53aWR0aCA9IHNpemUueDsKLQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBzaXplLnkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSlldmVudC5pdGVtOwotCQkJCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoaXRlbSwgZXZlbnQuaW5kZXgpOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsJCQkJCQotCQkJCQlpbnQgb2Zmc2V0MiA9IGV2ZW50LmluZGV4ID09IDAgPyBNYXRoLm1heCgwLCAoZXZlbnQuaGVpZ2h0IC0gc2l6ZS55KSAvIDIpIDogMDsKLQkJCQkJZXZlbnQuZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCwgZXZlbnQueSArIG9mZnNldDIsIHRydWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuRXJhc2VJdGVtOiB7CQotCQkJCQlldmVudC5kZXRhaWwgJj0gflNXVC5GT1JFR1JPVU5EOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGdldFRleHQoVGFibGVJdGVtIGl0ZW0sIGludCBjb2x1bW4pIHsKLQkJCVN0cmluZyB0ZXh0ID0gaXRlbS5nZXRUZXh0KGNvbHVtbik7Ci0JCQlpZiAoY29sdW1uICE9IDApIHsKLQkJCQlpbnQgaW5kZXggPSB0YWJsZS5pbmRleE9mKGl0ZW0pOwotCQkJCWlmICgoaW5kZXgrY29sdW1uKSAlIDMgPT0gMSl7Ci0JCQkJCXRleHQgKz0iXG5uZXcgbGluZSI7Ci0JCQkJfQotCQkJCWlmICgoaW5kZXgrY29sdW1uKSAlIDMgPT0gMikgewotCQkJCQl0ZXh0ICs9IlxubmV3IGxpbmVcbm5ldyBsaW5lIjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCX07Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBwYWludExpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhMmNmYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRyZWUgZXhhbXBsZSBzbmlwcGV0OiBEcmF3IGEgYmFyIGdyYXBoCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzIgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwkJCi0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCXNoZWxsLnNldFRleHQoIlNob3cgcmVzdWx0cyBhcyBhIGJhciBjaGFydCBpbiBUcmVlIik7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMS5zZXRUZXh0KCJCdWcgU3RhdHVzIik7Ci0JY29sdW1uMS5zZXRXaWR0aCgxMDApOwotCWZpbmFsIFRyZWVDb2x1bW4gY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQljb2x1bW4yLnNldFRleHQoIlBlcmNlbnQiKTsKLQljb2x1bW4yLnNldFdpZHRoKDIwMCk7Ci0JU3RyaW5nW10gc3RhdGVzID0gbmV3IFN0cmluZ1tdeyJSZXNvbHZlZCIsICJOZXciLCAiV29uJ3QgRml4IiwgIkludmFsaWQifTsKLQlTdHJpbmdbXSB0ZWFtcyA9IG5ldyBTdHJpbmdbXSB7IlVJIiwgIlNXVCIsICJPU0dJIn07Ci0JZm9yIChpbnQgaT0wOyBpPHRlYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQodGVhbXNbaV0pOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlcy5sZW5ndGg7IGorKykgewotCQkJVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQlzdWJJdGVtLnNldFRleHQoc3RhdGVzW2pdKTsJCi0JCX0KLQl9Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULlBhaW50SXRlbSwgbmV3IExpc3RlbmVyKCkgewotCQlpbnRbXSBwZXJjZW50cyA9IG5ldyBpbnRbXSB7NTAsIDMwLCA1LCAxNX07Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuaW5kZXggPT0gMSkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlUcmVlSXRlbSBwYXJlbnQgPSBpdGVtLmdldFBhcmVudEl0ZW0oKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQkJaW50IGluZGV4ID0gcGFyZW50LmluZGV4T2YoaXRlbSk7Ci0JCQkJCWludCBwZXJjZW50ID0gcGVyY2VudHNbaW5kZXhdOwotCQkJCQlDb2xvciBmb3JlZ3JvdW5kID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJCQlDb2xvciBiYWNrZ3JvdW5kID0gZ2MuZ2V0QmFja2dyb3VuZCgpOwotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOwotCQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1lFTExPVykpOwotCQkJCQlpbnQgd2lkdGggPSAoY29sdW1uMi5nZXRXaWR0aCgpIC0gMSkgKiBwZXJjZW50IC8gMTAwOwotCQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoZXZlbnQueCwgZXZlbnQueSwgd2lkdGgsIGV2ZW50LmhlaWdodCwgdHJ1ZSk7CQkJCQkKLQkJCQkJUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZShldmVudC54LCBldmVudC55LCB3aWR0aC0xLCBldmVudC5oZWlnaHQtMSk7Ci0JCQkJCWdjLmRyYXdSZWN0YW5nbGUocmVjdDIpOwotCQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCkpOwotCQkJCQlTdHJpbmcgdGV4dCA9IHBlcmNlbnQrIiUiOwotCQkJCQlQb2ludCBzaXplID0gZXZlbnQuZ2MudGV4dEV4dGVudCh0ZXh0KTsJCQkJCQotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHNpemUueSkgLyAyKTsKLQkJCQkJZ2MuZHJhd1RleHQodGV4dCwgZXZlbnQueCsyLCBldmVudC55K29mZnNldCwgdHJ1ZSk7Ci0JCQkJCWdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZCk7Ci0JCQkJCWdjLnNldEJhY2tncm91bmQoZm9yZWdyb3VuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSk7CQkKLQkJCQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDQxMmQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGRpYWxvZyBzaGVsbCBhbmQgcG9zaXRpb24gaXQKLSAqIHdpdGggdXBwZXIgbGVmdCBjb3JuZXIgYXQgY3Vyc29yIHBvc2l0aW9uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzMyB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQgKCJQYXJlbnQgU2hlbGwiKTsKLQkJc2hlbGwuYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93biAoTW91c2VFdmVudCBlKSB7Ci0JCQkJU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkuZ2V0Q3Vyc29yTG9jYXRpb24gKCk7Ci0JCQkJZGlhbG9nLnNldExvY2F0aW9uIChwdC54LCBwdC55KTsKLQkJCQlkaWFsb2cuc2V0VGV4dCAoIkRpYWxvZyBTaGVsbCIpOwotCQkJCWRpYWxvZy5zZXRTaXplICgxMDAsIDEwMCk7Ci0JCQkJZGlhbG9nLm9wZW4gKCk7IAotCQkJfX0pOwotCQlzaGVsbC5zZXRTaXplICg0MDAsIDQwMCk7Ci0JCXNoZWxsLm9wZW4gKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTdkYjk1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotLyogCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IEZpeGVkIGZpcnN0IGNvbHVtbiBhbmQgaG9yaXpvbnRhbCBzY3JvbGwgcmVtYWluaW5nIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzNCB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlpbnQgcm93Q291bnQgPSA0MDsKLQlpbnQgY29sdW1uQ291bnQgPSAxNTsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQotCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JZmluYWwgVGFibGUgbGVmdFRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQlsZWZ0VGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSkpOwotCWxlZnRUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWZpbmFsIFRhYmxlIHJpZ2h0VGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXJpZ2h0VGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlHcmlkRGF0YSB0YWJsZTJEYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMSwgMik7Ci0JcmlnaHRUYWJsZS5zZXRMYXlvdXREYXRhKHRhYmxlMkRhdGEpOwotCS8vIENyZWF0ZSBjb2x1bW5zCi0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbihsZWZ0VGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4xLnNldFRleHQoIk5hbWUiKTsKLQljb2x1bW4xLnNldFdpZHRoKDE1MCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihyaWdodFRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJWYWx1ZSAiK2kpOwotCQljb2x1bW4uc2V0V2lkdGgoMjAwKTsKLQl9Ci0JLy8gQ3JlYXRlIHJvd3MKLQlmb3IgKGludCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKGxlZnRUYWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIitpKTsKLQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0ocmlnaHRUYWJsZSwgU1dULk5PTkUpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspIHsKLQkJCWl0ZW0uc2V0VGV4dChqLCAiSXRlbSAiK2krIiB2YWx1ZSBAICIraik7Ci0JCX0KLQl9Ci0JLy8gTWFrZSBzZWxlY3Rpb24gdGhlIHNhbWUgaW4gYm90aCB0YWJsZXMKLQlsZWZ0VGFibGUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJcmlnaHRUYWJsZS5zZXRTZWxlY3Rpb24obGVmdFRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCX0KLQl9KTsKLQlyaWdodFRhYmxlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWxlZnRUYWJsZS5zZXRTZWxlY3Rpb24ocmlnaHRUYWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQl9Ci0JfSk7Ci0JLy8gT24gV2luZG93cywgdGhlIHNlbGVjdGlvbiBpcyBncmF5IGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBoYXZlIGZvY3VzLgotCS8vIFRvIG1ha2UgYm90aCB0YWJsZXMgYXBwZWFyIGluIGZvY3VzLCBkcmF3IHRlaCBzZWxlY3Rpb24gYmFja2dyb3VuZCBoZXJlLgotCS8vIFRoaXMgcGFydCBvbmx5IHdvcmtzIG9uIHZlcnNpb24gMy4yIG9yIGxhdGVyLgotCUxpc3RlbmVyIGVyYXNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZigoZXZlbnQuZGV0YWlsICYgU1dULlNFTEVDVEVEKSAhPSAwKSB7Ci0JCQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGV2ZW50LmdldEJvdW5kcygpOwotCQkJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT05fVEVYVCkpOwotCQkJCWdjLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKHJlY3QpOwotCQkJCWV2ZW50LmRldGFpbCAmPSB+U1dULlNFTEVDVEVEOwkJCQkJCi0JCQl9Ci0JCX0KLQl9OwotCQotCWxlZnRUYWJsZS5hZGRMaXN0ZW5lcihTV1QuRXJhc2VJdGVtLCBlcmFzZUxpc3RlbmVyKTsKLQlyaWdodFRhYmxlLmFkZExpc3RlbmVyKFNXVC5FcmFzZUl0ZW0sIGVyYXNlTGlzdGVuZXIpOwotCS8vIE1ha2UgdmVydGljYWwgc2Nyb2xsYmFycyBzY3JvbGwgdG9nZXRoZXIKLQlTY3JvbGxCYXIgdkJhckxlZnQgPSBsZWZ0VGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLQl2QmFyTGVmdC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlyaWdodFRhYmxlLnNldFRvcEluZGV4KGxlZnRUYWJsZS5nZXRUb3BJbmRleCgpKTsKLQkJfQotCX0pOwotCVNjcm9sbEJhciB2QmFyUmlnaHQgPSByaWdodFRhYmxlLmdldFZlcnRpY2FsQmFyKCk7Ci0JdkJhclJpZ2h0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWxlZnRUYWJsZS5zZXRUb3BJbmRleChyaWdodFRhYmxlLmdldFRvcEluZGV4KCkpOwotCQl9Ci0JfSk7Ci0JLy8gSG9yaXpvbnRhbCBiYXIgb24gc2Vjb25kIHRhYmxlIHRha2VzIHVwIGEgbGl0dGxlIGV4dHJhIHNwYWNlLgotCS8vIFRvIGtlZXAgdmVydGljYWwgc2Nyb2xsIGJhcnMgaW4gc2luaywgZm9yY2UgdGFibGUxIHRvIGVuZCBhYm92ZQotCS8vIGhvcml6b250YWwgc2Nyb2xsYmFyCi0JU2Nyb2xsQmFyIGhCYXJSaWdodCA9IHJpZ2h0VGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkRGF0YSBzcGFjZXJEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0Jc3BhY2VyRGF0YS5oZWlnaHRIaW50ID0gaEJhclJpZ2h0LmdldFNpemUoKS55OwotCXNwYWNlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQlwYXJlbnQuc2V0QmFja2dyb3VuZChsZWZ0VGFibGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkKLQlzaGVsbC5zZXRTaXplKDYwMCwgNDAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2E1OWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IGEgc3lzdGVtIHNldHRpbmdzIGNoYW5nZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjM1IHsKLQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGhlIFNXVC5TZXR0aW5ncyBFdmVudCIpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULldSQVApOwotCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCWxhYmVsLnNldFRleHQoIkNoYW5nZSBhIHN5c3RlbSBzZXR0aW5nIGFuZCB0aGUgdGFibGUgYmVsb3cgd2lsbCBiZSB1cGRhdGVkLiIpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSKTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQljb2x1bW4uc2V0V2lkdGgoMTUwKTsKLQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pOwotCQlpdGVtLnNldFRleHQoMCwgY29sb3JOYW1lc1tpXSk7Ci0JCWl0ZW0uc2V0QmFja2dyb3VuZCgxLCBjb2xvcik7Ci0JCWl0ZW0uc2V0VGV4dCgyLCBjb2xvci50b1N0cmluZygpKTsKLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWNvbHVtbnNbMF0ucGFjaygpOwotCWNvbHVtbnNbMl0ucGFjaygpOwotCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULlNldHRpbmdzLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29sb3IgY29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKGNvbG9ySWRzW2ldKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0oaSk7Ci0JCQkJaXRlbS5zZXRCYWNrZ3JvdW5kKDEsIGNvbG9yKTsKLQkJCX0KLQkJCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCWNvbHVtbnNbMF0ucGFjaygpOwotCQkJY29sdW1uc1syXS5wYWNrKCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLXN0YXRpYyBpbnRbXSBjb2xvcklkcyA9IG5ldyBpbnRbXSB7U1dULkNPTE9SX0lORk9fQkFDS0dST1VORCwgCi0JCVNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQsIAotCQlTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5ELAotCQlTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5ELAotCQlTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04sCi0JCVNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhULAotCQlTV1QuQ09MT1JfVElUTEVfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1RJVExFX0JBQ0tHUk9VTkRfR1JBRElFTlQsCi0JCVNXVC5DT0xPUl9USVRMRV9GT1JFR1JPVU5ELAotCQlTV1QuQ09MT1JfVElUTEVfSU5BQ1RJVkVfQkFDS0dST1VORCwKLQkJU1dULkNPTE9SX1RJVExFX0lOQUNUSVZFX0JBQ0tHUk9VTkRfR1JBRElFTlQsCi0JCVNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9GT1JFR1JPVU5ELAotCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfQk9SREVSLAotCQlTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XLAotCQlTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQsCi0JCVNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVywKLQkJU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1csCi0JCVNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVyx9Owotc3RhdGljIFN0cmluZyBbXSBjb2xvck5hbWVzID0gbmV3IFN0cmluZ1tdIHsiU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCIsCi0JCSJTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EIiwgCi0JCSJTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQiLAotCQkiU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OIiwKLQkJIlNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9CQUNLR1JPVU5EX0dSQURJRU5UIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9CQUNLR1JPVU5EX0dSQURJRU5UIiwKLQkJIlNXVC5DT0xPUl9USVRMRV9JTkFDVElWRV9GT1JFR1JPVU5EIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0JPUkRFUiIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XIiwKLQkJIlNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCIsCi0JCSJTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9MSUdIVF9TSEFET1ciLAotCQkiU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XIix9OwotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmY1N2ViLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0vKiAKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZHJhdyBkaWZmZXJlbnQgZm9yZWdyb3VuZCBjb2xvcnMgZm9yIHRleHQgaW4gYSBUYWJsZUl0ZW0uCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0VGV4dCgiVGFibGU6IENoYW5nZSBzdHlsZSBtdWx0aXBsZSB0aW1lcyBpbiBjZWxsIik7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7CQkJCi0JfQotCWZpbmFsIFRleHRMYXlvdXQgdGV4dExheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCXRleHRMYXlvdXQuc2V0VGV4dCgiU1dUOiBTdGFuZGFyZCBXaWRnZXQgVG9vbGtpdCIpOwotCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiVGFob21hIiwgMTQsIFNXVC5CT0xEKTsKLQlGb250IGZvbnQyID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250IGZvbnQzID0gbmV3IEZvbnQoZGlzcGxheSwgIlRhaG9tYSIsIDE0LCBTV1QuSVRBTElDKTsKLQlUZXh0U3R5bGUgc3R5bGUxID0gbmV3IFRleHRTdHlsZShmb250MSwgZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSksIG51bGwpOwotCVRleHRTdHlsZSBzdHlsZTIgPSBuZXcgVGV4dFN0eWxlKGZvbnQyLCBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9NQUdFTlRBKSwgbnVsbCk7Ci0JVGV4dFN0eWxlIHN0eWxlMyA9IG5ldyBUZXh0U3R5bGUoZm9udDMsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCksIG51bGwpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUxLCAwLCAwKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTEsIDUsIDEyKTsKLQl0ZXh0TGF5b3V0LnNldFN0eWxlKHN0eWxlMiwgMSwgMSk7IHRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUyLCAxNCwgMTkpOwotCXRleHRMYXlvdXQuc2V0U3R5bGUoc3R5bGUzLCAyLCAyKTsgdGV4dExheW91dC5zZXRTdHlsZShzdHlsZTMsIDIxLCAyNyk7Ci0KLQkvKgotCSAqIE5PVEU6IE1lYXN1cmVJdGVtLCBQYWludEl0ZW0gYW5kIEVyYXNlSXRlbSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkuCi0JICogVGhlcmVmb3JlLCBpdCBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2UgdGhhdCB0aGVzZSBtZXRob2RzIGJlCi0JICogYXMgZWZmaWNpZW50IGFzIHBvc3NpYmxlLgotCSAqLwotCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCXRleHRMYXlvdXQuZHJhdyhldmVudC5nYywgZXZlbnQueCwgZXZlbnQueSk7Ci0JCX0KLQl9KTsKLQlmaW5hbCBSZWN0YW5nbGUgdGV4dExheW91dEJvdW5kcyA9IHRleHRMYXlvdXQuZ2V0Qm91bmRzKCk7Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWUud2lkdGggPSB0ZXh0TGF5b3V0Qm91bmRzLndpZHRoICsgMjsKLQkJCWUuaGVpZ2h0ID0gdGV4dExheW91dEJvdW5kcy5oZWlnaHQgKyAyOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSg0MDAsIDIwMCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZm9udDEuZGlzcG9zZSgpOwotCWZvbnQyLmRpc3Bvc2UoKTsKLQlmb250My5kaXNwb3NlKCk7Ci0JdGV4dExheW91dC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODIzZjUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLS8qIAotICogQ29tcG9zaXRlIFNuaXBwZXQ6IGluaGVyaXQgYSBiYWNrZ3JvdW5kIGNvbG9yIG9yIGltYWdlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRUZXh0KCJDb21wb3NpdGUuc2V0QmFja2dyb3VuZE1vZGUoKSIpOwotCXNoZWxsLnNldExheW91dChuZXcgUm93TGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQ1lBTik7Ci0JCi0JR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIFNXVC5OT05FKTsKLQlncm91cC5zZXRUZXh0KCJTV1QuSU5IRVJJVF9OT05FIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfTk9ORSk7Ci0JY3JlYXRlQ2hpbGRyZW4oZ3JvdXApOwotCQotCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ3JvdXAuc2V0VGV4dCgiU1dULklOSEVSSVRfREVGQVVMVCIpOwotCWdyb3VwLnNldEJhY2tncm91bmRNb2RlKFNXVC5JTkhFUklUX0RFRkFVTFQpOwotCWNyZWF0ZUNoaWxkcmVuKGdyb3VwKTsKLQkKLQlncm91cCA9IG5ldyBHcm91cChzaGVsbCwgU1dULk5PTkUpOwotCWdyb3VwLnNldEJhY2tncm91bmQoY29sb3IpOwotCWdyb3VwLnNldFRleHQoIlNXVC5JTkhFUklUX0ZPUkNFIik7Ci0JZ3JvdXAuc2V0QmFja2dyb3VuZE1vZGUoU1dULklOSEVSSVRfRk9SQ0UpOwotCWNyZWF0ZUNoaWxkcmVuKGdyb3VwKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci1zdGF0aWMgdm9pZCBjcmVhdGVDaGlsZHJlbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JcGFyZW50LnNldExheW91dChuZXcgUm93TGF5b3V0KCkpOwotCUxpc3QgbGlzdCA9IG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JbGlzdC5hZGQoIkxpc3QgaXRlbSAxIik7Ci0JbGlzdC5hZGQoIkxpc3QgaXRlbSAyIik7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JbGFiZWwuc2V0VGV4dCgiTGFiZWwiKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JYnV0dG9uLnNldFRleHQoIlJhZGlvIEJ1dHRvbiIpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCWJ1dHRvbi5zZXRUZXh0KCJDaGVjayBib3ggQnV0dG9uIik7Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiUHVzaCBCdXR0b24iKTsKLQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotCXRleHQuc2V0VGV4dCgiVGV4dCIpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDIzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTZjZTA0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHBvcHVwIG1lbnUgd2l0aCBhIHN1Ym1lbnUKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyMzggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29tcG9zaXRlLnNldFNpemUgKDEwMCwgMTAwKTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCU1lbnVJdGVtIGl0ZW0xID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbTEuc2V0VGV4dCAoIlB1c2ggSXRlbSIpOwotCU1lbnVJdGVtIGl0ZW0yID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JaXRlbTIuc2V0VGV4dCAoIkNhc2NhZGUgSXRlbSIpOwotCU1lbnUgc3ViTWVudSA9IG5ldyBNZW51IChtZW51KTsKLQlpdGVtMi5zZXRNZW51IChzdWJNZW51KTsKLQlNZW51SXRlbSBzdWJJdGVtMSA9IG5ldyBNZW51SXRlbSAoc3ViTWVudSwgU1dULlBVU0gpOwotCXN1Ykl0ZW0xLnNldFRleHQgKCJTdWJpdGVtIDEiKTsKLQlNZW51SXRlbSBzdWJJdGVtMiA9IG5ldyBNZW51SXRlbSAoc3ViTWVudSwgU1dULlBVU0gpOwotCXN1Ykl0ZW0yLnNldFRleHQgKCJTdWJpdGVtIDIiKTsKLQljb21wb3NpdGUuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0TWVudSAobWVudSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyMzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhNzM1MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjM5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIFRhYmxlIHNuaXBwZXQ6IG1ha2UgdGV4dCBzcGFuIG11bHRpcGxlIGNvbHVtbnMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4yCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDIzOSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlRleHQgc3BhbnMgdHdvIGNvbHVtbnMgaW4gYSBUYWJsZUl0ZW0iKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JaW50IGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpPTA7IGk8Y29sdW1uQ291bnQ7IGkrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbHVtbiAiICsgaSk7CQotCX0KLQlpbnQgaXRlbUNvdW50ID0gODsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoMCwgIml0ZW0gIitpKyIgYSIpOwotCQlpdGVtLnNldFRleHQoMywgIml0ZW0gIitpKyIgZCIpOwotCX0JCi0JLyoKLQkgKiBOT1RFOiBNZWFzdXJlSXRlbSwgUGFpbnRJdGVtIGFuZCBFcmFzZUl0ZW0gYXJlIGNhbGxlZCByZXBlYXRlZGx5LgotCSAqIFRoZXJlZm9yZSwgaXQgaXMgY3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHRoYXQgdGhlc2UgbWV0aG9kcyBiZQotCSAqIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgc3RyaW5nID0gInRleHQgdGhhdCBzcGFucyB0d28gY29sdW1ucyI7Ci0JR0MgZ2MgPSBuZXcgR0ModGFibGUpOwotCWZpbmFsIFBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJZXZlbnQud2lkdGggPSBleHRlbnQueC8yOwotCQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBleHRlbnQueSArIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJaW50IG9mZnNldCA9IDA7Ci0JCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSB0YWJsZS5nZXRDb2x1bW4oMSk7Ci0JCQkJCQkJb2Zmc2V0ID0gY29sdW1uMS5nZXRXaWR0aCgpOwotCQkJCQkJfQotCQkJCQkJZXZlbnQuZ2Muc2V0Rm9yZWdyb3VuZChyZWQpOwotCQkJCQkJaW50IHkgPSBldmVudC55ICsgKGV2ZW50LmhlaWdodCAtIGV4dGVudC55KS8yOwotCQkJCQkJZXZlbnQuZ2MuZHJhd1N0cmluZyhzdHJpbmcsIGV2ZW50LnggLSBvZmZzZXQsIHkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0JdGFibGUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnRJdGVtLCBwYWludExpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJdGFibGUuZ2V0Q29sdW1uKGkpLnBhY2soKTsKLQl9Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTQ0YWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBkZXRlY3QgQ1IgaW4gYSB0ZXh0IG9yIGNvbWJvIGNvbnRyb2wgKGRlZmF1bHQgc2VsZWN0aW9uKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvIChzaGVsbCwgU1dULk5PTkUpOwotCWNvbWJvLnNldEl0ZW1zIChuZXcgU3RyaW5nIFtdIHsiQS0xIiwgIkItMSIsICJDLTEifSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JdGV4dC5zZXRUZXh0ICgic29tZSB0ZXh0Iik7Ci0JY29tYm8uYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuIChlLndpZGdldCArICIgLSBEZWZhdWx0IFNlbGVjdGlvbiIpOwotCQl9Ci0JfSk7Ci0JdGV4dC5hZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKGUud2lkZ2V0ICsgIiAtIERlZmF1bHQgU2VsZWN0aW9uIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExODhkMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUcmVlIHNuaXBwZXQ6IFRleHQgdGhhdCBzcGFucyBtdWx0aXBsZSBjb2x1bW5zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMgotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIlRleHQgc3BhbnMgdHdvIGNvbHVtbnMgaW4gYSBUcmVlSXRlbSIpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWludCBjb2x1bW5Db3VudCA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwkKLQl9Ci0JaW50IGl0ZW1Db3VudCA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KDAsICJpdGVtICIraSsiIGEiKTsKLQkJaXRlbS5zZXRUZXh0KDMsICJpdGVtICIraSsiIGQiKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KDAsICJzdWJJdGVtICIraSsiLSIraisiIGEiKTsKLQkJCXN1Ykl0ZW0uc2V0VGV4dCgzLCAic3ViSXRlbSAiK2krIi0iK2orIiBkIik7Ci0JCX0KLQl9CQotCS8qCi0JICogTk9URTogTWVhc3VyZUl0ZW0sIFBhaW50SXRlbSBhbmQgRXJhc2VJdGVtIGFyZSBjYWxsZWQgcmVwZWF0ZWRseS4KLQkgKiBUaGVyZWZvcmUsIGl0IGlzIGNyaXRpY2FsIGZvciBwZXJmb3JtYW5jZSB0aGF0IHRoZXNlIG1ldGhvZHMgYmUKLQkgKiBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCi0JICovCi0JZmluYWwgU3RyaW5nIHN0cmluZyA9ICJ0ZXh0IHRoYXQgc3BhbnMgdHdvIGNvbHVtbnMiOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCWZpbmFsIFBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQlmaW5hbCBDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUxpc3RlbmVyIHBhaW50TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2goZXZlbnQudHlwZSkgewkJCi0JCQkJY2FzZSBTV1QuTWVhc3VyZUl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJZXZlbnQud2lkdGggPSBleHRlbnQueC8yOwotCQkJCQkJZXZlbnQuaGVpZ2h0ID0gTWF0aC5tYXgoZXZlbnQuaGVpZ2h0LCBleHRlbnQueSArIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIFNXVC5QYWludEl0ZW06IHsKLQkJCQkJaWYgKGV2ZW50LmluZGV4ID09IDEgfHwgZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJaW50IG9mZnNldCA9IDA7Ci0JCQkJCQlpZiAoZXZlbnQuaW5kZXggPT0gMikgewotCQkJCQkJCVRyZWVDb2x1bW4gY29sdW1uMSA9IHRyZWUuZ2V0Q29sdW1uKDEpOwotCQkJCQkJCW9mZnNldCA9IGNvbHVtbjEuZ2V0V2lkdGgoKTsKLQkJCQkJCX0KLQkJCQkJCWV2ZW50LmdjLnNldEZvcmVncm91bmQocmVkKTsKLQkJCQkJCWludCB5ID0gZXZlbnQueSArIChldmVudC5oZWlnaHQgLSBleHRlbnQueSkvMjsKLQkJCQkJCWV2ZW50LmdjLmRyYXdTdHJpbmcoc3RyaW5nLCBldmVudC54IC0gb2Zmc2V0LCB5KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCXRyZWUuYWRkTGlzdGVuZXIoU1dULk1lYXN1cmVJdGVtLCBwYWludExpc3RlbmVyKTsKLQl0cmVlLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQl0cmVlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZighZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZjFlODMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUZXh0IHNuaXBwZXQ6IE92ZXJyaWRlIFRhYiBiZWhhdmlvciB0byB0cmF2ZXJzZSBvdXQgb2YgYSBUZXh0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjAwLDIwMCk7Ci0JVGV4dCB0ZXh0MSA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JdGV4dDEuc2V0Qm91bmRzKDEwLDEwLDE1MCw1MCk7Ci0JdGV4dDEuc2V0VGV4dCgiVGFiIHdpbGwgdHJhdmVyc2Ugb3V0IGZyb20gaGVyZS4iKTsKLQl0ZXh0MS5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUIHx8IGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpIHsKLQkJCQllLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfSk7Ci0JVGV4dCB0ZXh0MiA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JdGV4dDIuc2V0Qm91bmRzKDEwLDEwMCwxNTAsNTApOwotCXRleHQyLnNldFRleHQoIkJ1dCBUYWIgd2lsbCBOT1QgdHJhdmVyc2Ugb3V0IGZyb20gaGVyZSAoQ3RybCtUYWIgd2lsbCkuIik7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0MjczYS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKiAKLSAqIEN1cnNvciBzbmlwcGV0OiBIaWRlIHRoZSBDdXJzb3Igb3ZlciBhIGNvbnRyb2wuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljYW52YXMuc2V0Qm91bmRzKDEwLDUwLDE1MCwxMDApOwotCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQllLmdjLmRyYXdTdHJpbmcoImhpZGUgQ3Vyc29yIGhlcmUiLCAxMCwgMTApOwotCQl9Ci0JfSk7Ci0KLQkvLyBjcmVhdGUgYSBjdXJzb3Igd2l0aCBhIHRyYW5zcGFyZW50IGltYWdlCi0JQ29sb3Igd2hpdGUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsYWNrID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMQUNLKTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhIChuZXcgUkdCIFtdIHt3aGl0ZS5nZXRSR0IoKSwgYmxhY2suZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDE2LCAxNiwgMSwgcGFsZXR0ZSk7Ci0Jc291cmNlRGF0YS50cmFuc3BhcmVudFBpeGVsID0gMDsKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2VEYXRhLCAwLCAwKTsKLQotCXNoZWxsLm9wZW4oKTsKLQljYW52YXMuc2V0Q3Vyc29yKGN1cnNvcik7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjQyZjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyogCi0gKiBUZXh0IHNuaXBwZXQ6IHR5cGUgaW4gb25lIHRleHQsIG91dHB1dCB0byBhbm90aGVyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIFRleHQgdGV4dDAgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCWZpbmFsIFRleHQgdGV4dDEgPSBuZXcgVGV4dCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCXRleHQwLmFkZFZlcmlmeUxpc3RlbmVyIChuZXcgVmVyaWZ5TGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0IChWZXJpZnlFdmVudCBldmVudCkgewotCQkJdGV4dDEuc2V0VG9wSW5kZXggKHRleHQwLmdldFRvcEluZGV4ICgpKTsKLQkJCXRleHQxLnNldFNlbGVjdGlvbiAoZXZlbnQuc3RhcnQsIGV2ZW50LmVuZCk7Ci0JCQl0ZXh0MS5pbnNlcnQgKGV2ZW50LnRleHQpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTdkZmU5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogU3R5bGVkVGV4dCBzbmlwcGV0OiBEcmF3IGEgYm94IGFyb3VuZCB0ZXh0LgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ0IHsKLQlzdGF0aWMgU3RyaW5nIFNFQVJDSF9TVFJJTkcgPSAiYm94IjsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0gICAgICAgIGZpbmFsIENvbG9yIFJFRCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0gICAgICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotICAgICAgICBzaGVsbC5zZXRCb3VuZHMoMTAsMTAsMjUwLDI1MCk7Ci0gICAgICAgIGZpbmFsIFN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHRleHQuc2V0Qm91bmRzKDEwLDEwLDIwMCwyMDApOwotICAgICAgICB0ZXh0LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgc3RyaW5nV2lkdGggPSBldmVudC5nYy5zdHJpbmdFeHRlbnQoU0VBUkNIX1NUUklORykueDsKLQkJCQlpbnQgbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQkJCWV2ZW50LmdjLnNldEZvcmVncm91bmQoUkVEKTsKLQkJCQlpbnQgaW5kZXggPSBjb250ZW50cy5pbmRleE9mKFNFQVJDSF9TVFJJTkcpOwotCQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCQlQb2ludCB0b3BMZWZ0ID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGluZGV4KTsKLQkJCQkJZXZlbnQuZ2MuZHJhd1JlY3RhbmdsZSh0b3BMZWZ0LnggLSAxLCB0b3BMZWZ0LnksIHN0cmluZ1dpZHRoICsgMSwgbGluZUhlaWdodCAtIDEpOwotCQkJCQlpbmRleCA9IGNvbnRlbnRzLmluZGV4T2YoU0VBUkNIX1NUUklORywgaW5kZXggKyAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotICAgICAgICB0ZXh0LnNldFRleHQoIlRoaXMgZGVtb25zdHJhdGVzIGRyYXdpbmcgYSBib3hcbmFyb3VuZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSB3b3JkXG5ib3ggaW4gdGhlIFN0eWxlZFRleHQiKTsKLSAgICAgICAgc2hlbGwub3BlbigpOwotICAgICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlzcGxheS5kaXNwb3NlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGI4NDI1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qIAotICogQ2FudmFzIHNuaXBwZXQ6IHBhaW50IGEgY2lyY2xlIGluIGEgY2FudmFzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjQ1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEoKTsKLQkJCWV2ZW50LmdjLmRyYXdPdmFsKDAsIDAsIHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0Qm91bmRzKDEwLCAxMCwgMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE4NmI3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBXcml0ZSBhbiBJbWFnZSB0byBhIFBORyBmaWxlLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDYgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiQ29taWMgU2FucyBNUyIsIDI0LCBTV1QuQk9MRCk7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDg3LCA0OCk7Ci0JCUdDIGdjID0gbmV3IEdDKGltYWdlKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKGltYWdlLmdldEJvdW5kcygpKTsKLQkJZ2Muc2V0Rm9udChmb250KTsKLQkJZ2Muc2V0Rm9yZWdyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKLQkJZ2MuZHJhd1N0cmluZygiUyIsIDMsIDApOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCWdjLmRyYXdTdHJpbmcoIlciLCAyNSwgMCk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSkpOwotCQlnYy5kcmF3U3RyaW5nKCJUIiwgNjIsIDApOwotCQlnYy5kaXNwb3NlKCk7Ci0KLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JCWxvYWRlci5kYXRhID0gbmV3IEltYWdlRGF0YVtdIHtpbWFnZS5nZXRJbWFnZURhdGEoKX07Ci0JCWxvYWRlci5zYXZlKCJzd3QucG5nIiwgU1dULklNQUdFX1BORyk7Ci0KLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA1MDBlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb250cm9sIGV4YW1wbGUgc25pcHBldDogYWxsb3cgYSBtdWx0aS1saW5lIHRleHQgdG8gcHJvY2VzcyB0aGUgZGVmYXVsdCBidXR0b24KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0NyB7Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCVN0cmluZyBtb2RpZmllciA9IFNXVC5NT0QxID09IFNXVC5DVFJMID8gIkN0cmwiIDogIkNvbW1hbmQiOwotCXRleHQuc2V0VGV4dCgiSGl0ICIgKyBtb2RpZmllciArICIrUmV0dXJuXG50byBzZWVcbnRoZSBkZWZhdWx0IGJ1dHRvblxucnVuIik7Ci0JdGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkgewotCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5NT0QxKSAhPSAwKSBlLmRvaXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnBhY2soKTsKLQlidXR0b24uc2V0VGV4dCgiT0siKTsKLQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIgKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk9LIHNlbGVjdGVkIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5MGFiZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBhbGxvdyBlc2NhcGUgdG8gY2xvc2UgYSBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNDggewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCXNoZWxsLmNsb3NlICgpOwotCQkJCQlldmVudC5kZXRhaWwgPSBTV1QuVFJBVkVSU0VfTk9ORTsKLQkJCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0pOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0ICgiQSBCdXR0b24gKHRoYXQgZG9lc24ndCBwcm9jZXNzIEVzY2FwZSkiKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjRhYjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFN0YWNrTGF5b3V0IGV4YW1wbGUgc25pcHBldDogdXNlIGEgU3RhY2tMYXlvdXQgdG8gc3dpdGNoIGJldHdlZW4gQ29tcG9zaXRlcy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI0OSB7Ci0KLQlzdGF0aWMgaW50IHBhZ2VOdW0gPSAtMTsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldEJvdW5kcyAoMTAsIDEwLCAzMDAsIDIwMCk7Ci0JLy8gY3JlYXRlIHRoZSBjb21wb3NpdGUgdGhhdCB0aGUgcGFnZXMgd2lsbCBzaGFyZQotCWZpbmFsIENvbXBvc2l0ZSBjb250ZW50UGFuZWwgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JY29udGVudFBhbmVsLnNldEJvdW5kcyAoMTAwLCAxMCwgMTkwLCA5MCk7Ci0JZmluYWwgU3RhY2tMYXlvdXQgbGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0ICgpOwotCWNvbnRlbnRQYW5lbC5zZXRMYXlvdXQgKGxheW91dCk7Ci0KLQkvLyBjcmVhdGUgdGhlIGZpcnN0IHBhZ2UncyBjb250ZW50Ci0JZmluYWwgQ29tcG9zaXRlIHBhZ2UwID0gbmV3IENvbXBvc2l0ZSAoY29udGVudFBhbmVsLCBTV1QuTk9ORSk7Ci0JcGFnZTAuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAocGFnZTAsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiTGFiZWwgb24gcGFnZSAxIik7Ci0JbGFiZWwucGFjayAoKTsKLQotCS8vIGNyZWF0ZSB0aGUgc2Vjb25kIHBhZ2UncyBjb250ZW50CQotCWZpbmFsIENvbXBvc2l0ZSBwYWdlMSA9IG5ldyBDb21wb3NpdGUgKGNvbnRlbnRQYW5lbCwgU1dULk5PTkUpOwotCXBhZ2UxLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHBhZ2UxLCBTV1QuTk9ORSk7Ci0JYnV0dG9uLnNldFRleHQgKCJCdXR0b24gb24gcGFnZSAyIik7Ci0JYnV0dG9uLnBhY2sgKCk7Ci0KLQkvLyBjcmVhdGUgdGhlIGJ1dHRvbiB0aGF0IHdpbGwgc3dpdGNoIGJldHdlZW4gdGhlIHBhZ2VzCi0JQnV0dG9uIHBhZ2VCdXR0b24gPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCXBhZ2VCdXR0b24uc2V0VGV4dCAoIlB1c2giKTsKLQlwYWdlQnV0dG9uLnNldEJvdW5kcyAoMTAsIDEwLCA4MCwgMjUpOwotCXBhZ2VCdXR0b24uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJcGFnZU51bSA9ICsrcGFnZU51bSAlIDI7Ci0JCQlsYXlvdXQudG9wQ29udHJvbCA9IHBhZ2VOdW0gPT0gMCA/IHBhZ2UwIDogcGFnZTE7Ci0JCQljb250ZW50UGFuZWwubGF5b3V0ICgpOwotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiYzdlMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbnRyb2wgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBrZXkgc3RhdGUsIGNvZGUgYW5kIGNoYXJhY3RlcgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUgewotCi1zdGF0aWMgU3RyaW5nIHN0YXRlTWFzayAoaW50IHN0YXRlTWFzaykgewotCVN0cmluZyBzdHJpbmcgPSAiIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DVFJMKSAhPSAwKSBzdHJpbmcgKz0gIiBDVFJMIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDApIHN0cmluZyArPSAiIEFMVCI7Ci0JaWYgKChzdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHN0cmluZyArPSAiIFNISUZUIjsKLQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DT01NQU5EKSAhPSAwKSBzdHJpbmcgKz0gIiBDT01NQU5EIjsKLQlyZXR1cm4gc3RyaW5nOwotfQotCi1zdGF0aWMgU3RyaW5nIGNoYXJhY3RlciAoY2hhciBjaGFyYWN0ZXIpIHsKLQlzd2l0Y2ggKGNoYXJhY3RlcikgewotCQljYXNlIDA6IAkJcmV0dXJuICInXFwwJyI7Ci0JCWNhc2UgU1dULkJTOglyZXR1cm4gIidcXGInIjsKLQkJY2FzZSBTV1QuQ1I6CXJldHVybiAiJ1xcciciOwotCQljYXNlIFNXVC5ERUw6CXJldHVybiAiREVMIjsKLQkJY2FzZSBTV1QuRVNDOglyZXR1cm4gIkVTQyI7Ci0JCWNhc2UgU1dULkxGOglyZXR1cm4gIidcXG4nIjsKLQkJY2FzZSBTV1QuVEFCOglyZXR1cm4gIidcXHQnIjsKLQl9Ci0JcmV0dXJuICInIiArIGNoYXJhY3RlciArIiciOwotfQotCi1zdGF0aWMgU3RyaW5nIGtleUNvZGUgKGludCBrZXlDb2RlKSB7Ci0Jc3dpdGNoIChrZXlDb2RlKSB7Ci0JCQotCQkvKiBLZXlib2FyZCBhbmQgTW91c2UgTWFza3MgKi8KLQkJY2FzZSBTV1QuQUxUOiAJCXJldHVybiAiQUxUIjsKLQkJY2FzZSBTV1QuU0hJRlQ6IAlyZXR1cm4gIlNISUZUIjsKLQkJY2FzZSBTV1QuQ09OVFJPTDoJcmV0dXJuICJDT05UUk9MIjsKLQkJY2FzZSBTV1QuQ09NTUFORDoJcmV0dXJuICJDT01NQU5EIjsKLQkJCQotCQkvKiBOb24tTnVtZXJpYyBLZXlwYWQgS2V5cyAqLwotCQljYXNlIFNXVC5BUlJPV19VUDoJCXJldHVybiAiQVJST1dfVVAiOwotCQljYXNlIFNXVC5BUlJPV19ET1dOOglyZXR1cm4gIkFSUk9XX0RPV04iOwotCQljYXNlIFNXVC5BUlJPV19MRUZUOglyZXR1cm4gIkFSUk9XX0xFRlQiOwotCQljYXNlIFNXVC5BUlJPV19SSUdIVDoJcmV0dXJuICJBUlJPV19SSUdIVCI7Ci0JCWNhc2UgU1dULlBBR0VfVVA6CQlyZXR1cm4gIlBBR0VfVVAiOwotCQljYXNlIFNXVC5QQUdFX0RPV046CQlyZXR1cm4gIlBBR0VfRE9XTiI7Ci0JCWNhc2UgU1dULkhPTUU6CQkJcmV0dXJuICJIT01FIjsKLQkJY2FzZSBTV1QuRU5EOgkJCXJldHVybiAiRU5EIjsKLQkJY2FzZSBTV1QuSU5TRVJUOgkJcmV0dXJuICJJTlNFUlQiOwotCi0JCS8qIFZpcnR1YWwgYW5kIEFzY2lpIEtleXMgKi8KLQkJY2FzZSBTV1QuQlM6CXJldHVybiAiQlMiOwotCQljYXNlIFNXVC5DUjoJcmV0dXJuICJDUiI7CQkKLQkJY2FzZSBTV1QuREVMOglyZXR1cm4gIkRFTCI7Ci0JCWNhc2UgU1dULkVTQzoJcmV0dXJuICJFU0MiOwotCQljYXNlIFNXVC5MRjoJcmV0dXJuICJMRiI7Ci0JCWNhc2UgU1dULlRBQjoJcmV0dXJuICJUQUIiOwotCQotCQkvKiBGdW5jdGlvbnMgS2V5cyAqLwotCQljYXNlIFNXVC5GMToJcmV0dXJuICJGMSI7Ci0JCWNhc2UgU1dULkYyOglyZXR1cm4gIkYyIjsKLQkJY2FzZSBTV1QuRjM6CXJldHVybiAiRjMiOwotCQljYXNlIFNXVC5GNDoJcmV0dXJuICJGNCI7Ci0JCWNhc2UgU1dULkY1OglyZXR1cm4gIkY1IjsKLQkJY2FzZSBTV1QuRjY6CXJldHVybiAiRjYiOwotCQljYXNlIFNXVC5GNzoJcmV0dXJuICJGNyI7Ci0JCWNhc2UgU1dULkY4OglyZXR1cm4gIkY4IjsKLQkJY2FzZSBTV1QuRjk6CXJldHVybiAiRjkiOwotCQljYXNlIFNXVC5GMTA6CXJldHVybiAiRjEwIjsKLQkJY2FzZSBTV1QuRjExOglyZXR1cm4gIkYxMSI7Ci0JCWNhc2UgU1dULkYxMjoJcmV0dXJuICJGMTIiOwotCQljYXNlIFNXVC5GMTM6CXJldHVybiAiRjEzIjsKLQkJY2FzZSBTV1QuRjE0OglyZXR1cm4gIkYxNCI7Ci0JCWNhc2UgU1dULkYxNToJcmV0dXJuICJGMTUiOwotCQkKLQkJLyogTnVtZXJpYyBLZXlwYWQgS2V5cyAqLwotCQljYXNlIFNXVC5LRVlQQURfQUREOgkJcmV0dXJuICJLRVlQQURfQUREIjsKLQkJY2FzZSBTV1QuS0VZUEFEX1NVQlRSQUNUOglyZXR1cm4gIktFWVBBRF9TVUJUUkFDVCI7Ci0JCWNhc2UgU1dULktFWVBBRF9NVUxUSVBMWToJcmV0dXJuICJLRVlQQURfTVVMVElQTFkiOwotCQljYXNlIFNXVC5LRVlQQURfRElWSURFOgkJcmV0dXJuICJLRVlQQURfRElWSURFIjsKLQkJY2FzZSBTV1QuS0VZUEFEX0RFQ0lNQUw6CXJldHVybiAiS0VZUEFEX0RFQ0lNQUwiOwotCQljYXNlIFNXVC5LRVlQQURfQ1I6CQkJcmV0dXJuICJLRVlQQURfQ1IiOwotCQljYXNlIFNXVC5LRVlQQURfMDoJCQlyZXR1cm4gIktFWVBBRF8wIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzE6CQkJcmV0dXJuICJLRVlQQURfMSI7Ci0JCWNhc2UgU1dULktFWVBBRF8yOgkJCXJldHVybiAiS0VZUEFEXzIiOwotCQljYXNlIFNXVC5LRVlQQURfMzoJCQlyZXR1cm4gIktFWVBBRF8zIjsKLQkJY2FzZSBTV1QuS0VZUEFEXzQ6CQkJcmV0dXJuICJLRVlQQURfNCI7Ci0JCWNhc2UgU1dULktFWVBBRF81OgkJCXJldHVybiAiS0VZUEFEXzUiOwotCQljYXNlIFNXVC5LRVlQQURfNjoJCQlyZXR1cm4gIktFWVBBRF82IjsKLQkJY2FzZSBTV1QuS0VZUEFEXzc6CQkJcmV0dXJuICJLRVlQQURfNyI7Ci0JCWNhc2UgU1dULktFWVBBRF84OgkJCXJldHVybiAiS0VZUEFEXzgiOwotCQljYXNlIFNXVC5LRVlQQURfOToJCQlyZXR1cm4gIktFWVBBRF85IjsKLQkJY2FzZSBTV1QuS0VZUEFEX0VRVUFMOgkJcmV0dXJuICJLRVlQQURfRVFVQUwiOwotCi0JCS8qIE90aGVyIGtleXMgKi8KLQkJY2FzZSBTV1QuQ0FQU19MT0NLOgkJcmV0dXJuICJDQVBTX0xPQ0siOwotCQljYXNlIFNXVC5OVU1fTE9DSzoJCXJldHVybiAiTlVNX0xPQ0siOwotCQljYXNlIFNXVC5TQ1JPTExfTE9DSzoJcmV0dXJuICJTQ1JPTExfTE9DSyI7Ci0JCWNhc2UgU1dULlBBVVNFOgkJCXJldHVybiAiUEFVU0UiOwotCQljYXNlIFNXVC5CUkVBSzoJCQlyZXR1cm4gIkJSRUFLIjsKLQkJY2FzZSBTV1QuUFJJTlRfU0NSRUVOOglyZXR1cm4gIlBSSU5UX1NDUkVFTiI7Ci0JCWNhc2UgU1dULkhFTFA6CQkJcmV0dXJuICJIRUxQIjsKLQl9Ci0JcmV0dXJuIGNoYXJhY3RlciAoKGNoYXIpIGtleUNvZGUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9IGUudHlwZSA9PSBTV1QuS2V5RG93biA/ICJET1dOOiIgOiAiVVAgIDoiOwotCQkJc3RyaW5nICs9ICIgc3RhdGVNYXNrPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuc3RhdGVNYXNrKSArIHN0YXRlTWFzayAoZS5zdGF0ZU1hc2spICsgIiwiOwotCQkJc3RyaW5nICs9ICIga2V5Q29kZT0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLmtleUNvZGUpICsgIiAiICsga2V5Q29kZSAoZS5rZXlDb2RlKSArICIsIjsKLQkJCXN0cmluZyArPSAiIGNoYXJhY3Rlcj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nIChlLmNoYXJhY3RlcikgKyAiICIgKyBjaGFyYWN0ZXIgKGUuY2hhcmFjdGVyKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoc3RyaW5nKTsKLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5LZXlEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5LZXlVcCwgbGlzdGVuZXIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTkzYmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERhdGVUaW1lIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgRGF0ZVRpbWUgY2FsZW5kYXIgYW5kIGEgRGF0ZVRpbWUgdGltZS4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCi0JRGF0ZVRpbWUgY2FsZW5kYXIgPSBuZXcgRGF0ZVRpbWUgKHNoZWxsLCBTV1QuQ0FMRU5EQVIpOwotCWNhbGVuZGFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJjYWxlbmRhciBkYXRlIGNoYW5nZWQiKTsKLQkJfQotCX0pOwotCi0JRGF0ZVRpbWUgdGltZSA9IG5ldyBEYXRlVGltZSAoc2hlbGwsIFNXVC5USU1FKTsKLQl0aW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJ0aW1lIGNoYW5nZWQiKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdjYTBiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEYXRlVGltZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIERhdGVUaW1lIGNhbGVuZGFyLCBkYXRlLCBhbmQgdGltZSBpbiBhIGRpYWxvZy4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI1MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0KLQlCdXR0b24gb3BlbiA9IG5ldyBCdXR0b24gKHNoZWxsLCBTV1QuUFVTSCk7Ci0Jb3Blbi5zZXRUZXh0ICgiT3BlbiBEaWFsb2ciKTsKLQlvcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlmaW5hbCBTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwgKHNoZWxsLCBTV1QuRElBTE9HX1RSSU0pOwotCQkJZGlhbG9nLnNldExheW91dCAobmV3IEdyaWRMYXlvdXQgKDMsIGZhbHNlKSk7Ci0KLQkJCWZpbmFsIERhdGVUaW1lIGNhbGVuZGFyID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5DQUxFTkRBUiB8IFNXVC5CT1JERVIpOwotCQkJZmluYWwgRGF0ZVRpbWUgZGF0ZSA9IG5ldyBEYXRlVGltZSAoZGlhbG9nLCBTV1QuREFURSB8IFNXVC5TSE9SVCk7Ci0JCQlmaW5hbCBEYXRlVGltZSB0aW1lID0gbmV3IERhdGVUaW1lIChkaWFsb2csIFNXVC5USU1FIHwgU1dULlNIT1JUKTsKLQotCQkJbmV3IExhYmVsIChkaWFsb2csIFNXVC5OT05FKTsKLQkJCW5ldyBMYWJlbCAoZGlhbG9nLCBTV1QuTk9ORSk7Ci0JCQlCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQkJCW9rLnNldFRleHQgKCJPSyIpOwotCQkJb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEgKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCW9rLmFkZFNlbGVjdGlvbkxpc3RlbmVyIChuZXcgU2VsZWN0aW9uQWRhcHRlciAoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiQ2FsZW5kYXIgZGF0ZSBzZWxlY3RlZCAoTU0vREQvWVlZWSkgPSAiICsgKGNhbGVuZGFyLmdldE1vbnRoICgpICsgMSkgKyAiLyIgKyBjYWxlbmRhci5nZXREYXkgKCkgKyAiLyIgKyBjYWxlbmRhci5nZXRZZWFyICgpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuICgiRGF0ZSBzZWxlY3RlZCAoTU0vWVlZWSkgPSAiICsgKGRhdGUuZ2V0TW9udGggKCkgKyAxKSArICIvIiArIGRhdGUuZ2V0WWVhciAoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlRpbWUgc2VsZWN0ZWQgKEhIOk1NKSA9ICIgKyB0aW1lLmdldEhvdXJzICgpICsgIjoiICsgdGltZS5nZXRNaW51dGVzICgpKTsKLQkJCQkJZGlhbG9nLmNsb3NlICgpOwotCQkJCX0KLQkJCX0pOwotCQkJZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rKTsKLQkJCWRpYWxvZy5wYWNrICgpOwotCQkJZGlhbG9nLm9wZW4gKCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjY3NTQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExpbmVBdHRyaWJ1dGVzIGV4YW1wbGUgc25pcHBldDogZHJhdyAyIHBvbHlsaW5lcyB3aXRoIGRpZmZlcmVudCBsaW5lIGF0dHJpYnV0ZXMuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjUyIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkKLQkJc2hlbGwuYWRkTGlzdGVuZXIoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCQkJCi0JCQkJZ2Muc2V0TGluZUF0dHJpYnV0ZXMobmV3IExpbmVBdHRyaWJ1dGVzKDEwLCBTV1QuQ0FQX0ZMQVQsIFNXVC5KT0lOX01JVEVSLCBTV1QuTElORV9TT0xJRCwgbnVsbCwgMCwgMTApKTsKLQkJCQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdezUwLCAxMDAsIDUwLCAyMCwgNjAsIDMwLCA1MCwgNDV9KTsKLQkJCQkKLQkJCQlnYy5zZXRMaW5lQXR0cmlidXRlcyhuZXcgTGluZUF0dHJpYnV0ZXMoMS8yZiwgU1dULkNBUF9GTEFULCBTV1QuSk9JTl9NSVRFUiwgU1dULkxJTkVfRE9ULCBudWxsLCAwLCAxMCkpOwotCQkJCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W117MTAwLCAxMDAsIDEwMCwgMjAsIDExMCwgMzAsIDEwMCwgNDV9KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5zZXRTaXplKDE1MCwgMTUwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiZWJhZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGV4dCB3aXRoIHVuZGVybGluZSBhbmQgc3RyaWtlIHRocm91Z2gKLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTYgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULlNIRUxMX1RSSU0gfCBTV1QuRE9VQkxFX0JVRkZFUkVEKTsJCi0Jc2hlbGwuc2V0VGV4dCgiVW5kZXJsaW5lLCBTdHJpa2UgT3V0Iik7Ci0JRm9udCBmb250ID0gc2hlbGwuZ2V0Rm9udCgpOwotCVN0cmluZyB0ZXh0ID0gIkhlcmUgaXMgc29tZSB0ZXh0IHRoYXQgaXMgdW5kZXJsaW5lZCBvciBzdHJ1Y2sgb3V0IG9yIGJvdGguIjsKLQlmaW5hbCBUZXh0TGF5b3V0IGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KGRpc3BsYXkpOwotCWxheW91dC5zZXRUZXh0KHRleHQpOwotCVRleHRTdHlsZSBzdHlsZTEgPSBuZXcgVGV4dFN0eWxlKGZvbnQsIG51bGwsIG51bGwpOwotCXN0eWxlMS51bmRlcmxpbmUgPSB0cnVlOwotCWxheW91dC5zZXRTdHlsZShzdHlsZTEsIDI2LCAzNSk7Ci0JVGV4dFN0eWxlIHN0eWxlMiA9IG5ldyBUZXh0U3R5bGUoZm9udCwgbnVsbCwgbnVsbCk7Ci0Jc3R5bGUyLnN0cmlrZW91dCA9IHRydWU7Ci0JbGF5b3V0LnNldFN0eWxlKHN0eWxlMiwgNDAsIDQ5KTsKLQlUZXh0U3R5bGUgc3R5bGUzID0gbmV3IFRleHRTdHlsZShmb250LCBudWxsLCBudWxsKTsKLQlzdHlsZTMudW5kZXJsaW5lID0gdHJ1ZTsKLQlzdHlsZTMuc3RyaWtlb3V0ID0gdHJ1ZTsKLQlsYXlvdXQuc2V0U3R5bGUoc3R5bGUzLCA1NCwgNTcpOwotCXNoZWxsLmFkZExpc3RlbmVyKFNXVC5QYWludCwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgcG9pbnQgPSBuZXcgUG9pbnQoMTAsIDEwKTsKLQkJCWludCB3aWR0aCA9IHNoZWxsLmdldENsaWVudEFyZWEoKS53aWR0aCAtIDIgKiBwb2ludC54OwotCQkJbGF5b3V0LnNldFdpZHRoKHdpZHRoKTsKLQkJCWxheW91dC5kcmF3KGV2ZW50LmdjLCBwb2ludC54LCBwb2ludC55KTsJCQotCQl9Ci0JfSk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCX0KLQlsYXlvdXQuZGlzcG9zZSgpOwkJCi0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjU3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTY3MTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1Ny5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEcmFnIHRleHQgc2VsZWN0aW9uIHdpdGhpbiBhIFN0eWxlZFRleHQgd2lkZ2V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjU3IHsKLQotCXN0YXRpYyBTdHJpbmcgc3RyaW5nMSA9ICJBIGRyYWcgc291cmNlIGlzIHRoZSBwcm92aWRlciBvZiBkYXRhIGluIGEgRHJhZyBhbmQgRHJvcCBkYXRhIHRyYW5zZmVyIGFzIHdlbGwgYXMgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgb3JpZ2luYXRvciBvZiB0aGUgRHJhZyBhbmQgRHJvcCBvcGVyYXRpb24uIFRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBkcmFnIHNvdXJjZSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heSBiZSB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGxvY2F0aW9uIGluIHRoZSBzYW1lIHdpZGdldCwgdG8gYSBkaWZmZXJlbnQgd2lkZ2V0ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLCBvciB0byBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhbHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIGRyYWcgdGV4dCBmcm9tIHlvdXIgYXBwbGljYXRpb24gYW5kIGRyb3AgaXQgb24gYW4gZW1haWwgYXBwbGljYXRpb24sIG9yIHlvdSAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIGRyYWcgYW4gaXRlbSBpbiBhIHRyZWUgYW5kIGRyb3AgaXQgYmVsb3cgYSBkaWZmZXJlbnQgbm9kZSBpbiB0aGUgc2FtZSB0cmVlLiI7Ci0KLQlzdGF0aWMgU3RyaW5nIERSQUdfU1RBUlRfREFUQSA9ICJEUkFHX1NUQVJUX0RBVEEiOwotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlzaGVsbC5zZXRTaXplKDEwMCwgMzAwKTsKLQlpbnQgc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVI7Ci0JZmluYWwgU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIHN0eWxlKTsKLQl0ZXh0LnNldFRleHQoc3RyaW5nMSk7Ci0JZmluYWwgRHJhZ1NvdXJjZSBzb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZSh0ZXh0LCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0Jc291cmNlLnNldERyYWdTb3VyY2VFZmZlY3QobmV3IERyYWdTb3VyY2VFZmZlY3QodGV4dCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5pbWFnZSA9IGRpc3BsYXkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0JCX0KLQl9KTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lcihuZXcgRHJhZ1NvdXJjZUFkYXB0ZXIoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbjsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJc2VsZWN0aW9uID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJCWV2ZW50LmRvaXQgPSBzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueTsKLQkJCXRleHQuc2V0RGF0YShEUkFHX1NUQVJUX0RBVEEsIHNlbGVjdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGUpIHsKLQkJCWUuZGF0YSA9IHRleHQuZ2V0VGV4dChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnktMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJUG9pbnQgbmV3U2VsZWN0aW9uPSB0ZXh0LmdldFNlbGVjdGlvbigpOwotCQkJCWludCBsZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQkJCWludCBkZWx0YSA9IDA7Ci0JCQkJaWYgKG5ld1NlbGVjdGlvbi54IDwgc2VsZWN0aW9uLngpCi0JCQkJCWRlbHRhID0gbGVuZ3RoOyAKLQkJCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2Uoc2VsZWN0aW9uLnggKyBkZWx0YSwgbGVuZ3RoLCAiIik7Ci0JCQl9Ci0JCQlzZWxlY3Rpb24gPSBudWxsOwotCQkJdGV4dC5zZXREYXRhKERSQUdfU1RBUlRfREFUQSwgbnVsbCk7Ci0JCX0KLQl9KTsKLQkKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRleHQsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTkspOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpID09IG51bGwpCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkJZWxzZSAKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWlmICh0ZXh0LmdldERhdGEoRFJBR19TVEFSVF9EQVRBKSA9PSBudWxsKQotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCWVsc2UgCi0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX01PVkU7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TQ1JPTEwgfCBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsICE9IERORC5EUk9QX05PTkUpIHsKLQkJCQlQb2ludCBzZWxlY3Rpb24gPSAoUG9pbnQpIHRleHQuZ2V0RGF0YShEUkFHX1NUQVJUX0RBVEEpOwotCQkJCWludCBpbnNlcnRQb3MgPSB0ZXh0LmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9NT1ZFICYmIHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi54IDw9IGluc2VydFBvcyAgJiYgaW5zZXJ0UG9zIDw9IHNlbGVjdGlvbi55IAotCQkJCQkJfHwgZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0NPUFkgJiYgc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnggPCBpbnNlcnRQb3MgICYmIGluc2VydFBvcyA8IHNlbGVjdGlvbi55KSB7Ci0JCQkJCXRleHQuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7ICAvLyBwcmV2ZW50IHNvdXJjZSBmcm9tIGRlbGV0aW5nIHNlbGVjdGlvbgotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKWV2ZW50LmRhdGE7Ci0JCQkJCXRleHQuaW5zZXJ0KHN0cmluZyk7Ci0JCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLQkJCQkJCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoaW5zZXJ0UG9zLCBzdHJpbmcubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0pOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjYzN2Y2Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDcmVhdGUgYSBzZWFyY2ggdGV4dCBjb250cm9sCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNTggewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5TRUFSQ0ggfCBTV1QuQ0FOQ0VMKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoKHRleHQuZ2V0U3R5bGUoKSAmIFNXVC5DQU5DRUwpID09IDApIHsKLQkJCWltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCBTbmlwcGV0MjU4LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImNhbmNlbC5naWYiKSk7Ci0JCQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUKTsKLQkJCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0ZXh0LnNldFRleHQoIiIpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlYXJjaCBjYW5jZWxsZWQiKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZXh0LnNldFRleHQoIlNlYXJjaCB0ZXh0Iik7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLmRldGFpbCA9PSBTV1QuQ0FOQ0VMKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoIGNhbmNlbGxlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VhcmNoaW5nIGZvcjogIiArIHRleHQuZ2V0VGV4dCgpICsgIi4uLiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJc2hlbGwucGFjaygpOwotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgaW1hZ2UuZGlzcG9zZSgpOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI1OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTUzNTRlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGV0ZWN0IGRyYWcgaW4gYSBjdXN0b20gY29udHJvbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjMKLSAqLyAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjU5IHsKLQotc3RhdGljIGNsYXNzIE15TGlzdCBleHRlbmRzIENhbnZhcyB7Ci0JaW50IHNlbGVjdGlvbjsKLQlTdHJpbmcgW10gaXRlbXMgPSBuZXcgU3RyaW5nIFswXTsKLQlzdGF0aWMgZmluYWwgaW50IElOU0VUX1ggPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5TRVRfWSA9IDI7Ci0JCi1zdGF0aWMgaW50IGNoZWNrU3R5bGUgKGludCBzdHlsZSkgewotCXN0eWxlICY9IH4oU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlzdHlsZSB8PSBTV1QuTk9fQkFDS0dST1VORCB8IFNXVC5OT19SRURSQVdfUkVTSVpFOwotCXJldHVybiBzdHlsZTsKLX0KLQotcHVibGljIE15TGlzdCAoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0Jc3VwZXIgKHBhcmVudCwgY2hlY2tTdHlsZSAoc3R5bGUpKTsKLQlzdXBlci5zZXREcmFnRGV0ZWN0IChmYWxzZSk7Ci0JYWRkTW91c2VMaXN0ZW5lciAobmV3IE1vdXNlQWRhcHRlciAoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG93biAoTW91c2VFdmVudCBldmVudCkgewotCQkJR0MgZ2MgPSBuZXcgR0MgKE15TGlzdC50aGlzKTsKLQkJCVJlY3RhbmdsZSBjbGllbnQgPSBnZXRDbGllbnRBcmVhKCk7Ci0JCQlpbnQgaW5kZXggPSAwLCB4ID0gY2xpZW50LnggKyBJTlNFVF9YLCB5ID0gY2xpZW50LnkgKyBJTlNFVF9ZOwotCQkJd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2luZGV4XSk7Ci0JCQkJUmVjdGFuZ2xlIGl0ZW0gPSBuZXcgUmVjdGFuZ2xlICh4LCB5LCBwdC54LCBwdC55KTsKLQkJCQlpZiAoaXRlbS5jb250YWlucyAoZXZlbnQueCwgZXZlbnQueSkpIGJyZWFrOwotCQkJCXkgKz0gcHQueTsKLQkJCQlpZiAoIWNsaWVudC5jb250YWlucyAoeCwgeSkpIHJldHVybjsKLQkJCQlpbmRleCsrOwotCQkJfQotCQkJZ2MuZGlzcG9zZSAoKTsKLQkJCWlmIChpbmRleCA9PSBpdGVtcy5sZW5ndGggfHwgIWNsaWVudC5jb250YWlucyAoeCwgeSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZWxlY3Rpb24gPSBpbmRleDsKLQkJCXJlZHJhdyAoKTsKLQkJCXVwZGF0ZSAoKTsKLQkJCWRyYWdEZXRlY3QgKGV2ZW50KTsKLQkJfQotCX0pOwotCWFkZFBhaW50TGlzdGVuZXIgKG5ldyBQYWludExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sIChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCQlHQyBnYyA9IGV2ZW50LmdjOwotCQkJQ29sb3IgZm9yZWdyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQkJQ29sb3IgYmFja2dyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCQkJQ29sb3Igc2VsZWN0Rm9yZWdyb3VuZCA9IGV2ZW50LmRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTl9URVhUKTsKLQkJCUNvbG9yIHNlbGVjdEJhY2tncm91bmQgPSBldmVudC5kaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCAoZm9yZWdyb3VuZCk7Ci0JCQlnYy5zZXRCYWNrZ3JvdW5kIChiYWNrZ3JvdW5kKTsKLQkJCU15TGlzdC50aGlzLmRyYXdCYWNrZ3JvdW5kIChnYywgZXZlbnQueCwgZXZlbnQueSwgZXZlbnQud2lkdGgsIGV2ZW50LmhlaWdodCk7Ci0JCQlpbnQgeCA9IElOU0VUX1gsIHkgPSBJTlNFVF9ZOwotCQkJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoaXRlbXMgW2ldKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kIChpID09IHNlbGVjdGlvbiA/IHNlbGVjdEZvcmVncm91bmQgOiBmb3JlZ3JvdW5kKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kIChpID09IHNlbGVjdGlvbiA/IHNlbGVjdEJhY2tncm91bmQgOiBiYWNrZ3JvdW5kKTsKLQkJCQlnYy5kcmF3U3RyaW5nIChpdGVtcyBbaV0sIHgsIHkpOwotCQkJCXkgKz0gcHQueTsKLQkJCX0KLQkJCQotCQl9Ci0JfSk7Ci19Ci0KLXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZSAoaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gY2hhbmdlZCkgewotCUdDIGdjID0gbmV3IEdDICh0aGlzKTsKLQlpbnQgaW5kZXggPSAwLCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0Jd2hpbGUgKGluZGV4IDwgaXRlbXMubGVuZ3RoKSB7Ci0JCVBvaW50IHB0ID0gZ2Muc3RyaW5nRXh0ZW50KGl0ZW1zIFtpbmRleF0pOwotCQl3aWR0aCA9IE1hdGgubWF4ICh3aWR0aCwgcHQueCk7Ci0JCWhlaWdodCArPSBwdC55OwotCQlpbmRleCsrOwotCX0KLQlnYy5kaXNwb3NlICgpOwotCXdpZHRoICs9IElOU0VUX1ggKiAyOwotCWhlaWdodCArPSBJTlNFVF9ZICogMjsKLQlSZWN0YW5nbGUgcmVjdCA9IGNvbXB1dGVUcmltICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQlyZXR1cm4gbmV3IFBvaW50IChyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgW10gZ2V0SXRlbXMgKCkgewotCWNoZWNrV2lkZ2V0ICgpOwotCXJldHVybiBpdGVtczsKLX0KLQotcHVibGljIHZvaWQgc2V0SXRlbXMgKFN0cmluZyBbXSBpdGVtcykgewotCWNoZWNrV2lkZ2V0ICgpOwotCWlmIChpdGVtcyA9PSBudWxsKSBTV1QuZXJyb3IgKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JcmVkcmF3ICgpOwkKLX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCU15TGlzdCB0MSA9IG5ldyBNeUxpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl0MS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IlNvbWUiLCAiaXRlbXMiLCAiaW4iLCAidGhlIiwgImxpc3QifSk7Ci0JdDEuYWRkRHJhZ0RldGVjdExpc3RlbmVyIChuZXcgRHJhZ0RldGVjdExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0RldGVjdGVkIChEcmFnRGV0ZWN0RXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRyYWcgc3RhcnRlZCAuLi4iKTsKLQkJfQotCX0pOwotCU15TGlzdCB0MiA9IG5ldyBNeUxpc3QgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl0Mi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IlNvbWUiLCAiaXRlbXMiLCAiaW4iLCAiYW5vdGhlciIsICJsaXN0In0pOwotCXQyLmFkZERyYWdEZXRlY3RMaXN0ZW5lciAobmV3IERyYWdEZXRlY3RMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdEZXRlY3RlZCAoRHJhZ0RldGVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJEcmFnIHN0YXJ0ZWQgLi4uIik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NlNWU4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbWJvIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY29tYm8gYm94IChub24tZWRpdGFibGUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8gKHNoZWxsLCBTV1QuUkVBRF9PTkxZKTsKLQljb21iby5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkEiLCAiQiIsICJDIn0pOwotCWNvbWJvLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1OTMxYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTW96aWxsYSBpbiBhIEJyb3dzZXIKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNjAgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJc2hlbGwuc2V0VGV4dCgiTW96aWxsYSIpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXI7Ci0JCXRyeSB7Ci0JCQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5NT1pJTExBKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgQnJvd3NlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vbW96aWxsYS5vcmciKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTA4YzYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBPcGVuIGFuIE9MRSBFeGNlbCBzaGVldC4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2MSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0VGV4dCgiRXhjZWwgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlPbGVGcmFtZSBmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiRXhjZWwuU2hlZXQiKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlNZW51SXRlbSBtZW51RmlsZUNvbnRyb2wgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVDb250cm9sLnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVDb250cm9sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwOGE1NC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFdvcmQgZG9jdW1lbnQuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIFNuaXBwZXQyNjIgewotCXN0YXRpYyBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0Jc3RhdGljIE9sZUZyYW1lIGZyYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIldvcmQgRXhhbXBsZSIpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRyeSB7Ci0JCQlmcmFtZSA9IG5ldyBPbGVGcmFtZShzaGVsbCwgU1dULk5PTkUpOwotCQkJY2xpZW50U2l0ZSA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIldvcmQuRG9jdW1lbnQiKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gc2hlbGwuZ2V0TWVudUJhcigpOwotCQlpZiAobWVudUJhciA9PSBudWxsKSB7Ci0JCQltZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQkJc2hlbGwuc2V0TWVudUJhcihtZW51QmFyKTsKLQkJfQotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlmcmFtZS5zZXRGaWxlTWVudXMobmV3IE1lbnVJdGVtW10geyBmaWxlTWVudSB9KTsKLQotCQlNZW51SXRlbSBtZW51RmlsZU9wZW4gPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVPcGVuLnNldFRleHQoIk9wZW4uLi4iKTsKLQkJbWVudUZpbGVPcGVuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZpbGVPcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlNZW51SXRlbSBtZW51RmlsZUV4aXQgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVFeGl0LnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVFeGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmlsZU9wZW4oKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coY2xpZW50U2l0ZS5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmRvYyIgfSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQljbGllbnRTaXRlLmRpc3Bvc2UoKTsKLQkJCWNsaWVudFNpdGUgPSBuZXcgT2xlQ2xpZW50U2l0ZShmcmFtZSwgU1dULk5PTkUsICJXb3JkLkRvY3VtZW50IiwgbmV3IEZpbGUoZmlsZU5hbWUpKTsKLQkJCWNsaWVudFNpdGUuZG9WZXJiKE9MRS5PTEVJVkVSQl9JTlBMQUNFQUNUSVZBVEUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwYmZkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjYzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIFBvd2VyUG9pbnQgc2xpZGUuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovIAotcHVibGljIGNsYXNzIFNuaXBwZXQyNjMgewotCXN0YXRpYyBPbGVDbGllbnRTaXRlIGNsaWVudFNpdGU7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRUZXh0KCJQb3dlclBvaW50IEV4YW1wbGUiKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0cnkgewotCQkJT2xlRnJhbWUgZnJhbWUgPSBuZXcgT2xlRnJhbWUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCWNsaWVudFNpdGUgID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiUG93ZXJQb2ludC5TbGlkZSIpOwotCQkJYWRkRmlsZU1lbnUoZnJhbWUpOwotCQl9IGNhdGNoIChTV1RFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBvcGVuIGFjdGl2ZVggY29udHJvbCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNoZWxsLnNldFNpemUoODAwLCA2MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0JCi0Jc3RhdGljIHZvaWQgYWRkRmlsZU1lbnUoT2xlRnJhbWUgZnJhbWUpIHsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBmcmFtZS5nZXRTaGVsbCgpOwotCQlNZW51IG1lbnVCYXIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0JCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCU1lbnVJdGVtIGZpbGVNZW51ID0gbmV3IE1lbnVJdGVtKG1lbnVCYXIsIFNXVC5DQVNDQURFKTsKLQkJZmlsZU1lbnUuc2V0VGV4dCgiJkZpbGUiKTsKLQkJTWVudSBtZW51RmlsZSA9IG5ldyBNZW51KGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuc2V0TWVudShtZW51RmlsZSk7Ci0JCU1lbnVJdGVtIG1lbnVGaWxlQ29udHJvbCA9IG5ldyBNZW51SXRlbShtZW51RmlsZSwgU1dULkNBU0NBREUpOwotCQltZW51RmlsZUNvbnRyb2wuc2V0VGV4dCgiRXhpdCIpOwotCQltZW51RmlsZUNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZDhiZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoKLSAqIE9wZW4gYW4gT0xFIE1lZGlhIFBsYXllci4KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8gCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2NCB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk1lZGlhIFBsYXllciBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQljbGllbnRTaXRlICA9IG5ldyBPbGVDbGllbnRTaXRlKGZyYW1lLCBTV1QuTk9ORSwgIk1QbGF5ZXIiKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZEZpbGVNZW51KE9sZUZyYW1lIGZyYW1lKSB7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZnJhbWUuZ2V0U2hlbGwoKTsKLQkJTWVudSBtZW51QmFyID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCQlzaGVsbC5zZXRNZW51QmFyKG1lbnVCYXIpOwotCQlNZW51SXRlbSBmaWxlTWVudSA9IG5ldyBNZW51SXRlbShtZW51QmFyLCBTV1QuQ0FTQ0FERSk7Ci0JCWZpbGVNZW51LnNldFRleHQoIiZGaWxlIik7Ci0JCU1lbnUgbWVudUZpbGUgPSBuZXcgTWVudShmaWxlTWVudSk7Ci0JCWZpbGVNZW51LnNldE1lbnUobWVudUZpbGUpOwotCQlNZW51SXRlbSBtZW51RmlsZUNvbnRyb2wgPSBuZXcgTWVudUl0ZW0obWVudUZpbGUsIFNXVC5DQVNDQURFKTsKLQkJbWVudUZpbGVDb250cm9sLnNldFRleHQoIkV4aXQiKTsKLQkJbWVudUZpbGVDb250cm9sLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWZyYW1lLnNldEZpbGVNZW51cyhuZXcgTWVudUl0ZW1bXSB7IGZpbGVNZW51IH0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWIyMGMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI2NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBPcGVuIGFuIE9MRSBXaW5kb3dzIE1lZGlhIFBsYXllci4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2NSB7Ci0Jc3RhdGljIE9sZUNsaWVudFNpdGUgY2xpZW50U2l0ZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldFRleHQoIk1lZGlhIFBsYXllciBFeGFtcGxlIik7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdHJ5IHsKLQkJCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQljbGllbnRTaXRlID0gbmV3IE9sZUNsaWVudFNpdGUoZnJhbWUsIFNXVC5OT05FLCAiV01QbGF5ZXIuT0NYIik7Ci0JCQljbGllbnRTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQkJCWFkZEZpbGVNZW51KGZyYW1lKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiBhY3RpdmVYIGNvbnRyb2wiKTsKLQkJCXJldHVybjsKLQkJfQotCQlzaGVsbC5zZXRTaXplKDgwMCwgNjAwKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGRGaWxlTWVudShPbGVGcmFtZSBmcmFtZSkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IGZyYW1lLmdldFNoZWxsKCk7Ci0JCU1lbnUgbWVudUJhciA9IHNoZWxsLmdldE1lbnVCYXIoKTsKLQkJaWYgKG1lbnVCYXIgPT0gbnVsbCkgewotCQkJbWVudUJhciA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQkJCXNoZWxsLnNldE1lbnVCYXIobWVudUJhcik7Ci0JCX0KLQkJTWVudUl0ZW0gZmlsZU1lbnUgPSBuZXcgTWVudUl0ZW0obWVudUJhciwgU1dULkNBU0NBREUpOwotCQlmaWxlTWVudS5zZXRUZXh0KCImRmlsZSIpOwotCQlNZW51IG1lbnVGaWxlID0gbmV3IE1lbnUoZmlsZU1lbnUpOwotCQlmaWxlTWVudS5zZXRNZW51KG1lbnVGaWxlKTsKLQkJZnJhbWUuc2V0RmlsZU1lbnVzKG5ldyBNZW51SXRlbVtdIHsgZmlsZU1lbnUgfSk7Ci0KLQkJTWVudUl0ZW0gbWVudUZpbGVPcGVuID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlT3Blbi5zZXRUZXh0KCJPcGVuLi4uIik7Ci0JCW1lbnVGaWxlT3Blbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaWxlT3BlbigpOwotCQkJfQotCQl9KTsKLQkJTWVudUl0ZW0gbWVudUZpbGVFeGl0ID0gbmV3IE1lbnVJdGVtKG1lbnVGaWxlLCBTV1QuQ0FTQ0FERSk7Ci0JCW1lbnVGaWxlRXhpdC5zZXRUZXh0KCJFeGl0Iik7Ci0JCW1lbnVGaWxlRXhpdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXN0YXRpYyB2b2lkIGZpbGVPcGVuKCkgewotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGNsaWVudFNpdGUuZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi53bXYiIH0pOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJT2xlQXV0b21hdGlvbiBwbGF5ZXIgPSBuZXcgT2xlQXV0b21hdGlvbihjbGllbnRTaXRlKTsKLQkJCWludCBwbGF5VVJMW10gPSBwbGF5ZXIuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiVVJMIiB9KTsKLQkJCWlmIChwbGF5VVJMICE9IG51bGwpIHsKLQkJCQlWYXJpYW50IHRoZUZpbGUgPSBuZXcgVmFyaWFudChmaWxlbmFtZSk7Ci0JCQkJcGxheWVyLnNldFByb3BlcnR5KHBsYXlVUkxbMF0sIHRoZUZpbGUpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllN2EwYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qCi0gKiBTcGFuIGFuZCBjZW50ZXIgY29sdW1ucyB3aXRoIGEgR3JpZExheW91dC4KLSAqIAotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMwotICovCi1wdWJsaWMgY2xhc3MgU25pcHBldDI2NiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQkKLQkJVGFiRm9sZGVyIHRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQkKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiV2lkZ2V0Iik7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlUcmVlIHRyZWUgPSBuZXcgVHJlZShjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlpdGVtLnNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dCgiU3RhbmRhcmQiKTsKLQkJVHJlZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoIldpZGdldCIpOwotCQlUcmVlSXRlbSBicmFuY2ggPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlicmFuY2guc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiRWZmaWNpZW50IiwgIlBvcnRhYmxlIn0pOwotCQlUcmVlSXRlbSBsZWFmID0gbmV3IFRyZWVJdGVtKGJyYW5jaCwgU1dULk5PTkUpOwotCQlsZWFmLnNldFRleHQobmV3IFN0cmluZyBbXSB7IkNyb3NzIiwgIlBsYXRmb3JtIn0pOwotCQlicmFuY2guc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCWJyYW5jaCA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWJyYW5jaC5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJOYXRpdmUiLCAiQ29udHJvbHMifSk7Ci0JCWxlYWYgPSBuZXcgVHJlZUl0ZW0oYnJhbmNoLCBTV1QuTk9ORSk7Ci0JCWxlYWYuc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQ3Jvc3MiLCAiUGxhdGZvcm0ifSk7Ci0JCWJyYW5jaCA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7Ci0JCWJyYW5jaC5zZXRUZXh0KG5ldyBTdHJpbmcgW10geyJDcm9zcyIsICJQbGF0Zm9ybSJ9KTsKLQkJY29sdW1uMS5wYWNrKCk7Ci0JCWNvbHVtbjIucGFjaygpOwotCi0JCWl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJUb29sa2l0Iik7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQoIlRvdGFsbHkiKTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkKLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCgiQXdlc29tZSIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyNjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4MzBhMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjY3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcubW96aWxsYS5pbnRlcmZhY2VzLio7Ci0KLS8qCi0gKiBCcm93c2VyIGV4YW1wbGUgc25pcHBldDogVG9nZ2xlIGEgTW96aWxsYSBCcm93c2VyIGJldHdlZW4gRGVzaWduIG1vZGUgYW5kIFZpZXcgbW9kZS4KLSAqIAotICogSU1QT1JUQU5UOiBGb3IgdGhpcyBzbmlwcGV0IHRvIHdvcmsgcHJvcGVybHkgYWxsIG9mIHRoZSByZXF1aXJlbWVudHMgZm9yIHJ1bm5pbmcgYQotICogTW96aWxsYS1iYXNlZCBCcm93c2VyIGluc3RhbmNlIGxpc3RlZCBpbiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9mYXEucGhwI2hvd3VzZW1vemlsbGEKLSAqIG11c3QgYmUgc2F0aXNmaWVkLgotICogCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICogCi0gKiBAc2luY2UgMy4zCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MjY3IHsKLQlzdGF0aWMgQnJvd3NlciBicm93c2VyOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJc2hlbGwuc2V0VGV4dCgiVXNlIE1vemlsbGEncyBEZXNpZ24gTW9kZSIpOwotCQl0cnkgewotCQkJYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTU9aSUxMQSk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIEJyb3dzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0KLQkJZmluYWwgQnV0dG9uIG9mZkJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5SQURJTyk7Ci0JCW9mZkJ1dHRvbi5zZXRUZXh0KCJEZXNpZ24gTW9kZSBPZmYiKTsKLQkJb2ZmQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvZmZCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHJldHVybjsKLQkJCQlzZXREZXNpZ25Nb2RlKCJvZmYiKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIEJ1dHRvbiBvbkJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5SQURJTyk7Ci0JCW9uQnV0dG9uLnNldFRleHQoIkRlc2lnbiBNb2RlIE9uIik7Ci0JCW9uQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgcmV0dXJuOwotCQkJCWJvb2xlYW4gc3VjY2VzcyA9IHNldERlc2lnbk1vZGUoIm9uIik7Ci0JCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJCW9uQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCW9mZkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJb2ZmQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQlicm93c2VyLnNldFVybCgiaHR0cDovL3d3dy5nb29nbGUuY29tIik7Ci0JCXNoZWxsLnNldFNpemUoNDAwLDQwMCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0RGVzaWduTW9kZShTdHJpbmcgdmFsdWUpIHsKLQkJbnNJV2ViQnJvd3NlciB3ZWJCcm93c2VyID0gKG5zSVdlYkJyb3dzZXIpYnJvd3Nlci5nZXRXZWJCcm93c2VyKCk7Ci0JCWlmICh3ZWJCcm93c2VyID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGdldCB0aGUgbnNJV2ViQnJvd3NlciBmcm9tIHRoZSBCcm93c2VyIHdpZGdldCIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCW5zSURPTVdpbmRvdyB3aW5kb3cgPSB3ZWJCcm93c2VyLmdldENvbnRlbnRET01XaW5kb3coKTsKLQkJbnNJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSB3aW5kb3cuZ2V0RG9jdW1lbnQoKTsKLQkJbnNJRE9NTlNIVE1MRG9jdW1lbnQgbnNEb2N1bWVudCA9IChuc0lET01OU0hUTUxEb2N1bWVudClkb2N1bWVudC5xdWVyeUludGVyZmFjZShuc0lET01OU0hUTUxEb2N1bWVudC5OU19JRE9NTlNIVE1MRE9DVU1FTlRfSUlEKTsKLQkJbnNEb2N1bWVudC5zZXREZXNpZ25Nb2RlKHZhbHVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzYTljMi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IG9wZW4gYSBzaGVsbCBtaW5pbWl6ZWQgKGljb25pZmllZCkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRNaW5pbWl6ZWQgKHRydWUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTFmY2MuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiBvcGVuIGEgc2hlbGwgbWF4aW1pemVkIChmdWxsIHNjcmVlbikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQyOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRNYXhpbWl6ZWQgKHRydWUpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQyOS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGMzNmYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDI5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGJhciBhbmQgcHVsbCBkb3duIG1lbnUgKGFjY2VsZXJhdG9ycywgbW5lbW9uaWNzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDI5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCU1lbnUgYmFyID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyIChiYXIpOwotCU1lbnVJdGVtIGZpbGVJdGVtID0gbmV3IE1lbnVJdGVtIChiYXIsIFNXVC5DQVNDQURFKTsKLQlmaWxlSXRlbS5zZXRUZXh0ICgiJkZpbGUiKTsKLQlNZW51IHN1Ym1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCWZpbGVJdGVtLnNldE1lbnUgKHN1Ym1lbnUpOwotCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKHN1Ym1lbnUsIFNXVC5QVVNIKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0IEFsbCIpOwotCQl9Ci0JfSk7Ci0JaXRlbS5zZXRUZXh0ICgiU2VsZWN0ICZBbGxcdEN0cmwrQSIpOwotCWl0ZW0uc2V0QWNjZWxlcmF0b3IgKFNXVC5NT0QxICsgJ0EnKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZjFlZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogZmluZCBhIHRhYmxlIGNlbGwgZnJvbSBtb3VzZSBkb3duIChTV1QuRlVMTF9TRUxFQ1RJT04pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0JCQl8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZmluYWwgaW50IHJvd0NvdW50ID0gNjQsIGNvbHVtbkNvdW50ID0gNDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KCJDb2x1bW4gIiArIGkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewotCQkJaXRlbS5zZXRUZXh0KGosICJJdGVtICIgKyBpICsgIi0iICsgaik7Ci0JCX0KLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0JfQotCVBvaW50IHNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgMjAwKTsKLQl0YWJsZS5zZXRTaXplKHNpemUpOwotCXNoZWxsLnBhY2soKTsKLQl0YWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0SXRlbShwdCk7Ci0JCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoaSk7Ci0JCQkJaWYgKHJlY3QuY29udGFpbnMocHQpKSB7Ci0JCQkJCWludCBpbmRleCA9IHRhYmxlLmluZGV4T2YoaXRlbSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSXRlbSAiICsgaW5kZXggKyAiLSIgKyBpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiZDc2MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmFtIGV4YW1wbGUgc25pcHBldDogaW52b2tlIHRoZSBzeXN0ZW0gdGV4dCBlZGl0b3Igb24gYXV0b2V4ZWMuYmF0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVByb2dyYW0gcCA9IFByb2dyYW0uZmluZFByb2dyYW0gKCIudHh0Iik7Ci0JaWYgKHAgIT0gbnVsbCkgcC5leGVjdXRlICgiYzpcXGF1dG9leGVjLmJhdCIpOyAvLyBXaW5kb3dzLXNwZWNpZmljIGZpbGVuYW1lCi0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5OGMxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmFja2VyIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgdHJhY2tlciAoZHJhZyB3aGVuICJ0b3JuIG9mZiIpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlQb2ludCBwb2ludCA9IG51bGw7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgSklUVEVSID0gODsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCXBvaW50ID0gbmV3IFBvaW50IChldmVudC54LCBldmVudC55KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAocG9pbnQgPT0gbnVsbCkgcmV0dXJuOwotCQkJCQlpbnQgZGVsdGFYID0gcG9pbnQueCAtIGV2ZW50LngsIGRlbHRhWSA9IHBvaW50LnkgLSBldmVudC55OwotCQkJCQlpZiAoTWF0aC5hYnMgKGRlbHRhWCkgPCBKSVRURVIgJiYgTWF0aC5hYnMgKGRlbHRhWSkgPCBKSVRURVIpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlUcmFja2VyIHRyYWNrZXIgPSBuZXcgVHJhY2tlciAoZGlzcGxheSwgU1dULk5PTkUpOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGRpc3BsYXkubWFwIChzaGVsbCwgbnVsbCwgc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JCQkJCXJlY3QueCAtPSBkZWx0YVg7Ci0JCQkJCXJlY3QueSAtPSBkZWx0YVk7Ci0JCQkJCXRyYWNrZXIuc2V0UmVjdGFuZ2xlcyAobmV3IFJlY3RhbmdsZSBbXSB7cmVjdH0pOwotCQkJCQl0cmFja2VyLm9wZW4gKCk7Ci0JCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCQkJcG9pbnQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxpc3RlbmVyKTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlTW92ZSwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxY2JkYTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUHJvZ3JhbSBleGFtcGxlIHNuaXBwZXQ6IGZpbmQgdGhlIGljb24gb2YgdGhlIHByb2dyYW0gdGhhdCBlZGl0cyAuYm1wIGZpbGVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzMiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5OT05FKTsKLQlsYWJlbC5zZXRUZXh0ICgiQ2FuJ3QgZmluZCBpY29uIGZvciAuYm1wIik7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCVByb2dyYW0gcCA9IFByb2dyYW0uZmluZFByb2dyYW0gKCIuYm1wIik7Ci0JaWYgKHAgIT0gbnVsbCkgewotCQlJbWFnZURhdGEgZGF0YSA9IHAuZ2V0SW1hZ2VEYXRhICgpOwotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgZGF0YSk7Ci0JCQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCQl9Ci0JfQotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWlmIChpbWFnZSAhPSBudWxsKSBpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzMy5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmM5MTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlyZWN0b3J5RGlhbG9nIGV4YW1wbGUgc25pcHBldDogcHJvbXB0IGZvciBhIGRpcmVjdG9yeQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDMzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLm9wZW4gKCk7Ci0JRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cgKHNoZWxsKTsKLQlkaWFsb2cuc2V0RmlsdGVyUGF0aCAoImM6XFwiKTsgLy9XaW5kb3dzIHNwZWNpZmljCi0JU3lzdGVtLm91dC5wcmludGxuICgiUkVTVUxUPSIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3NjVjYi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTGFiZWwgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBsYWJlbCAod2l0aCBhbiBpbWFnZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlDb2xvciBjb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbC5zZXRJbWFnZSAoaW1hZ2UpOwotCWxhYmVsLnBhY2sgKCk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOyAKLQl9IAotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzODdjZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAobm8gY29sdW1ucywgbm8gaGVhZGVycykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIDApOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdGFibGUuc2V0U2l6ZSAoMTAwLCAxMDApOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTcyODQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBmbGF0IHRvb2wgYmFyIChpbWFnZXMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAxNiwgMTYpOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUb29sQmFyIHRvb2xCYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5GTEFUIHwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQl9Ci0JdG9vbEJhci5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzcuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmNmNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQzNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIExhYmVsIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbGFiZWwgKGEgc2VwYXJhdG9yKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzNyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQluZXcgTGFiZWwgKHNoZWxsLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCW5ldyBMYWJlbCAoc2hlbGwsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhZTNhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYmxlIChjb2x1bW5zLCBoZWFkZXJzLCBsaW5lcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQzOCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSAoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSAodHJ1ZSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSAodHJ1ZSk7Ci0JU3RyaW5nW10gdGl0bGVzID0geyIgIiwgIkMiLCAiISIsICJEZXNjcmlwdGlvbiIsICJSZXNvdXJjZSIsICJJbiBGb2xkZXIiLCAiTG9jYXRpb24ifTsKLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbiAodGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQgKHRpdGxlcyBbaV0pOwotCX0JCi0JaW50IGNvdW50ID0gMTI4OwotCWZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgwLCAieCIpOwotCQlpdGVtLnNldFRleHQgKDEsICJ5Iik7Ci0JCWl0ZW0uc2V0VGV4dCAoMiwgIiEiKTsKLQkJaXRlbS5zZXRUZXh0ICgzLCAidGhpcyBzdHVmZiBiZWhhdmVzIHRoZSB3YXkgSSBleHBlY3QiKTsKLQkJaXRlbS5zZXRUZXh0ICg0LCAiYWxtb3N0IGV2ZXJ5d2hlcmUiKTsKLQkJaXRlbS5zZXRUZXh0ICg1LCAic29tZS5mb2xkZXIiKTsKLQkJaXRlbS5zZXRUZXh0ICg2LCAibGluZSAiICsgaSArICIgaW4gbm93aGVyZSIpOwotCX0KLQlmb3IgKGludCBpPTA7IGk8dGl0bGVzLmxlbmd0aDsgaSsrKSB7Ci0JCXRhYmxlLmdldENvbHVtbiAoaSkucGFjayAoKTsKLQl9CQotCXRhYmxlLnNldFNpemUgKHRhYmxlLmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgMjAwKSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDM5LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjNDJhNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0MzkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0MzkgewotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjODQxMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgZXNjYXBlIGZyb20gY2xvc2luZyBhIGRpYWxvZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQliLnNldFRleHQoIk9wZW4gRGlhbG9nIC4uLiIpOwotCQliLnBhY2soKTsKLQkJYi5zZXRMb2NhdGlvbigxMCwgMTApOwotCQliLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKLQkJCQlTaGVsbCBkaWFsb2cgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JCQkJZGlhbG9nLmFkZExpc3RlbmVyKFNXVC5UcmF2ZXJzZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX0VTQ0FQRSkgewotCQkJCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODI1NzZiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgcG9wdXAgbWVudSAoc2V0IGluIG11bHRpcGxlIGNvbnRyb2xzKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMS5zZXRTaXplICgxMDAsIDEwMCk7Ci0JQ29tcG9zaXRlIGMyID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWMyLnNldEJvdW5kcyAoMTAwLCAwLCAxMDAsIDEwMCk7Ci0JTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlNZW51SXRlbSBpdGVtID0gbmV3IE1lbnVJdGVtIChtZW51LCBTV1QuUFVTSCk7Ci0JaXRlbS5zZXRUZXh0ICgiUG9wdXAiKTsKLQljMS5zZXRNZW51IChtZW51KTsKLQljMi5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRNZW51IChtZW51KTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MGUxOWMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbCBUaXBzIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIHRvb2wgdGlwcyBmb3IgYSB0YWIgaXRlbSwgdG9vbCBpdGVtLCBhbmQgc2hlbGwKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCVN0cmluZyBzdHJpbmcgPSAiVGhpcyBpcyBhIHN0cmluZ1xud2l0aCBhIG5ldyBsaW5lLiI7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyIChzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9sZGVyLnNldFNpemUgKDIwMCwgMjAwKTsKLQlUYWJJdGVtIGl0ZW0wID0gbmV3IFRhYkl0ZW0gKGZvbGRlciwgMCk7Ci0JaXRlbTAuc2V0VG9vbFRpcFRleHQgKCJUYWJJdGVtIHRvb2xUaXA6ICIgKyBzdHJpbmcpOwotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQliYXIuc2V0Qm91bmRzICgwLCAyMDAsIDIwMCwgNjQpOwotCVRvb2xJdGVtIGl0ZW0xID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCWl0ZW0xLnNldFRvb2xUaXBUZXh0ICgiVG9vbEl0ZW0gdG9vbFRpcDogIiArIHN0cmluZyk7Ci0Jc2hlbGwuc2V0VG9vbFRpcFRleHQgKCJTaGVsbCB0b29sVGlwOiAiICsgc3RyaW5nKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkZjQxZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBEaXNwbGF5IGV4YW1wbGUgc25pcHBldDogZ2V0IHRoZSBib3VuZHMgYW5kIGNsaWVudCBhcmVhIG9mIGEgZGlzcGxheQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuICgiRGlzcGxheSBCb3VuZHM9IiArIGRpc3BsYXkuZ2V0Qm91bmRzICgpICsgIiBEaXNwbGF5IENsaWVudEFyZWE9IiArIGRpc3BsYXkuZ2V0Q2xpZW50QXJlYSAoKSk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTYzNDQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogQ2FyZXQgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjYXJldCAodXNpbmcgYW4gaW1hZ2UpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIDIwLCAyMCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZCAod2hpdGUpOwotCWdjLmRyYXdMaW5lICgwLCAwLCAxOSwgMTkpOwotCWdjLmRyYXdMaW5lICgxOSwgMCwgMCwgMTkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JY2FyZXQuc2V0TG9jYXRpb24gKDEwLCAxMCk7Ci0JY2FyZXQuc2V0SW1hZ2UgKGltYWdlKTsKLQlnYyA9IG5ldyBHQyAoc2hlbGwpOwotCWdjLmRyYXdJbWFnZSAoaW1hZ2UsIDEwLCA2NCk7Ci0JY2FyZXQuc2V0VmlzaWJsZSAoZmFsc2UpOwotCWdjLmRyYXdTdHJpbmcgKCJUZXN0IiwgMTIsIDEyKTsKLQljYXJldC5zZXRWaXNpYmxlICh0cnVlKTsKLQlnYy5kaXNwb3NlICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2ODY4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIEN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IHNldCB0aGUgaGFuZCBjdXJzb3IgaW50byBhIGNvbnRyb2wKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIEN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yIChkaXNwbGF5LCBTV1QuQ1VSU09SX0hBTkQpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5vcGVuICgpOwotCWZpbmFsIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbiAoc2hlbGwsIDApOwotCWIuc2V0Qm91bmRzICgxMCwgMTAsIDIwMCwgMjAwKTsKLQliLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJYi5zZXRDdXJzb3IgKGN1cnNvcik7Ci0JCX0KLQl9KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY3Vyc29yLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWNlZTMuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2NhbGUgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBzY2FsZSAobWF4aW11bSA0MCwgcGFnZSBpbmNyZW1lbnQgNSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlTY2FsZSBzY2FsZSA9IG5ldyBTY2FsZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCXNjYWxlLnNldFNpemUgKDIwMCwgNjQpOwotCXNjYWxlLnNldE1heGltdW0gKDQwKTsKLQlzY2FsZS5zZXRQYWdlSW5jcmVtZW50ICg1KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhYzYyOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogaW50ZXJjZXB0IG1vdXNlIGV2ZW50cyAoZHJhZyBhIGJ1dHRvbiB3aXRoIHRoZSBtb3VzZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDYgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChzaGVsbCwgU1dULk5PTkUpOwotCWNvbXBvc2l0ZS5zZXRFbmFibGVkIChmYWxzZSk7Ci0JY29tcG9zaXRlLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uIChjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIkJ1dHRvbiIpOwotCWNvbXBvc2l0ZS5wYWNrICgpOwotCWNvbXBvc2l0ZS5zZXRMb2NhdGlvbiAoMTAsIDEwKTsKLQlmaW5hbCBQb2ludCBbXSBvZmZzZXQgPSBuZXcgUG9pbnQgWzFdOwotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQljYXNlIFNXVC5Nb3VzZURvd246Ci0JCQkJCVJlY3RhbmdsZSByZWN0ID0gY29tcG9zaXRlLmdldEJvdW5kcyAoKTsKLQkJCQkJaWYgKHJlY3QuY29udGFpbnMgKGV2ZW50LngsIGV2ZW50LnkpKSB7Ci0JCQkJCQlQb2ludCBwdDEgPSBjb21wb3NpdGUudG9EaXNwbGF5ICgwLCAwKTsKLQkJCQkJCVBvaW50IHB0MiA9IHNoZWxsLnRvRGlzcGxheSAoZXZlbnQueCwgZXZlbnQueSk7IAotCQkJCQkJb2Zmc2V0IFswXSA9IG5ldyBQb2ludCAocHQyLnggLSBwdDEueCwgcHQyLnkgLSBwdDEueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAob2Zmc2V0IFswXSAhPSBudWxsKSB7Ci0JCQkJCQlQb2ludCBwdCA9IG9mZnNldCBbMF07Ci0JCQkJCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGV2ZW50LnggLSBwdC54LCBldmVudC55IC0gcHQueSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuTW91c2VVcDoKLQkJCQkJb2Zmc2V0IFswXSA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VVcCwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDU1Y2EuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0b29sIGJhciAobm9ybWFsLCBob3QgYW5kIGRpc2FibGVkIGltYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ0NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUNvbG9yIGNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0JMVUUpOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGltYWdlLmdldEJvdW5kcyAoKSk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQkKLQlJbWFnZSBkaXNhYmxlZEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCWNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0dSRUVOKTsKLQlnYyA9IG5ldyBHQyAoZGlzYWJsZWRJbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCWdjLmZpbGxSZWN0YW5nbGUgKGRpc2FibGVkSW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCQotCUltYWdlIGhvdEltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCWNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZ2MgPSBuZXcgR0MgKGhvdEltYWdlKTsKLQlnYy5zZXRCYWNrZ3JvdW5kIChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSAoaG90SW1hZ2UuZ2V0Qm91bmRzICgpKTsKLQlnYy5kaXNwb3NlICgpOwotCQotCVRvb2xCYXIgYmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkZMQVQpOwotCWJhci5zZXRTaXplICgyMDAsIDMyKTsKLQlmb3IgKGludCBpPTA7IGk8MTI7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtIChiYXIsIDApOwotCQlpdGVtLnNldEltYWdlIChpbWFnZSk7Ci0JCWl0ZW0uc2V0RGlzYWJsZWRJbWFnZSAoZGlzYWJsZWRJbWFnZSk7Ci0JCWl0ZW0uc2V0SG90SW1hZ2UgKGhvdEltYWdlKTsKLQkJaWYgKGkgJSAzID09IDApIGl0ZW0uc2V0RW5hYmxlZCAoZmFsc2UpOwotCX0KLQkKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlpbWFnZS5kaXNwb3NlICgpOwotCWRpc2FibGVkSW1hZ2UuZGlzcG9zZSAoKTsKLQlob3RJbWFnZS5kaXNwb3NlICgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNiYTc3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ2FudmFzIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGFuIGltYWdlIChmbGlja2VyIGZyZWUsIG5vIGRvdWJsZSBidWZmZXJpbmcpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDQ4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlJbWFnZSBvcmlnaW5hbEltYWdlID0gbnVsbDsKLQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULk9QRU4pOwotCWRpYWxvZy5zZXRUZXh0ICgiT3BlbiBhbiBpbWFnZSBmaWxlIG9yIGNhbmNlbCIpOwotCVN0cmluZyBzdHJpbmcgPSBkaWFsb2cub3BlbiAoKTsKLQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJb3JpZ2luYWxJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgc3RyaW5nKTsKLQl9Ci0JaWYgKG9yaWdpbmFsSW1hZ2UgPT0gbnVsbCkgewotCQlpbnQgd2lkdGggPSAxNTAsIGhlaWdodCA9IDIwMDsKLQkJb3JpZ2luYWxJbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCUdDIGdjID0gbmV3IEdDIChvcmlnaW5hbEltYWdlKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSAoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCWdjLmRyYXdMaW5lICgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQkJZ2MuZHJhd0xpbmUgKDAsIGhlaWdodCwgd2lkdGgsIDApOwotCQlnYy5kcmF3VGV4dCAoIkRlZmF1bHQgSW1hZ2UiLCAxMCwgMTApOwotCQlnYy5kaXNwb3NlICgpOwotCX0KLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG9yaWdpbmFsSW1hZ2U7Ci0JZmluYWwgUG9pbnQgb3JpZ2luID0gbmV3IFBvaW50ICgwLCAwKTsKLQlmaW5hbCBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyAoc2hlbGwsIFNXVC5OT19CQUNLR1JPVU5EIHwKLQkJCVNXVC5OT19SRURSQVdfUkVTSVpFIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlmaW5hbCBTY3JvbGxCYXIgaEJhciA9IGNhbnZhcy5nZXRIb3Jpem9udGFsQmFyICgpOwotCWhCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlpbnQgaFNlbGVjdGlvbiA9IGhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IGRlc3RYID0gLWhTZWxlY3Rpb24gLSBvcmlnaW4ueDsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJY2FudmFzLnNjcm9sbCAoZGVzdFgsIDAsIDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCBmYWxzZSk7Ci0JCQlvcmlnaW4ueCA9IC1oU2VsZWN0aW9uOwotCQl9Ci0JfSk7Ci0JZmluYWwgU2Nyb2xsQmFyIHZCYXIgPSBjYW52YXMuZ2V0VmVydGljYWxCYXIgKCk7Ci0JdkJhci5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCWludCB2U2VsZWN0aW9uID0gdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlpbnQgZGVzdFkgPSAtdlNlbGVjdGlvbiAtIG9yaWdpbi55OwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQljYW52YXMuc2Nyb2xsICgwLCBkZXN0WSwgMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIGZhbHNlKTsKLQkJCW9yaWdpbi55ID0gLXZTZWxlY3Rpb247Ci0JCX0KLQl9KTsKLQljYW52YXMuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsICBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMgKCk7Ci0JCQlSZWN0YW5nbGUgY2xpZW50ID0gY2FudmFzLmdldENsaWVudEFyZWEgKCk7Ci0JCQloQmFyLnNldE1heGltdW0gKHJlY3Qud2lkdGgpOwotCQkJdkJhci5zZXRNYXhpbXVtIChyZWN0LmhlaWdodCk7Ci0JCQloQmFyLnNldFRodW1iIChNYXRoLm1pbiAocmVjdC53aWR0aCwgY2xpZW50LndpZHRoKSk7Ci0JCQl2QmFyLnNldFRodW1iIChNYXRoLm1pbiAocmVjdC5oZWlnaHQsIGNsaWVudC5oZWlnaHQpKTsKLQkJCWludCBoUGFnZSA9IHJlY3Qud2lkdGggLSBjbGllbnQud2lkdGg7Ci0JCQlpbnQgdlBhZ2UgPSByZWN0LmhlaWdodCAtIGNsaWVudC5oZWlnaHQ7Ci0JCQlpbnQgaFNlbGVjdGlvbiA9IGhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IHZTZWxlY3Rpb24gPSB2QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCWlmIChoU2VsZWN0aW9uID49IGhQYWdlKSB7Ci0JCQkJaWYgKGhQYWdlIDw9IDApIGhTZWxlY3Rpb24gPSAwOwotCQkJCW9yaWdpbi54ID0gLWhTZWxlY3Rpb247Ci0JCQl9Ci0JCQlpZiAodlNlbGVjdGlvbiA+PSB2UGFnZSkgewotCQkJCWlmICh2UGFnZSA8PSAwKSB2U2VsZWN0aW9uID0gMDsKLQkJCQlvcmlnaW4ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQkJY2FudmFzLnJlZHJhdyAoKTsKLQkJfQotCX0pOwotCWNhbnZhcy5hZGRMaXN0ZW5lciAoU1dULlBhaW50LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJR0MgZ2MgPSBlLmdjOwotCQkJZ2MuZHJhd0ltYWdlIChpbWFnZSwgb3JpZ2luLngsIG9yaWdpbi55KTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzICgpOwotCQkJUmVjdGFuZ2xlIGNsaWVudCA9IGNhbnZhcy5nZXRDbGllbnRBcmVhICgpOwotCQkJaW50IG1hcmdpbldpZHRoID0gY2xpZW50LndpZHRoIC0gcmVjdC53aWR0aDsKLQkJCWlmIChtYXJnaW5XaWR0aCA+IDApIHsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlIChyZWN0LndpZHRoLCAwLCBtYXJnaW5XaWR0aCwgY2xpZW50LmhlaWdodCk7Ci0JCQl9Ci0JCQlpbnQgbWFyZ2luSGVpZ2h0ID0gY2xpZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0OwotCQkJaWYgKG1hcmdpbkhlaWdodCA+IDApIHsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlICgwLCByZWN0LmhlaWdodCwgY2xpZW50LndpZHRoLCBtYXJnaW5IZWlnaHQpOwotCQkJfQotCQl9Ci0JfSk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAxNTApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCW9yaWdpbmFsSW1hZ2UuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmExMjguLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDQ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVG9vbEJhciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0b29sIGJhciAod3JhcCBvbiByZXNpemUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NDkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuV1JBUCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAodG9vbEJhciwgU1dULlBVU0gpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlQb2ludCBzaXplID0gdG9vbEJhci5jb21wdXRlU2l6ZSAocmVjdC53aWR0aCwgU1dULkRFRkFVTFQpOwotCQkJdG9vbEJhci5zZXRTaXplIChzaXplKTsKLQkJfQotCX0pOwotCXRvb2xCYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlYTk3OC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFNjcm9sbGVkQ29tcG9zaXRlIGV4YW1wbGUgc25pcHBldDogc2Nyb2xsIGEgY29udHJvbCBpbiBhIHNjcm9sbGVkIGNvbXBvc2l0ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgCi17Ci0gICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0gICAgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotICAgIHNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgIC8vIHRoaXMgYnV0dG9uIGlzIGFsd2F5cyA0MDAgeCA0MDAuIFNjcm9sbGJhcnMgYXBwZWFyIGlmIHRoZSB3aW5kb3cgaXMgcmVzaXplZCB0byBiZQotICAgIC8vIHRvbyBzbWFsbCB0byBzaG93IHBhcnQgb2YgdGhlIGJ1dHRvbgotICAgIFNjcm9sbGVkQ29tcG9zaXRlIGMxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBCdXR0b24gYjEgPSBuZXcgQnV0dG9uKGMxLCBTV1QuUFVTSCk7Ci0gICAgYjEuc2V0VGV4dCgiZml4ZWQgc2l6ZSBidXR0b24iKTsKLSAgICBiMS5zZXRTaXplKDQwMCwgNDAwKTsKLSAgICBjMS5zZXRDb250ZW50KGIxKTsKLQotICAgIC8vIHRoaXMgYnV0dG9uIGhhcyBhIG1pbmltdW0gc2l6ZSBvZiA0MDAgeCA0MDAuIElmIHRoZSB3aW5kb3cgaXMgcmVzaXplZCB0byBiZSBiaWcKLSAgICAvLyBlbm91Z2ggdG8gc2hvdyBtb3JlIHRoYW4gNDAwIHggNDAwLCB0aGUgYnV0dG9uIHdpbGwgZ3JvdyBpbiBzaXplLiBJZiB0aGUgd2luZG93Ci0gICAgLy8gaXMgbWFkZSB0b28gc21hbGwgdG8gc2hvdyA0MDAgeCA0MDAsIHNjcm9sbGJhcnMgd2lsbCBhcHBlYXIuCi0gICAgU2Nyb2xsZWRDb21wb3NpdGUgYzIgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIEJ1dHRvbiBiMiA9IG5ldyBCdXR0b24oYzIsIFNXVC5QVVNIKTsKLSAgICBiMi5zZXRUZXh0KCJleHBhbmRpbmcgYnV0dG9uIik7Ci0gICAgYzIuc2V0Q29udGVudChiMik7Ci0gICAgYzIuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLSAgICBjMi5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLSAgICBjMi5zZXRNaW5XaWR0aCg0MDApOwotICAgIGMyLnNldE1pbkhlaWdodCg0MDApOwotCi0gICAgc2hlbGwuc2V0U2l6ZSg2MDAsIDMwMCk7Ci0gICAgc2hlbGwub3BlbiAoKTsKLSAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLSAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLSAgICB9Ci0gICAgZGlzcGxheS5kaXNwb3NlICgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTAuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZkMjk5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGRpYWxvZyBzaGVsbAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDUwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJTaGVsbCIpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwpOwotCWRpYWxvZy5zZXRUZXh0ICgiRGlhbG9nIik7Ci0JZGlhbG9nLnNldFNpemUgKDIwMCwgMjAwKTsKLQlkaWFsb2cub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWJkNzQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBzY3JvbGwgYSB0YWJsZSAoc2V0IHRoZSB0b3AgaW5kZXgpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldFRvcEluZGV4ICg5NSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MjQ2MC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZSBleGFtcGxlIHNuaXBwZXQ6IHNlbGVjdCBhbiBpbmRleCAoc2VsZWN0IGFuZCBzY3JvbGwpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldFNlbGVjdGlvbiAoOTUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2FlNDUuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFRhYmxlIGV4YW1wbGUgc25pcHBldDogcmVtb3ZlIHNlbGVjdGVkIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSAodGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCU1lbnUgbWVudSA9IG5ldyBNZW51IChzaGVsbCwgU1dULlBPUF9VUCk7Ci0JdGFibGUuc2V0TWVudSAobWVudSk7Ci0JTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCWl0ZW0uc2V0VGV4dCAoIkRlbGV0ZSBTZWxlY3Rpb24iKTsKLQlpdGVtLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCXRhYmxlLnJlbW92ZSAodGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcyAoKSk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBiM2E0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTYXNoIGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2FzaCAoYWxsb3cgaXQgdG8gYmUgbW92ZWQpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgU2FzaCBzYXNoID0gbmV3IFNhc2ggKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULlZFUlRJQ0FMKTsKLQlzYXNoLnNldEJvdW5kcyAoMTAsIDEwLCAzMiwgMTAwKTsKLQlzYXNoLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJc2FzaC5zZXRCb3VuZHMgKGUueCwgZS55LCBlLndpZHRoLCBlLmhlaWdodCk7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXNhc2guc2V0Rm9jdXMgKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZhODNmLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBUZXh0IGV4YW1wbGUgc25pcHBldDogcmVzaXplIGEgdGV4dCBjb250cm9sIChzaG93IGFib3V0IDEwIGNoYXJhY3RlcnMpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlpbnQgY29sdW1ucyA9IDEwOwotCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzICgpOwotCWludCB3aWR0aCA9IGNvbHVtbnMgKiBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoICgpOwotCWludCBoZWlnaHQgPSBmbS5nZXRIZWlnaHQgKCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQl0ZXh0LnNldFNpemUgKHRleHQuY29tcHV0ZVNpemUgKHdpZHRoLCBoZWlnaHQpKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWVhYmI4Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFByb2dyZXNzQmFyIGV4YW1wbGUgc25pcHBldDogdXBkYXRlIGEgcHJvZ3Jlc3MgYmFyIChmcm9tIGFub3RoZXIgdGhyZWFkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU2IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWZpbmFsIFByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgU1dULlNNT09USCk7Ci0JCWJhci5zZXRCb3VuZHMoMTAsIDEwLCAyMDAsIDMyKTsKLQkJc2hlbGwub3BlbigpOwotCQlmaW5hbCBpbnQgbWF4aW11bSA9IGJhci5nZXRNYXhpbXVtKCk7Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChmaW5hbCBpbnRbXSBpID0gbmV3IGludFsxXTsgaVswXSA8PSBtYXhpbXVtOyBpWzBdKyspIHsKLQkJCQl0cnkge1RocmVhZC5zbGVlcCAoMTAwKTt9IGNhdGNoIChUaHJvd2FibGUgdGgpIHt9Ci0JCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoYmFyLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCQkJCQliYXIuc2V0U2VsZWN0aW9uKGlbMF0pOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQkJfQotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyOTVmNi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBQcm9ncmVzc0JhciBleGFtcGxlIHNuaXBwZXQ6IHVwZGF0ZSBhIHByb2dyZXNzIGJhciAoZnJvbSB0aGUgVUkgdGhyZWFkKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU3IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCVByb2dyZXNzQmFyIGJhciA9IG5ldyBQcm9ncmVzc0JhciAoc2hlbGwsIFNXVC5TTU9PVEgpOwotCWJhci5zZXRCb3VuZHMgKDEwLCAxMCwgMjAwLCAzMik7Ci0Jc2hlbGwub3BlbiAoKTsKLQlmb3IgKGludCBpPTA7IGk8PWJhci5nZXRNYXhpbXVtICgpOyBpKyspIHsKLQkJdHJ5IHtUaHJlYWQuc2xlZXAgKDEwMCk7fSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7fQotCQliYXIuc2V0U2VsZWN0aW9uIChpKTsKLQl9Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NTguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE0NDE0Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRvb2xCYXIgZXhhbXBsZSBzbmlwcGV0OiBwbGFjZSBhIGNvbWJvIGJveCBpbiBhIHRvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NTggewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JVG9vbEJhciBiYXIgPSBuZXcgVG9vbEJhciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSAoYmFyLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCVRvb2xJdGVtIHNlcCA9IG5ldyBUb29sSXRlbSAoYmFyLCBTV1QuU0VQQVJBVE9SKTsKLQlpbnQgc3RhcnQgPSBiYXIuZ2V0SXRlbUNvdW50ICgpOwotCWZvciAoaW50IGk9c3RhcnQ7IGk8c3RhcnQrNDsgaSsrKSB7Ci0JCVRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKGJhciwgMCk7Ci0JCWl0ZW0uc2V0VGV4dCAoIkl0ZW0gIiArIGkpOwotCX0KLQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyAoYmFyLCBTV1QuUkVBRF9PTkxZKTsKLQlmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7Ci0JCWNvbWJvLmFkZCAoIkl0ZW0gIiArIGkpOwotCX0KLQljb21iby5wYWNrICgpOwotCXNlcC5zZXRXaWR0aCAoY29tYm8uZ2V0U2l6ZSAoKS54KTsKLQlzZXAuc2V0Q29udHJvbCAoY29tYm8pOwotCWJhci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ1OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGRhY2QuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDU5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogTGlzdCBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNlbGVjdGVkIGl0ZW1zIGluIGEgbGlzdAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDU5IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIExpc3QgbGlzdCA9IG5ldyBMaXN0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKSBsaXN0LmFkZCAoIkl0ZW0gIiArIGkpOwotCWxpc3Quc2V0Qm91bmRzICgwLCAwLCAxMDAsIDEwMCk7Ci0JbGlzdC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCWludCBbXSBzZWxlY3Rpb24gPSBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNlbGVjdGlvbj17IiArIHN0cmluZyArICJ9Iik7Ci0JCX0KLQl9KTsKLQlsaXN0LmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCWludCBbXSBzZWxlY3Rpb24gPSBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMgKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRlZmF1bHRTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzI0NzcuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHcmlkTGF5b3V0IGV4YW1wbGUgc25pcHBldDogaW5zZXJ0IHdpZGdldHMgaW50byBhIGdyaWQgbGF5b3V0Ci0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqIAotICogQHNpbmNlIDMuMQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotICAgIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLSAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgZmluYWwgQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjLnNldExheW91dChsYXlvdXQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgICAgICBiLnNldFRleHQoIkJ1dHRvbiAiK2kpOwotICAgIH0KLQotICAgIEJ1dHRvbiBiID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgIGIuc2V0VGV4dCgiYWRkIGEgbmV3IGJ1dHRvbiBhdCByb3cgMiBjb2x1bW4gMSIpOwotICAgIGZpbmFsIGludFtdIGluZGV4ID0gbmV3IGludFsxXTsKLSAgICBiLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotICAgICAgICAgICAgQnV0dG9uIHMgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIHMuc2V0VGV4dCgiU3BlY2lhbCAiK2luZGV4WzBdKTsKLSAgICAgICAgICAgIGluZGV4WzBdKys7Ci0gICAgICAgICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBjLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBzLm1vdmVBYm92ZShjaGlsZHJlblszXSk7Ci0gICAgICAgICAgICBzaGVsbC5sYXlvdXQobmV3IENvbnRyb2xbXSB7c30pOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBzaGVsbC5vcGVuICgpOwotICAgIHdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotICAgIH0KLSAgICBkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmNlMTIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSB0d28gb25lIHNob3QgdGltZXJzICg1MDAwIG1zLCAyMDAwIG1zKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDYwIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCWRpc3BsYXkudGltZXJFeGVjICg1MDAwLCBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuICgiNTAwMCIpOwotCQl9Ci0JfSk7Ci0JZGlzcGxheS50aW1lckV4ZWMgKDIwMDAsIG5ldyBSdW5uYWJsZSAoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCIyMDAwIik7Ci0JCX0KLQl9KTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2MS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTVlNmIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IHByaW50IHNlbGVjdGVkIGl0ZW1zIGluIGEgdHJlZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbTAgPSBuZXcgVHJlZUl0ZW0gKHRyZWUsIDApOwotCQlpdGVtMC5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWZvciAoaW50IGo9MDsgajw0OyBqKyspIHsKLQkJCVRyZWVJdGVtIGl0ZW0xID0gbmV3IFRyZWVJdGVtIChpdGVtMCwgMCk7Ci0JCQlpdGVtMS5zZXRUZXh0ICgiU3ViSXRlbSAiICsgaSArICIgIiArIGopOwotCQkJZm9yIChpbnQgaz0wOyBrPDQ7IGsrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0yID0gbmV3IFRyZWVJdGVtIChpdGVtMSwgMCk7Ci0JCQkJaXRlbTIuc2V0VGV4dCAoIlN1Ykl0ZW0gIiArIGkgKyAiICIgKyBqICsgIiAiICsgayk7Ci0JCQl9CQotCQl9Ci0JfQotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gIiI7Ci0JCQlUcmVlSXRlbSBbXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXRyZWUuYWRkTGlzdGVuZXIgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVHJlZUl0ZW0gW10gc2VsZWN0aW9uID0gdHJlZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRlZmF1bHRTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULkV4cGFuZCwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkV4cGFuZD17IiArIGUuaXRlbSArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuQ29sbGFwc2UsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJDb2xsYXBzZT17IiArIGUuaXRlbSArICJ9Iik7Ci0JCX0KLQl9KTsKLQl0cmVlLmdldEl0ZW1zICgpIFswXS5zZXRFeHBhbmRlZCAodHJ1ZSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmYmVjOS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogQ29udHJvbCBleGFtcGxlIHNuaXBwZXQ6IHByaW50IG1vdXNlIHN0YXRlIGFuZCBidXR0b24gKGRvd24sIG1vdmUsIHVwKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICJVbmtub3duIjsKLQkJCXN3aXRjaCAoZS50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VEb3duOiBzdHJpbmcgPSAiRE9XTiI7IGJyZWFrOwotCQkJCWNhc2UgU1dULk1vdXNlTW92ZTogc3RyaW5nID0gIk1PVkUiOyBicmVhazsKLQkJCQljYXNlIFNXVC5Nb3VzZVVwOiBzdHJpbmcgPSAiVVAiOyBicmVhazsKLQkJCX0KLQkJCXN0cmluZyArPSI6IGJ1dHRvbjogIiArIGUuYnV0dG9uICsgIiwgIjsKLQkJCXN0cmluZyArPSAic3RhdGVNYXNrPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcgKGUuc3RhdGVNYXNrKTsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9OMSI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjIpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjIiOwotCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5CVVRUT04zKSAhPSAwKSBzdHJpbmcgKz0gIiBCVVRUT04zIjsKLQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9ONCkgIT0gMCkgc3RyaW5nICs9ICIgQlVUVE9ONCI7Ci0JCQlpZiAoKGUuc3RhdGVNYXNrICYgU1dULkJVVFRPTjUpICE9IDApIHN0cmluZyArPSAiIEJVVFRPTjUiOwotCQkJU3lzdGVtLm91dC5wcmludGxuIChzdHJpbmcpOwotCQl9Ci0JfTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbGlzdGVuZXIpOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VNb3ZlLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZVVwLCBsaXN0ZW5lcik7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDYzLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZTFhMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIGRpYWxvZyBzaGVsbCAocHJvbXB0IGZvciBhIHZhbHVlKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ2MyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JZmluYWwgYm9vbGVhbiBbXSByZXN1bHQgPSBuZXcgYm9vbGVhbiBbMV07Ci0JZmluYWwgU2hlbGwgZGlhbG9nID0gbmV3IFNoZWxsIChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQlkaWFsb2cuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlmaW5hbCBCdXR0b24gb2sgPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQlvay5zZXRUZXh0ICgiT0siKTsKLQlCdXR0b24gY2FuY2VsID0gbmV3IEJ1dHRvbiAoZGlhbG9nLCBTV1QuUFVTSCk7Ci0JY2FuY2VsLnNldFRleHQgKCJDYW5jZWwiKTsKLQlMaXN0ZW5lciBsaXN0ZW5lciA9bmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlyZXN1bHQgWzBdID0gZXZlbnQud2lkZ2V0ID09IG9rOwotCQkJZGlhbG9nLmNsb3NlICgpOwotCQl9Ci0JfTsKLQlvay5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCWNhbmNlbC5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCWRpYWxvZy5wYWNrICgpOwotCWRpYWxvZy5vcGVuICgpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlByb21wdCAuLi4iKTsKLQl3aGlsZSAoIWRpYWxvZy5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlJlc3VsdDogIiArIHJlc3VsdCBbMF0pOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4ZGIxMy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiBwcmludCBzZWxlY3RlZCBpdGVtcyBpbiBhIHRhYmxlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpPTA7IGk8MTY7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0gKHRhYmxlLCAwKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCXRhYmxlLnNldEJvdW5kcyAoMCwgMCwgMTAwLCAxMDApOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJVGFibGVJdGVtIFtdIHNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHN0cmluZyArPSBzZWxlY3Rpb24gW2ldICsgIiAiOwotCQkJU3lzdGVtLm91dC5wcmludGxuICgiU2VsZWN0aW9uPXsiICsgc3RyaW5nICsgIn0iKTsKLQkJfQotCX0pOwotCXRhYmxlLmFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSAiIjsKLQkJCVRhYmxlSXRlbSBbXSBzZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24gKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8c2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzdHJpbmcgKz0gc2VsZWN0aW9uIFtpXSArICIgIjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoIkRlZmF1bHRTZWxlY3Rpb249eyIgKyBzdHJpbmcgKyAifSIpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNTUyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHNpbXBsZSBkaWFsb2cgdXNpbmcgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuV1JBUCk7Ci0JbGFiZWwuc2V0VGV4dCAoIlRoaXMgaXMgYSBsb25nIHRleHQgc3RyaW5nIHRoYXQgd2lsbCB3cmFwIHdoZW4gdGhlIGRpYWxvZyBpcyByZXNpemVkLiIpOwotCUxpc3QgbGlzdCA9IG5ldyBMaXN0IChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JbGlzdC5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7Ikl0ZW0gMSIsICJJdGVtIDIifSk7Ci0JQnV0dG9uIGJ1dHRvbjEgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjEuc2V0VGV4dCAoIk9LIik7Ci0JQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uIChzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbjIuc2V0VGV4dCAoIkNhbmNlbCIpOwotCQotCWZpbmFsIGludCBpbnNldFggPSA0LCBpbnNldFkgPSA0OwotCUZvcm1MYXlvdXQgZm9ybUxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWZvcm1MYXlvdXQubWFyZ2luV2lkdGggPSBpbnNldFg7Ci0JZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSBpbnNldFk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChmb3JtTGF5b3V0KTsKLQkKLQlQb2ludCBzaXplID0gbGFiZWwuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JZmluYWwgRm9ybURhdGEgbGFiZWxEYXRhID0gbmV3IEZvcm1EYXRhIChzaXplLngsIFNXVC5ERUZBVUxUKTsKLQlsYWJlbERhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMCwgMCk7Ci0JbGFiZWxEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgxMDAsIDApOwotCWxhYmVsLnNldExheW91dERhdGEgKGxhYmVsRGF0YSk7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5SZXNpemUsIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IHNoZWxsLmdldENsaWVudEFyZWEgKCk7Ci0JCQlsYWJlbERhdGEud2lkdGggPSByZWN0LndpZHRoIC0gaW5zZXRYICogMjsKLQkJCXNoZWxsLmxheW91dCAoKTsKLQkJfQotCX0pOwotCQkKLQlGb3JtRGF0YSBidXR0b24yRGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlidXR0b24yRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAtaW5zZXRYKTsKLQlidXR0b24yRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQgKDEwMCwgMCk7Ci0JYnV0dG9uMi5zZXRMYXlvdXREYXRhIChidXR0b24yRGF0YSk7Ci0JCi0JRm9ybURhdGEgYnV0dG9uMURhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JYnV0dG9uMURhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGJ1dHRvbjIsIC1pbnNldFgpOwotCWJ1dHRvbjFEYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlidXR0b24xLnNldExheW91dERhdGEgKGJ1dHRvbjFEYXRhKTsKLQkKLQlGb3JtRGF0YSBsaXN0RGF0YSA9IG5ldyBGb3JtRGF0YSAoKTsKLQlsaXN0RGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50ICgwLCAwKTsKLQlsaXN0RGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCAoMTAwLCAwKTsKLQlsaXN0RGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCBpbnNldFkpOwotCWxpc3REYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCAoYnV0dG9uMiwgLWluc2V0WSk7Ci0JbGlzdC5zZXRMYXlvdXREYXRhIChsaXN0RGF0YSk7Ci0JCi0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY2LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyOGY4Ny4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGltcGxlbWVudCBhIHNpbXBsZSBzY3JpYmJsZSBwcm9ncmFtCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIgKCkgewotCQlpbnQgbGFzdFggPSAwLCBsYXN0WSA9IDA7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuTW91c2VNb3ZlOgotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5CVVRUT04xKSA9PSAwKSBicmVhazsKLQkJCQkJR0MgZ2MgPSBuZXcgR0MgKHNoZWxsKTsKLQkJCQkJZ2MuZHJhd0xpbmUgKGxhc3RYLCBsYXN0WSwgZXZlbnQueCwgZXZlbnQueSk7Ci0JCQkJCWdjLmRpc3Bvc2UgKCk7Ci0JCQkJCS8vRkFMTCBUSFJPVUdICi0JCQkJY2FzZSBTV1QuTW91c2VEb3duOgotCQkJCQlsYXN0WCA9IGV2ZW50Lng7Ci0JCQkJCWxhc3RZID0gZXZlbnQueTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9OwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuTW91c2VEb3duLCBsaXN0ZW5lcik7Ci0Jc2hlbGwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZU1vdmUsIGxpc3RlbmVyKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxNGU5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUb29sQmFyIGV4YW1wbGUgc25pcHBldDogcGxhY2UgYSBkcm9wIGRvd24gbWVudSBpbiBhIHRvb2wgYmFyCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVG9vbEJhciB0b29sQmFyID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JfQotCWZpbmFsIFRvb2xJdGVtIGl0ZW0gPSBuZXcgVG9vbEl0ZW0gKHRvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCWl0ZW0uYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJCVBvaW50IHB0ID0gbmV3IFBvaW50IChyZWN0LngsIHJlY3QueSArIHJlY3QuaGVpZ2h0KTsKLQkJCQlwdCA9IHRvb2xCYXIudG9EaXNwbGF5IChwdCk7Ci0JCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQkJbWVudS5zZXRWaXNpYmxlICh0cnVlKTsKLQkJCX0KLQkJfQotCX0pOwotCXRvb2xCYXIucGFjayAoKTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCW1lbnUuZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1MmIxZS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRGlzcGxheSBleGFtcGxlIHNuaXBwZXQ6IHN0b3AgYSByZXBlYXRpbmcgdGltZXIgd2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDY4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgQ29sb3IgcmVkID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX1JFRCk7Ci0JZmluYWwgQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9CTFVFKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgUm93TGF5b3V0ICgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCAoIlN0b3AgVGltZXIiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWxhYmVsLnNldEJhY2tncm91bmQgKHJlZCk7Ci0JZmluYWwgaW50IHRpbWUgPSA1MDA7Ci0JZmluYWwgUnVubmFibGUgdGltZXIgPSBuZXcgUnVubmFibGUgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJaWYgKGxhYmVsLmlzRGlzcG9zZWQgKCkpIHJldHVybjsKLQkJCUNvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZCAoKS5lcXVhbHMgKHJlZCkgPyBibHVlIDogcmVkOwotCQkJbGFiZWwuc2V0QmFja2dyb3VuZCAoY29sb3IpOwotCQkJZGlzcGxheS50aW1lckV4ZWMgKHRpbWUsIHRoaXMpOwotCQl9Ci0JfTsKLQlkaXNwbGF5LnRpbWVyRXhlYyAodGltZSwgdGltZXIpOwotCWJ1dHRvbi5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYyAoLTEsIHRpbWVyKTsKLQkJfQotCX0pOwotCWJ1dHRvbi5wYWNrICgpOwotCWxhYmVsLnNldExheW91dERhdGEgKG5ldyBSb3dEYXRhIChidXR0b24uZ2V0U2l6ZSAoKSkpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ2OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YmY5OTkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDY5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRm9ybUxheW91dCBleGFtcGxlIHNuaXBwZXQ6IGNlbnRlciBhIGxhYmVsIGFuZCBzaW5nbGUgbGluZSB0ZXh0IHVzaW5nIGEgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NjkgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSB8IFNXVC5CT1JERVIpOwotCWxhYmVsLnNldFRleHQgKCJOYW1lIik7Ci0JVGV4dCB0ZXh0ID0gbmV3IFRleHQgKHNoZWxsLCBTV1QuTk9ORSk7Ci0KLQlGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCXNoZWxsLnNldExheW91dCAobGF5b3V0KTsKLQotCUdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzICgpOwotCWludCBjaGFyV2lkdGggPSBmbS5nZXRBdmVyYWdlQ2hhcldpZHRoICgpOwotCWludCB3aWR0aCA9IHRleHQuY29tcHV0ZVNpemUgKGNoYXJXaWR0aCAqIDgsIFNXVC5ERUZBVUxUKS54OwotCWdjLmRpc3Bvc2UgKCk7Ci0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSAod2lkdGgsIFNXVC5ERUZBVUxUKTsKLQl0ZXh0LnNldExheW91dERhdGEgKGRhdGEpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCAobGFiZWwsIDUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50IChsYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCi0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjgzNjNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSB0YWJsZSAobGF6eSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NyB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlmaW5hbCBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZSAoZGlzcGxheSwgMTYsIDE2KTsKLQlHQyBnYyA9IG5ldyBHQyAoaW1hZ2UpOwotCWdjLnNldEJhY2tncm91bmQgKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpKTsKLQlnYy5maWxsUmVjdGFuZ2xlIChpbWFnZS5nZXRCb3VuZHMgKCkpOwotCWdjLmRpc3Bvc2UgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJMYXp5IFRhYmxlIik7Ci0Jc2hlbGwuc2V0TGF5b3V0IChuZXcgRmlsbExheW91dCAoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0YWJsZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0JVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQgKCkgewotCQlwdWJsaWMgdm9pZCBydW4gKCkgewotCQkJZm9yIChpbnQgaT0wOyBpPDIwMDAwOyBpKyspIHsKLQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCWZpbmFsIGludCBbXSBpbmRleCA9IG5ldyBpbnQgW10ge2l9OwotCQkJCWRpc3BsYXkuc3luY0V4ZWMgKG5ldyBSdW5uYWJsZSAoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQkJCQlpZiAodGFibGUuaXNEaXNwb3NlZCAoKSkgcmV0dXJuOwotCQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtICh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQkJaXRlbS5zZXRUZXh0ICgiVGFibGUgSXRlbSAiICsgaW5kZXggWzBdKTsKLQkJCQkJCWl0ZW0uc2V0SW1hZ2UgKGltYWdlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQl0aHJlYWQuc3RhcnQgKCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWltYWdlLmRpc3Bvc2UgKCk7Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjMjc3OS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBHQyBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbiBpY29uIChpbiBtZW1vcnkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzAgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfUkVEKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlIChkaXNwbGF5LCAyMCwgMjApOwotCUdDIGdjID0gbmV3IEdDIChpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAocmVkKTsKLQlnYy5maWxsUmVjdGFuZ2xlICg1LCA1LCAxMCwgMTApOwotCWdjLmRpc3Bvc2UgKCk7Ci0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSAoKTsKLQkKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhICgKLQkJbmV3IFJHQiBbXSB7Ci0JCQluZXcgUkdCICgwLCAwLCAwKSwKLQkJCW5ldyBSR0IgKDB4RkYsIDB4RkYsIDB4RkYpLAotCQl9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCUltYWdlIG1hc2sgPSBuZXcgSW1hZ2UgKGRpc3BsYXksIG1hc2tEYXRhKTsKLQlnYyA9IG5ldyBHQyAobWFzayk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAoYmxhY2spOwotCWdjLmZpbGxSZWN0YW5nbGUgKDAsIDAsIDIwLCAyMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZCAod2hpdGUpOwotCWdjLmZpbGxSZWN0YW5nbGUgKDUsIDUsIDEwLCAxMCk7Ci0JZ2MuZGlzcG9zZSAoKTsKLQltYXNrRGF0YSA9IG1hc2suZ2V0SW1hZ2VEYXRhICgpOwotCQotCUltYWdlIGljb24gPSBuZXcgSW1hZ2UgKGRpc3BsYXksIGltYWdlRGF0YSwgbWFza0RhdGEpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0SW1hZ2UgKGljb24pOwotCWJ1dHRvbi5zZXRTaXplICg2MCwgNjApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWljb24uZGlzcG9zZSAoKTsKLQlpbWFnZS5kaXNwb3NlICgpOwotCW1hc2suZGlzcG9zZSAoKTsKLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19IApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EwZDRmYy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBGb3JtTGF5b3V0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgc2ltcGxlIE9LL0NBTkNFTCBkaWFsb2cgdXNpbmcgZm9ybSBsYXlvdXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzEgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwucGFjayAoKTsKLQlzaGVsbC5vcGVuICgpOwotCVNoZWxsIGRpYWxvZyA9IG5ldyBTaGVsbCAoc2hlbGwsIFNXVC5ESUFMT0dfVFJJTSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKGRpYWxvZywgU1dULk5PTkUpOwotCWxhYmVsLnNldFRleHQgKCJFeGl0IHRoZSBhcHBsaWNhdGlvbj8iKTsKLQlCdXR0b24gb2tCdXR0b24gPSBuZXcgQnV0dG9uIChkaWFsb2csIFNXVC5QVVNIKTsKLQlva0J1dHRvbi5zZXRUZXh0ICgiJk9LIik7Ci0JQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24gKGRpYWxvZywgU1dULlBVU0gpOwotCWNhbmNlbEJ1dHRvbi5zZXRUZXh0ICgiJkNhbmNlbCIpOwotCQotCUZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0ICgpOwotCWZvcm0ubWFyZ2luV2lkdGggPSBmb3JtLm1hcmdpbkhlaWdodCA9IDg7Ci0JZGlhbG9nLnNldExheW91dCAoZm9ybSk7Ci0JRm9ybURhdGEgb2tEYXRhID0gbmV3IEZvcm1EYXRhICgpOwotCW9rRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKGxhYmVsLCA4KTsKLQlva0J1dHRvbi5zZXRMYXlvdXREYXRhIChva0RhdGEpOwotCUZvcm1EYXRhIGNhbmNlbERhdGEgPSBuZXcgRm9ybURhdGEgKCk7Ci0JY2FuY2VsRGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50IChva0J1dHRvbiwgOCk7Ci0JY2FuY2VsRGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQgKG9rQnV0dG9uLCAwLCBTV1QuVE9QKTsKLQljYW5jZWxCdXR0b24uc2V0TGF5b3V0RGF0YSAoY2FuY2VsRGF0YSk7Ci0JCi0JZGlhbG9nLnNldERlZmF1bHRCdXR0b24gKG9rQnV0dG9uKTsKLQlkaWFsb2cucGFjayAoKTsKLQlkaWFsb2cub3BlbiAoKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Mi5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmM4OWEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDcyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRmlsZURpYWxvZyBleGFtcGxlIHNuaXBwZXQ6IHByb21wdCBmb3IgYSBmaWxlIG5hbWUgKHRvIHNhdmUpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0NzIgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0Jc2hlbGwub3BlbiAoKTsKLQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nIChzaGVsbCwgU1dULlNBVkUpOwotCWRpYWxvZy5zZXRGaWx0ZXJOYW1lcyAobmV3IFN0cmluZyBbXSB7IkJhdGNoIEZpbGVzIiwgIkFsbCBGaWxlcyAoKi4qKSJ9KTsKLQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyAobmV3IFN0cmluZyBbXSB7IiouYmF0IiwgIiouKiJ9KTsgLy9XaW5kb3dzIHdpbGQgY2FyZHMKLQlkaWFsb2cuc2V0RmlsdGVyUGF0aCAoImM6XFwiKTsgLy9XaW5kb3dzIHBhdGgKLQlkaWFsb2cuc2V0RmlsZU5hbWUgKCJmcmVkLmJhdCIpOwotCVN5c3RlbS5vdXQucHJpbnRsbiAoIlNhdmUgdG86ICIgKyBkaWFsb2cub3BlbiAoKSk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ4NTVjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIE1lbnUgZXhhbXBsZSBzbmlwcGV0OiBlbmFibGUgbWVudSBpdGVtcyBkeW5hbWljYWxseSAod2hlbiBtZW51IHNob3duKQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDczIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlIChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUgKHNoZWxsLCBTV1QuUE9QX1VQKTsKLQl0cmVlLnNldE1lbnUgKG1lbnUpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCXRyZWVJdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJbWVudUl0ZW0uc2V0VGV4dCAodHJlZUl0ZW0uZ2V0VGV4dCAoKSk7Ci0JfQotCW1lbnUuYWRkTGlzdGVuZXIgKFNXVC5TaG93LCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCU1lbnVJdGVtIFtdIG1lbnVJdGVtcyA9IG1lbnUuZ2V0SXRlbXMgKCk7Ci0JCQlUcmVlSXRlbSBbXSB0cmVlSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG1lbnVJdGVtcyBbaV0uZ2V0VGV4dCAoKTsKLQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCXdoaWxlIChpbmRleDx0cmVlSXRlbXMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0cmVlSXRlbXMgW2luZGV4XS5nZXRUZXh0ICgpLmVxdWFscyAodGV4dCkpIGJyZWFrOwotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCQltZW51SXRlbXMgW2ldLnNldEVuYWJsZWQgKGluZGV4ICE9IHRyZWVJdGVtcy5sZW5ndGgpOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiZGIwLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENhcmV0IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgY2FyZXQKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlDYXJldCBjYXJldCA9IG5ldyBDYXJldCAoc2hlbGwsIFNXVC5OT05FKTsKLQljYXJldC5zZXRCb3VuZHMgKDEwLCAxMCwgMiwgMzIpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzUuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3OWNlLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDb21wb3NpdGUgZXhhbXBsZSBzbmlwcGV0OiBzZXQgdGhlIHRhYiB0cmF2ZXJzYWwgb3JkZXIgb2YgY2hpbGRyZW4KLSAqIEluIHRoaXMgZXhhbXBsZSwgY29tcG9zaXRlMSAoaS5lLiBjMSkgdGFiIG9yZGVyIGlzIHNldCB0bzogQjIsIEIxLCBCMywgYW5kCi0gKiBzaGVsbCB0YWIgb3JkZXIgaXMgc2V0IHRvOiBjMSwgQjcsIHRvb2xCYXIxLCAoYzQ6IG5vIGZvY3VzYWJsZSBjaGlsZHJlbiksIGMyLCBMMgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCQotCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMS5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjEuc2V0VGV4dCAoIkImMSIpOwotCUJ1dHRvbiByMSA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIxLnNldFRleHQgKCJSMSIpOwotCUJ1dHRvbiByMiA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUkFESU8pOwotCXIyLnNldFRleHQgKCJSJjIiKTsKLQlCdXR0b24gcjMgPSBuZXcgQnV0dG9uIChjMSwgU1dULlJBRElPKTsKLQlyMy5zZXRUZXh0ICgiUjMiKTsKLQlCdXR0b24gYjIgPSBuZXcgQnV0dG9uIChjMSwgU1dULlBVU0gpOwotCWIyLnNldFRleHQgKCJCMiIpOwotCUxpc3QgbDEgPSBuZXcgTGlzdCAoYzEsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwxIn0pOwotCUJ1dHRvbiBiMyA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjMuc2V0VGV4dCAoIkImMyIpOwotCUJ1dHRvbiBiNCA9IG5ldyBCdXR0b24gKGMxLCBTV1QuUFVTSCk7Ci0JYjQuc2V0VGV4dCAoIkImNCIpOwotCQotCUNvbXBvc2l0ZSBjMiA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljMi5zZXRMYXlvdXQgKG5ldyBSb3dMYXlvdXQgKCkpOwotCUJ1dHRvbiBiNSA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjUuc2V0VGV4dCAoIkImNSIpOwotCUJ1dHRvbiBiNiA9IG5ldyBCdXR0b24gKGMyLCBTV1QuUFVTSCk7Ci0JYjYuc2V0VGV4dCAoIkImNiIpOwotCQotCUxpc3QgbDIgPSBuZXcgTGlzdCAoc2hlbGwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQlsMi5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkwyIn0pOwotCQotCVRvb2xCYXIgdGIxID0gbmV3IFRvb2xCYXIgKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCVRvb2xJdGVtIGkxID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5SQURJTyk7Ci0JaTEuc2V0VGV4dCAoIkkxIik7Ci0JVG9vbEl0ZW0gaTIgPSBuZXcgVG9vbEl0ZW0gKHRiMSwgU1dULlJBRElPKTsKLQlpMi5zZXRUZXh0ICgiSTIiKTsKLQlDb21ibyBjb21ibzEgPSBuZXcgQ29tYm8gKHRiMSwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCWNvbWJvMS5zZXRJdGVtcyAobmV3IFN0cmluZyBbXSB7IkMxIn0pOwotCWNvbWJvMS5zZXRUZXh0ICgiQzEiKTsKLQljb21ibzEucGFjayAoKTsKLQlUb29sSXRlbSBpMyA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuU0VQQVJBVE9SKTsKLQlpMy5zZXRXaWR0aCAoY29tYm8xLmdldFNpemUgKCkueCk7Ci0JaTMuc2V0Q29udHJvbCAoY29tYm8xKTsKLQlUb29sSXRlbSBpNCA9IG5ldyBUb29sSXRlbSAodGIxLCBTV1QuUFVTSCk7Ci0JaTQuc2V0VGV4dCAoIkkmNCIpOwotCVRvb2xJdGVtIGk1ID0gbmV3IFRvb2xJdGVtICh0YjEsIFNXVC5DSEVDSyk7Ci0JaTUuc2V0VGV4dCAoIkk1Iik7Ci0JCi0JQnV0dG9uIGI3ID0gbmV3IEJ1dHRvbiAoc2hlbGwsIFNXVC5QVVNIKTsKLQliNy5zZXRUZXh0ICgiQiY3Iik7Ci0JCi0JQ29tcG9zaXRlIGM0ID0gbmV3IENvbXBvc2l0ZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCUNvbXBvc2l0ZSBjNSA9IG5ldyBDb21wb3NpdGUgKGM0LCBTV1QuQk9SREVSKTsKLQljNS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JbmV3IExhYmVsKGM1LCBTV1QuTk9ORSkuc2V0VGV4dCgiTm8iKTsKLQljNS5wYWNrKCk7Ci0KLQlDb250cm9sIFtdIHRhYkxpc3QxID0gbmV3IENvbnRyb2wgW10ge2IyLCBiMSwgYjN9OwotCWMxLnNldFRhYkxpc3QgKHRhYkxpc3QxKTsKLQlDb250cm9sIFtdIHRhYkxpc3QyID0gbmV3IENvbnRyb2wgW10ge2MxLCBiNywgdGIxLCBjNCwgYzIsIGwyfTsKLQlzaGVsbC5zZXRUYWJMaXN0ICh0YWJMaXN0Mik7Ci0KLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4gKCk7Ci0JCi0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0gCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0NzYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3ODNiLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIFRhYkZvbGRlciBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRhYiBmb2xkZXIgKHNpeCBwYWdlcykKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NiB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUYWJGb2xkZXIgdGFiRm9sZGVyID0gbmV3IFRhYkZvbGRlciAoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGk9MDsgaTw2OyBpKyspIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0gKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJUYWJJdGVtICIgKyBpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24gKHRhYkZvbGRlciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dCAoIlBhZ2UgIiArIGkpOwotCQlpdGVtLnNldENvbnRyb2wgKGJ1dHRvbik7Ci0JfQotCXRhYkZvbGRlci5wYWNrICgpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTUzMjkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVGFibGUgZXhhbXBsZSBzbmlwcGV0OiByZXNpemUgY29sdW1ucyBhcyB0YWJsZSByZXNpemVzCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JZmluYWwgQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWNvbHVtbjEuc2V0VGV4dCgiQ29sdW1uIDEiKTsKLQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JY29sdW1uMi5zZXRUZXh0KCJDb2x1bW4gMiIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7Iml0ZW0gMCIgKyBpLCAiaXRlbSAxIitpfSk7Ci0JfQotCWNvbXAuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCVJlY3RhbmdsZSBhcmVhID0gY29tcC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyKnRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQgKyB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSkgewotCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCX0KLQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQlpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zIAotCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGgvMyk7Ci0JCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAtIGNvbHVtbjEuZ2V0V2lkdGgoKSk7Ci0JCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlIAotCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aC8zKTsKLQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC0gY29sdW1uMS5nZXRXaWR0aCgpKTsKLQkJCX0KLQkJfQotCX0pOwotCQkKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWRhOTAuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRyYWcgdGV4dCBiZXR3ZWVuIHR3byBsYWJlbHMKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDc4IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlsYWJlbDEuc2V0VGV4dCAoIlRFWFQiKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlzZXREcmFnRHJvcCAobGFiZWwxKTsKLQlzZXREcmFnRHJvcCAobGFiZWwyKTsKLQlzaGVsbC5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIHNldERyYWdEcm9wIChmaW5hbCBMYWJlbCBsYWJlbCkgewotCQotCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQotCWZpbmFsIERyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKGxhYmVsLCBvcGVyYXRpb25zKTsKLQlzb3VyY2Uuc2V0VHJhbnNmZXIodHlwZXMpOwotCXNvdXJjZS5hZGREcmFnTGlzdGVuZXIgKG5ldyBEcmFnU291cmNlTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kb2l0ID0gKGxhYmVsLmdldFRleHQgKCkubGVuZ3RoICgpICE9IDApOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhIChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWV2ZW50LmRhdGEgPSBsYWJlbC5nZXRUZXh0ICgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkKLQkJCQlsYWJlbC5zZXRUZXh0ICgiIik7Ci0JCX0KLQl9KTsKLQotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQobGFiZWwsIG9wZXJhdGlvbnMpOwotCXRhcmdldC5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmRhdGEgPT0gbnVsbCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbGFiZWwuc2V0VGV4dCAoKFN0cmluZykgZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ3OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NWQzNWYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDc5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkZWZpbmUgbXkgb3duIGRhdGEgdHJhbnNmZXIgdHlwZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ3OSB7Ci0KLS8qIFRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGlzIGFuIDxib2xkPmFycmF5IG9mIHR5cGUgTXlUeXBlPC9ib2xkPiB3aGVyZSBNeVR5cGUgaXMgZGVmaW5lIGFzOiAqLwotc3RhdGljIGNsYXNzIE15VHlwZSB7Ci0JU3RyaW5nIGZpbGVOYW1lOwotCWxvbmcgZmlsZUxlbmd0aDsKLQlsb25nIGxhc3RNb2RpZmllZDsKLX0KLQotc3RhdGljIGNsYXNzIE15VHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlUWVBFTkFNRSA9ICJuYW1lX2Zvcl9teV90eXBlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVlUWVBFSUQgPSByZWdpc3RlclR5cGUgKE1ZVFlQRU5BTUUpOwotCXByaXZhdGUgc3RhdGljIE15VHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IE15VHJhbnNmZXIgKCk7Ci0KLXB1YmxpYyBzdGF0aWMgTXlUcmFuc2ZlciBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLQotcHVibGljIHZvaWQgamF2YVRvTmF0aXZlIChPYmplY3Qgb2JqZWN0LCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJEYXRhKSB7Ci0JaWYgKCFjaGVja015VHlwZShvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUgKHRyYW5zZmVyRGF0YSkpIHsKLQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCX0KLQlNeVR5cGUgW10gbXlUeXBlcyA9IChNeVR5cGUgW10pIG9iamVjdDsKLQl0cnkgewotCQkvLyB3cml0ZSBkYXRhIHRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlbiBhc2sgc3VwZXIgdG8gY29udmVydCB0byBwTWVkaXVtCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtICgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIHdyaXRlT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0gKG91dCk7Ci0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBteVR5cGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIFtdIGJ1ZmZlciA9IG15VHlwZXMgW2ldLmZpbGVOYW1lLmdldEJ5dGVzICgpOwotCQkJd3JpdGVPdXQud3JpdGVJbnQgKGJ1ZmZlci5sZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGUgKGJ1ZmZlcik7Ci0JCQl3cml0ZU91dC53cml0ZUxvbmcgKG15VHlwZXMgW2ldLmZpbGVMZW5ndGgpOwotCQkJd3JpdGVPdXQud3JpdGVMb25nIChteVR5cGVzIFtpXS5sYXN0TW9kaWZpZWQpOwotCQl9Ci0JCWJ5dGUgW10gYnVmZmVyID0gb3V0LnRvQnl0ZUFycmF5ICgpOwotCQl3cml0ZU91dC5jbG9zZSAoKTsKLQkJc3VwZXIuamF2YVRvTmF0aXZlIChidWZmZXIsIHRyYW5zZmVyRGF0YSk7Ci0JfQotCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotfQotCi1wdWJsaWMgT2JqZWN0IG5hdGl2ZVRvSmF2YSAoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCWlmIChpc1N1cHBvcnRlZFR5cGUgKHRyYW5zZmVyRGF0YSkpIHsKLQkJYnl0ZSBbXSBidWZmZXIgPSAoYnl0ZSBbXSkgc3VwZXIubmF0aXZlVG9KYXZhICh0cmFuc2ZlckRhdGEpOwotCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBudWxsOwotCi0JCU15VHlwZSBbXSBteURhdGEgPSBuZXcgTXlUeXBlIFswXTsKLQkJdHJ5IHsKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtIChidWZmZXIpOwotCQkJRGF0YUlucHV0U3RyZWFtIHJlYWRJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0gKGluKTsKLQkJCXdoaWxlIChyZWFkSW4uYXZhaWxhYmxlICgpID4gMjApIHsKLQkJCQlNeVR5cGUgZGF0dW0gPSBuZXcgTXlUeXBlICgpOwotCQkJCWludCBzaXplID0gcmVhZEluLnJlYWRJbnQgKCk7Ci0JCQkJYnl0ZSBbXSBuYW1lID0gbmV3IGJ5dGUgW3NpemVdOwotCQkJCXJlYWRJbi5yZWFkIChuYW1lKTsKLQkJCQlkYXR1bS5maWxlTmFtZSA9IG5ldyBTdHJpbmcgKG5hbWUpOwotCQkJCWRhdHVtLmZpbGVMZW5ndGggPSByZWFkSW4ucmVhZExvbmcgKCk7Ci0JCQkJZGF0dW0ubGFzdE1vZGlmaWVkID0gcmVhZEluLnJlYWRMb25nICgpOwotCQkJCU15VHlwZSBbXSBuZXdNeURhdGEgPSBuZXcgTXlUeXBlIFtteURhdGEubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weSAobXlEYXRhLCAwLCBuZXdNeURhdGEsIDAsIG15RGF0YS5sZW5ndGgpOwotCQkJCW5ld015RGF0YSBbbXlEYXRhLmxlbmd0aF0gPSBkYXR1bTsKLQkJCQlteURhdGEgPSBuZXdNeURhdGE7Ci0JCQl9Ci0JCQlyZWFkSW4uY2xvc2UgKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbXlEYXRhOwotCX0KLQotCXJldHVybiBudWxsOwotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIFtdIGdldFR5cGVOYW1lcyAoKSB7Ci0JcmV0dXJuIG5ldyBTdHJpbmcgW10ge01ZVFlQRU5BTUV9OwotfQotCi1wcm90ZWN0ZWQgaW50IFtdIGdldFR5cGVJZHMgKCkgewotCXJldHVybiBuZXcgaW50IFtdIHtNWVRZUEVJRH07Ci19Ci0KLWJvb2xlYW4gY2hlY2tNeVR5cGUoT2JqZWN0IG9iamVjdCkgewotCWlmIChvYmplY3QgPT0gbnVsbCB8fCAKLQkJIShvYmplY3QgaW5zdGFuY2VvZiBNeVR5cGVbXSkgfHwgCi0JCSgoTXlUeXBlW10pb2JqZWN0KS5sZW5ndGggPT0gMCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCU15VHlwZVtdIG15VHlwZXMgPSAoTXlUeXBlW10pb2JqZWN0OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbXlUeXBlcy5sZW5ndGg7IGkrKykgewotCQlpZiAobXlUeXBlc1tpXSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maWxlTmFtZSA9PSBudWxsIHx8IAotCQkJbXlUeXBlc1tpXS5maWxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKE9iamVjdCBvYmplY3QpIHsKLQlyZXR1cm4gY2hlY2tNeVR5cGUob2JqZWN0KTsKLX0KLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IEZpbGxMYXlvdXQgKCkpOwotCWZpbmFsIExhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbCAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuV1JBUCk7Ci0JbGFiZWwxLnNldFRleHQgKCJEcmFnIFNvdXJjZSBmb3IgTXlEYXRhW10iKTsKLQlmaW5hbCBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCWxhYmVsMi5zZXRUZXh0ICgiRHJvcCBUYXJnZXQgZm9yIE15RGF0YVtdIik7Ci0KLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlIChsYWJlbDEsIERORC5EUk9QX0NPUFkpOwotCXNvdXJjZS5zZXRUcmFuc2ZlciAobmV3IFRyYW5zZmVyIFtdIHtNeVRyYW5zZmVyLmdldEluc3RhbmNlICgpfSk7Ci0Jc291cmNlLmFkZERyYWdMaXN0ZW5lciAobmV3IERyYWdTb3VyY2VBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJTXlUeXBlIG15VHlwZTEgPSBuZXcgTXlUeXBlICgpOwotCQkJbXlUeXBlMS5maWxlTmFtZSA9ICJDOlxcYWJjLnR4dCI7Ci0JCQlteVR5cGUxLmZpbGVMZW5ndGggPSAxMDAwOwotCQkJbXlUeXBlMS5sYXN0TW9kaWZpZWQgPSAxMjMxMjMxMzsKLQkJCU15VHlwZSBteVR5cGUyID0gbmV3IE15VHlwZSAoKTsKLQkJCW15VHlwZTIuZmlsZU5hbWUgPSAiQzpcXHh5ei50eHQiOwotCQkJbXlUeXBlMi5maWxlTGVuZ3RoID0gNTAwOwotCQkJbXlUeXBlMi5sYXN0TW9kaWZpZWQgPSAxMjMxMjMyMzsKLQkJCWV2ZW50LmRhdGEgPSBuZXcgTXlUeXBlIFtdIHtteVR5cGUxLCBteVR5cGUyfTsKLQkJfQotCX0pOwotCURyb3BUYXJnZXQgdGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQgKGxhYmVsMiwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQpOwotCXRhcmdldC5zZXRUcmFuc2ZlciAobmV3IFRyYW5zZmVyIFtdIHtNeVRyYW5zZmVyLmdldEluc3RhbmNlICgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lciAobmV3IERyb3BUYXJnZXRBZGFwdGVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyIChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZCAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZHJvcCAoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSAhPSBudWxsKSB7Ci0JCQkJTXlUeXBlIFtdIG15VHlwZXMgPSAoTXlUeXBlIFtdKSBldmVudC5kYXRhOwotCQkJCWlmIChteVR5cGVzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG15VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN0cmluZyArPSBteVR5cGVzIFtpXS5maWxlTmFtZSArICIgIjsKLQkJCQkJfQotCQkJCQlsYWJlbDIuc2V0VGV4dCAoc3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0pOwotCXNoZWxsLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTJiNzkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhIHRyZWUgKGxhenkpCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDggewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQgKCJMYXp5IFRyZWUiKTsKLQlzaGVsbC5zZXRMYXlvdXQgKG5ldyBGaWxsTGF5b3V0ICgpKTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIpOwotCUZpbGUgW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cyAoKTsKLQlmb3IgKGludCBpPTA7IGk8cm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJVHJlZUl0ZW0gcm9vdCA9IG5ldyBUcmVlSXRlbSAodHJlZSwgMCk7Ci0JCXJvb3Quc2V0VGV4dCAocm9vdHMgW2ldLnRvU3RyaW5nICgpKTsKLQkJcm9vdC5zZXREYXRhIChyb290cyBbaV0pOwotCQluZXcgVHJlZUl0ZW0gKHJvb3QsIDApOwotCX0KLQl0cmVlLmFkZExpc3RlbmVyIChTV1QuRXhwYW5kLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoZmluYWwgRXZlbnQgZXZlbnQpIHsKLQkJCWZpbmFsIFRyZWVJdGVtIHJvb3QgPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQlUcmVlSXRlbSBbXSBpdGVtcyA9IHJvb3QuZ2V0SXRlbXMgKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zIFtpXS5nZXREYXRhICgpICE9IG51bGwpIHJldHVybjsKLQkJCQlpdGVtcyBbaV0uZGlzcG9zZSAoKTsKLQkJCX0KLQkJCUZpbGUgZmlsZSA9IChGaWxlKSByb290LmdldERhdGEgKCk7Ci0JCQlGaWxlIFtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMgKCk7Ci0JCQlpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOwotCQkJZm9yIChpbnQgaT0gMDsgaTxmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0gKHJvb3QsIDApOwotCQkJCWl0ZW0uc2V0VGV4dCAoZmlsZXMgW2ldLmdldE5hbWUgKCkpOwotCQkJCWl0ZW0uc2V0RGF0YSAoZmlsZXMgW2ldKTsKLQkJCQlpZiAoZmlsZXMgW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJbmV3IFRyZWVJdGVtIChpdGVtLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9KTsKLQlQb2ludCBzaXplID0gdHJlZS5jb21wdXRlU2l6ZSAoMzAwLCBTV1QuREVGQVVMVCk7Ci0JaW50IHdpZHRoID0gTWF0aC5tYXggKDMwMCwgc2l6ZS54KTsKLQlpbnQgaGVpZ2h0ID0gTWF0aC5tYXggKDMwMCwgc2l6ZS55KTsKLQlzaGVsbC5zZXRTaXplIChzaGVsbC5jb21wdXRlU2l6ZSAod2lkdGgsIGhlaWdodCkpOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4MC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDU1ODIuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogVHJlZSBleGFtcGxlIHNuaXBwZXQ6IGxpbWl0IHNlbGVjdGlvbiB0byBpdGVtcyB0aGF0IG1hdGNoIGEgcGF0dGVybgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODAgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0Jc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCWZpbmFsIFRyZWUgdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJpdGVtICIgKyBpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIgKyBqKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgMjsgaysrKSB7Ci0JCQkJVHJlZUl0ZW0gc3Vic3ViSXRlbSA9IG5ldyBUcmVlSXRlbShzdWJJdGVtLCBTV1QuTk9ORSk7Ci0JCQkJc3Vic3ViSXRlbS5zZXRUZXh0KCJpdGVtICIgKyBrKTsKLQkJCX0KLQkJfQotCX0KLQkKLQl0cmVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlUcmVlSXRlbVtdIHNlbGVjdGlvbiA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlUcmVlSXRlbVtdIHJldmlzZWRTZWxlY3Rpb24gPSBuZXcgVHJlZUl0ZW1bMF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0ZXh0ID0gc2VsZWN0aW9uW2ldLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dC5pbmRleE9mKCIxIikgPiAwKSB7Ci0JCQkJCVRyZWVJdGVtW10gbmV3U2VsZWN0aW9uID0gbmV3IFRyZWVJdGVtW3JldmlzZWRTZWxlY3Rpb24ubGVuZ3RoICsgMV07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocmV2aXNlZFNlbGVjdGlvbiwgMCwgbmV3U2VsZWN0aW9uLCAwLCByZXZpc2VkU2VsZWN0aW9uLmxlbmd0aCk7Ci0JCQkJCW5ld1NlbGVjdGlvbltyZXZpc2VkU2VsZWN0aW9uLmxlbmd0aF0gPSBzZWxlY3Rpb25baV07Ci0JCQkJCXJldmlzZWRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCQkJfQotCQkJfQotCQkJdHJlZS5zZXRTZWxlY3Rpb24ocmV2aXNlZFNlbGVjdGlvbik7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDgxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1N2VkZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIE9MRSBhbmQgQWN0aXZlWCBleGFtcGxlIHNuaXBwZXQ6IGJyb3dzZSB0aGUgdHlwZWxpYmluZm8gZm9yIGEgcHJvZ3JhbSBpZCAod2luMzIgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MSB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCi0JaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogamF2YSBNYWluIDxwcm9ncmFtIGlkPiIpOwotCQlyZXR1cm47Ci0JfQotCi0JU3RyaW5nIHByb2dJRCA9IGFyZ3NbMF07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCU9sZUZyYW1lIGZyYW1lID0gbmV3IE9sZUZyYW1lKHNoZWxsLCBTV1QuTk9ORSk7Ci0JT2xlQ29udHJvbFNpdGUgc2l0ZSA9IG51bGw7Ci0JT2xlQXV0b21hdGlvbiBhdXRvID0gbnVsbDsKLQl0cnkgewotCQlzaXRlID0gbmV3IE9sZUNvbnRyb2xTaXRlKGZyYW1lLCBTV1QuTk9ORSwgcHJvZ0lEKTsJCi0JCWF1dG8gPSBuZXcgT2xlQXV0b21hdGlvbihzaXRlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gb3BlbiB0eXBlIGxpYnJhcnkgZm9yICIrcHJvZ0lEKTsKLQkJcmV0dXJuOwotCX0KLQkJCi0JcHJpbnRUeXBlSW5mbyhhdXRvKTsKLQkKLQlhdXRvLmRpc3Bvc2UoKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci0KLX0KLQotcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFR5cGVJbmZvKE9sZUF1dG9tYXRpb24gYXV0bykgewotCVRZUEVBVFRSIHR5cGVhdHRyID0gYXV0by5nZXRUeXBlSW5mb0F0dHJpYnV0ZXMoKTsKLQlpZiAodHlwZWF0dHIgIT0gbnVsbCkgewkJCi0JCWlmICh0eXBlYXR0ci5jRnVuY3MgPiAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bmN0aW9ucyA6XG4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlYXR0ci5jRnVuY3M7IGkrKykgewkJCQotCQkJT2xlRnVuY3Rpb25EZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRGdW5jdGlvbkRlc2NyaXB0aW9uKGkpOwotCQkJU3RyaW5nIGFyZ0xpc3QgPSAiIjsKLQkJCWludCBmaXJzdE9wdGlvbmFsQXJnSW5kZXggPSBkYXRhLmFyZ3MubGVuZ3RoIC0gZGF0YS5vcHRpb25hbEFyZ0NvdW50OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmFyZ3MubGVuZ3RoOyBqKyspIHsKLQkJCQlhcmdMaXN0ICs9ICJbIjsKLQkJCQlpZiAoaiA+PSBmaXJzdE9wdGlvbmFsQXJnSW5kZXgpIGFyZ0xpc3QgKz0gIm9wdGlvbmFsLCAiOwotCQkJCWFyZ0xpc3QgKz0gZ2V0RGlyZWN0aW9uKGRhdGEuYXJnc1tqXS5mbGFncykrIl0gIitnZXRUeXBlTmFtZShkYXRhLmFyZ3Nbal0udHlwZSkrIiAiK2RhdGEuYXJnc1tqXS5uYW1lOwotCQkJCWlmICggaiA8IGRhdGEuYXJncy5sZW5ndGggLSAxKSBhcmdMaXN0ICs9ICIsICI7Ci0JCQl9CQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0SW52b2tlS2luZChkYXRhLmludm9rZUtpbmQpKyIgKGlkID0gIitkYXRhLmlkKyIpIDogIgotCQkJCQkgICAgICAgICsiXG5cdFNpZ25hdHVyZSAgIDogIitnZXRUeXBlTmFtZShkYXRhLnJldHVyblR5cGUpKyIgIitkYXRhLm5hbWUrIigiK2FyZ0xpc3QrIikiCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdERlc2NyaXB0aW9uIDogIitkYXRhLmRvY3VtZW50YXRpb24KLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0SGVscCBGaWxlICAgOiAiK2RhdGEuaGVscEZpbGUrIlxuIik7Ci0JCX0KLQkJCi0JCWlmICh0eXBlYXR0ci5jVmFycyA+IDApIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblZhcmlhYmxlcyAgOlxuIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZWF0dHIuY1ZhcnM7IGkrKykgewotCQkJT2xlUHJvcGVydHlEZXNjcmlwdGlvbiBkYXRhID0gYXV0by5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKGkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQUk9QRVJUWSAoaWQgPSAiK2RhdGEuaWQrIikgOiIKLQkJCSAgICAgICAgICAgICAgICAgICAgKyJcblx0TmFtZSA6ICIrZGF0YS5uYW1lCi0JCQkgICAgICAgICAgICAgICAgICAgICsiXG5cdFR5cGUgOiAiK2dldFR5cGVOYW1lKGRhdGEudHlwZSkrIlxuIik7Ci0JCX0KLQl9Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoaW50IHR5cGUpIHsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiI7Ci0JCWNhc2UgT0xFLlZUX1I0IDogcmV0dXJuICJmbG9hdCI7Ci0JCWNhc2UgT0xFLlZUX1I4IDogcmV0dXJuICJkb3VibGUiOwotCQljYXNlIE9MRS5WVF9JNCA6IHJldHVybiAiaW50IjsKLQkJY2FzZSBPTEUuVlRfRElTUEFUQ0ggOiByZXR1cm4gIklEaXNwYXRjaCI7Ci0JCWNhc2UgT0xFLlZUX1VOS05PV04gOiByZXR1cm4gIklVbmtub3duIjsKLQkJY2FzZSBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0IjsKLQkJY2FzZSBPTEUuVlRfQlNUUiA6IHJldHVybiAiU3RyaW5nIjsKLQkJY2FzZSBPTEUuVlRfVkFSSUFOVCA6IHJldHVybiAiVmFyaWFudCI7Ci0JCWNhc2UgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSI7Ci0JCWNhc2UgT0xFLlZUX0RBVEUgOiByZXR1cm4gIkRhdGUiOwotCQljYXNlIE9MRS5WVF9VSTEgOiByZXR1cm4gInVuc2lnbmVkIGNoYXIiOwotCQljYXNlIE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCI7Ci0JCWNhc2UgT0xFLlZUX1VTRVJERUZJTkVEIDogcmV0dXJuICJVc2VyRGVmaW5lZCI7Ci0JCWNhc2UgT0xFLlZUX0hSRVNVTFQgOiByZXR1cm4gImludCI7Ci0JCWNhc2UgT0xFLlZUX1ZPSUQgOiByZXR1cm4gInZvaWQiOwotCQkKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfQk9PTCA6IHJldHVybiAiYm9vbGVhbiAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfUjQgOiByZXR1cm4gImZsb2F0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9SOCA6IHJldHVybiAiZG91YmxlICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9JNCA6IHJldHVybiAiaW50ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9ESVNQQVRDSCA6IHJldHVybiAiSURpc3BhdGNoICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VTktOT1dOIDogcmV0dXJuICJJVW5rbm93biAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfSTIgOiByZXR1cm4gInNob3J0ICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9CU1RSIDogcmV0dXJuICJTdHJpbmcgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQgOiByZXR1cm4gIlZhcmlhbnQgKiI7Ci0JCWNhc2UgT0xFLlZUX0JZUkVGIHwgT0xFLlZUX0NZIDogcmV0dXJuICJDdXJyZW5jeSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfREFURSA6IHJldHVybiAiRGF0ZSAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVUkxIDogcmV0dXJuICJ1bnNpZ25lZCBjaGFyICoiOwotCQljYXNlIE9MRS5WVF9CWVJFRiB8IE9MRS5WVF9VSTQgOiByZXR1cm4gInVuc2lnbmVkIGludCAqIjsKLQkJY2FzZSBPTEUuVlRfQllSRUYgfCBPTEUuVlRfVVNFUkRFRklORUQgOiByZXR1cm4gIlVzZXJEZWZpbmVkICoiOwotCX0KLQlyZXR1cm4gInVua25vd24gIisgdHlwZTsJCi19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKGludCBkaXJlY3Rpb24pewotCVN0cmluZyBkaXJTdHJpbmcgPSAiIjsKLQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GSU4pICE9IDApIHsKLQkJZGlyU3RyaW5nICs9ICJpbiI7Ci0JCWNvbW1hID0gdHJ1ZTsKLQl9Ci0JaWYgKChkaXJlY3Rpb24gJiBPTEUuSURMRkxBR19GT1VUKSAhPSAwKXsKLQkJaWYgKGNvbW1hKSBkaXJTdHJpbmcgKz0gIiwgIjsKLQkJZGlyU3RyaW5nICs9ICJvdXQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRkxDSUQpICE9IDApewotCQlpZiAoY29tbWEpIGRpclN0cmluZyArPSAiLCAiOwotCQlkaXJTdHJpbmcgKz0gImxjaWQiOwotCQljb21tYSA9IHRydWU7Ci0JfQotCWlmICgoZGlyZWN0aW9uICYgT0xFLklETEZMQUdfRlJFVFZBTCkgIT0gMCl7Ci0JCWlmIChjb21tYSkgZGlyU3RyaW5nICs9ICIsICI7IAotCQlkaXJTdHJpbmcgKz0gInJldHZhbCI7Ci0JfQotCQotCXJldHVybiBkaXJTdHJpbmc7Ci19Ci1wcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW52b2tlS2luZChpbnQgaW52S2luZCkgewotCXN3aXRjaCAoaW52S2luZCkgewotCQljYXNlIE9MRS5JTlZPS0VfRlVOQyA6IHJldHVybiAiTUVUSE9EIjsKLQkJY2FzZSBPTEUuSU5WT0tFX1BST1BFUlRZR0VUIDogcmV0dXJuICJQUk9QRVJUWSBHRVQiOwotCQljYXNlIE9MRS5JTlZPS0VfUFJPUEVSVFlQVVQgOiByZXR1cm4gIlBST1BFUlRZIFBVVCI7Ci0JCWNhc2UgT0xFLklOVk9LRV9QUk9QRVJUWVBVVFJFRiA6IHJldHVybiAiUFJPUEVSVFkgUFVUIEJZIFJFRiI7Ci0JfQotCXJldHVybiAidW5rbm93biAiK2ludktpbmQ7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODIuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmQ3MjMyLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBDVGFiRm9sZGVyIGV4YW1wbGUgc25pcHBldDogcHJldmVudCBhbiBpdGVtIGZyb20gY2xvc2luZwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4MiB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JQ1RhYkZvbGRlciBmb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihzaGVsbCwgU1dULkJPUkRFUik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5DTE9TRSk7Ci0JCWl0ZW0uc2V0VGV4dCgiSXRlbSAiK2kpOwotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChmb2xkZXIsIFNXVC5NVUxUSSk7Ci0JCXRleHQuc2V0VGV4dCgiQ29udGVudCBmb3IgSXRlbSAiK2kpOwotCQlpdGVtLnNldENvbnRyb2wodGV4dCk7Ci0JfQotCQotCWZpbmFsIENUYWJJdGVtIHNwZWNpYWxJdGVtID0gbmV3IENUYWJJdGVtKGZvbGRlciwgU1dULkNMT1NFKTsKLQlzcGVjaWFsSXRlbS5zZXRUZXh0KCJEb24ndCBDbG9zZSBNZSIpOwotCVRleHQgdGV4dCA9IG5ldyBUZXh0KGZvbGRlciwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIlRoaXMgdGFiIGNhbiBuZXZlciBiZSBjbG9zZWQiKTsKLQlzcGVjaWFsSXRlbS5zZXRDb250cm9sKHRleHQpOwotCQkKLQlmb2xkZXIuYWRkQ1RhYkZvbGRlcjJMaXN0ZW5lcihuZXcgQ1RhYkZvbGRlcjJBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShDVGFiRm9sZGVyRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5pdGVtLmVxdWFscyhzcGVjaWFsSXRlbSkpIHsKLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkKLQlmaW5hbCBDVGFiSXRlbSBub0Nsb3NlSXRlbSA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQlub0Nsb3NlSXRlbS5zZXRUZXh0KCJObyBDbG9zZSBCdXR0b24iKTsKLQlUZXh0IHRleHQyID0gbmV3IFRleHQoZm9sZGVyLCBTV1QuTVVMVEkpOwotCXRleHQyLnNldFRleHQoIlRoaXMgdGFiIGRvZXMgbm90IGhhdmUgYSBjbG9zZSBidXR0b24iKTsKLQlub0Nsb3NlSXRlbS5zZXRDb250cm9sKHRleHQyKTsKLQkKLQlzaGVsbC5wYWNrKCk7Ci0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODMuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmY4ZmNkLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogRHJhZyBhbmQgRHJvcCBleGFtcGxlIHNuaXBwZXQ6IGRldGVybWluZSBkYXRhIHR5cGVzIGF2YWlsYWJsZSAod2luMzIgb25seSkKLSAqIE5PVEU6IFRoaXMgc25pcHBldCB1c2VzIGludGVybmFsIFNXVCBwYWNrYWdlcyB0aGF0IGFyZQotICogc3ViamVjdCB0byBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0ODMgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXByaXZhdGUgc3RhdGljIFNuaXBwZXQ4MyBfaW5zdGFuY2UgPSBuZXcgU25pcHBldDgzKCk7Ci1wcml2YXRlIGludFtdIGlkczsKLXByaXZhdGUgU3RyaW5nW10gbmFtZXM7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgY29udHJvbCA9IG5ldyBUYWJsZShzaGVsbCwgU1dULk5PTkUpOwotCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShjb250cm9sLCBTV1QuTk9ORSk7Ci0JaXRlbS5zZXRUZXh0KCJEcmFnIGRhdGEgb3ZlciB0aGlzIHNpdGUgdG8gc2VlIHRoZSBuYXRpdmUgdHJhbnNmZXIgdHlwZS4iKTsKLQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGNvbnRyb2wsIERORC5EUk9QX0RFRkFVTFQgfCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTElOSyB8IERORC5EUk9QX01PVkUpOwotCXRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7U25pcHBldDgzLmdldEluc3RhbmNlKCl9KTsKLQl0YXJnZXQuYWRkRHJvcExpc3RlbmVyKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewkJCQotCQkJU3RyaW5nIG9wcyA9ICIiOwotCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgb3BzICs9ICJDb3B5OyI7Ci0JCQlpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9NT1ZFKSAhPSAwKSBvcHMgKz0gIk1vdmU7IjsKLQkJCWlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0xJTkspICE9IDApIG9wcyArPSAiTGluazsiOwotCQkJY29udHJvbC5yZW1vdmVBbGwoKTsKLQkJCVRhYmxlSXRlbSBpdGVtMSA9IG5ldyBUYWJsZUl0ZW0oY29udHJvbCxTV1QuTk9ORSk7Ci0JCQlpdGVtMS5zZXRUZXh0KCJBbGxvd2VkIE9wZXJhdGlvbnMgYXJlICIrb3BzKTsKLQkJCQotCQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9ERUZBVUxUKSB7Ci0JCQkJaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJCX0gZWxzZSBpZiAoKGV2ZW50Lm9wZXJhdGlvbnMgJiBETkQuRFJPUF9MSU5LKSAhPSAwKSB7Ci0JCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX0xJTks7Ci0JCQkJfSBlbHNlIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX01PVkUpICE9IDApIHsKLQkJCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTU9WRTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVRyYW5zZmVyRGF0YVtdIGRhdGEgPSBldmVudC5kYXRhVHlwZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnQgaWQgPSBkYXRhW2ldLnR5cGU7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lRnJvbUlkKGlkKTsKLQkJCQlUYWJsZUl0ZW0gaXRlbTIgPSBuZXcgVGFibGVJdGVtKGNvbnRyb2wsU1dULk5PTkUpOwotCQkJCWl0ZW0yLnNldFRleHQoIkRhdGEgdHlwZSBpcyAiK2lkKyIgIituYW1lKTsKLQkJCX0KLQkJfQotCX0pOwotCQotCXNoZWxsLnNldFNpemUoNDAwLCA0MDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFNuaXBwZXQ4MyBnZXRJbnN0YW5jZSAoKSB7Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLX0KLVNuaXBwZXQ4MygpIHsKLQlpZHMgPSBuZXcgaW50WzgwMDAwXTsKLQluYW1lcyA9IG5ldyBTdHJpbmdbODAwMDBdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCWlkc1tpXSA9IGk7Ci0JCW5hbWVzW2ldID0gZ2V0TmFtZUZyb21JZChpKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUgKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLX0KLXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpewotCXJldHVybiAiSGVsbG8gV29ybGQiOwotfQotcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpewotCXJldHVybiBuYW1lczsKLX0KLXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCl7Ci0JcmV0dXJuIGlkczsKLX0KLXN0YXRpYyBTdHJpbmcgZ2V0TmFtZUZyb21JZChpbnQgaWQpIHsKLQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JaW50IG1heFNpemUgPSAxMjg7Ci0JVENIQVIgYnVmZmVyID0gbmV3IFRDSEFSKDAsIG1heFNpemUpOwotCWludCBzaXplID0gQ09NLkdldENsaXBib2FyZEZvcm1hdE5hbWUoaWQsIGJ1ZmZlciwgbWF4U2l6ZSk7Ci0JaWYgKHNpemUgIT0gMCkgewotCQluYW1lID0gYnVmZmVyLnRvU3RyaW5nKDAsIHNpemUpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgQ09NLkNGX0hEUk9QOgotCQkJCW5hbWUgPSAiQ0ZfSERST1AiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVEVYVDoKLQkJCQluYW1lID0gIkNGX1RFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfQklUTUFQOgotCQkJCW5hbWUgPSAiQ0ZfQklUTUFQIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX01FVEFGSUxFUElDVDoKLQkJCQluYW1lID0gIkNGX01FVEFGSUxFUElDVCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9TWUxLOgotCQkJCW5hbWUgPSAiQ0ZfU1lMSyI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9ESUY6Ci0JCQkJbmFtZSA9ICJDRl9ESUYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfVElGRjoKLQkJCQluYW1lID0gIkNGX1RJRkYiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfT0VNVEVYVDoKLQkJCQluYW1lID0gIkNGX09FTVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRElCOgotCQkJCW5hbWUgPSAiQ0ZfRElCIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BBTEVUVEU6Ci0JCQkJbmFtZSA9ICJDRl9QQUxFVFRFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1BFTkRBVEE6Ci0JCQkJbmFtZSA9ICJDRl9QRU5EQVRBIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1JJRkY6Ci0JCQkJbmFtZSA9ICJDRl9SSUZGIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1dBVkU6Ci0JCQkJbmFtZSA9ICJDRl9XQVZFIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09NLkNGX1VOSUNPREVURVhUOgotCQkJCW5hbWUgPSAiQ0ZfVU5JQ09ERVRFWFQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfRU5ITUVUQUZJTEU6Ci0JCQkJbmFtZSA9ICJDRl9FTkhNRVRBRklMRSI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTS5DRl9MT0NBTEU6Ci0JCQkJbmFtZSA9ICJDRl9MT0NBTEUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT00uQ0ZfTUFYOgotCQkJCW5hbWUgPSAiQ0ZfTUFYIjsKLQkJCQlicmVhazsKLQkJfQotCQkKLQl9Ci0JcmV0dXJuIG5hbWU7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODQuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZmMTEzLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBEcmFnIGFuZCBEcm9wIGV4YW1wbGUgc25pcHBldDogZGVmaW5lIGEgZGVmYXVsdCBvcGVyYXRpb24gKGluIHRoaXMgZXhhbXBsZSwgQ29weSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg0IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkKLQlmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGFiZWwuc2V0VGV4dCgiRHJhZyBTb3VyY2UiKTsKLQlEcmFnU291cmNlIHNvdXJjZSA9IG5ldyBEcmFnU291cmNlKGxhYmVsLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCXNvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9KTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyKG5ldyBEcmFnU291cmNlQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5kYXRhID0gIlRleHQgVHJhbnNmZXJyZWQiOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kb2l0KSB7Ci0JCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQkJc3dpdGNoIChldmVudC5kZXRhaWwpIHsKLQkJCQljYXNlIERORC5EUk9QX01PVkU6Ci0JCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfQ09QWToKLQkJCQkJb3BlcmF0aW9uID0gImNvcGllZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQkJb3BlcmF0aW9uID0gImxpbmtlZCI7IGJyZWFrOwotCQkJCWNhc2UgRE5ELkRST1BfTk9ORToKLQkJCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlvcGVyYXRpb24gPSAidW5rbm93biI7IGJyZWFrOwotCQkJCX0KLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZGF0YSAiK29wZXJhdGlvbisiKSIpOwotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5zZXRUZXh0KCJEcmFnIFNvdXJjZSAoZHJhZyBjYW5jZWxsZWQpIik7Ci0JCQl9Ci0JCX0KLQl9KTsKLQotCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQl0ZXh0LnNldFRleHQoIkRyb3AgVGFyZ2V0Iik7Ci0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0LCBETkQuRFJPUF9ERUZBVUxUIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JdGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7Ci0JCQlzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotCQkJY2FzZSBETkQuRFJPUF9NT1ZFOgotCQkJCW9wZXJhdGlvbiA9ICJtb3ZlZCI7IGJyZWFrOwotCQkJY2FzZSBETkQuRFJPUF9DT1BZOgotCQkJCW9wZXJhdGlvbiA9ICJjb3BpZWQiOyBicmVhazsKLQkJCWNhc2UgRE5ELkRST1BfTElOSzoKLQkJCQlvcGVyYXRpb24gPSAibGlua2VkIjsgYnJlYWs7Ci0JCQljYXNlIERORC5EUk9QX05PTkU6Ci0JCQkJb3BlcmF0aW9uID0gImRpc2FsbG93ZWQiOyBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJb3BlcmF0aW9uID0gInVua25vd24iOyBicmVhazsKLQkJCX0KLQkJCXRleHQuYXBwZW5kKCJcbiIrb3BlcmF0aW9uKyhTdHJpbmcpZXZlbnQuZGF0YSk7Ci0JCX0KLQl9KTsKLQkKLQlzaGVsbC5zZXRTaXplKDQwMCwgNDAwKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4NS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2QwOGQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgZXhhbXBsZSBzbmlwcGV0OiBIZWxsbyBXb3JsZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg1IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBTaGVsbCB3aXRoIHRoZSBkZWZhdWx0IHN0eWxlCi0JICogaS5lLiBmdWxsIHNjcmVlbiwgbm8gZGVjb3JhdGlvbiBvbiBQb2NrZXRQQy4KLQkgKi8KLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQotCS8qIAotCSAqIFNldCBhIHRleHQgc28gdGhhdCB0aGUgdG9wIGxldmVsIFNoZWxsCi0JICogYWxzbyBhcHBlYXJzIGluIHRoZSBQb2NrZXRQQyB0YXNrIGxpc3QKLQkgKi8KLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0KLQkvKgotCSAqIFNldCBhIG1lbnViYXIgdG8gZm9sbG93IFVJIGd1aWRlbGluZXMKLQkgKiBvbiBQb2NrZXRQQwotCSAqLwotCU1lbnUgbWIgPSBuZXcgTWVudShzaGVsbCwgU1dULkJBUik7Ci0Jc2hlbGwuc2V0TWVudUJhcihtYik7Ci0KLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ni5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOTkyNDkuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogUG9ja2V0UEMgU2hlbGwgZXhhbXBsZSBzbmlwcGV0OiAnT2snIGJ1dHRvbgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg2IHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULkNMT1NFKTsKLQlzaGVsbC5zZXRUZXh0KCJNYWluIik7Ci0JTWVudSBtYiA9IG5ldyBNZW51KHNoZWxsLCBTV1QuQkFSKTsKLQlzaGVsbC5zZXRNZW51QmFyKG1iKTsKLQlzaGVsbC5vcGVuKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJZGlzcGxheS5zbGVlcCgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4Ny5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDA2ODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIFBvY2tldFBDIFNoZWxsIGV4YW1wbGUgc25pcHBldDogcmVzaXplIGF1dG9tYXRpY2FsbHkgYXMgU0lQIGlzIG9uIG9yIG9mZgotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4NyB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5SRVNJWkUpOwotCXNoZWxsLnNldFRleHQoIk1haW4iKTsKLQlNZW51IG1iID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5CQVIpOwotCXNoZWxsLnNldE1lbnVCYXIobWIpOwotCS8qIEFkZCBhIGJ1dHRvbiB0byBtYWtlIHRoZSByZXNpemUgbW9yZSB2aXN1YWwgKi8KLQlGaWxsTGF5b3V0IGxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCk7Ci0Jc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiTWFpbiIpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDg4LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNjBkZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUVkaXRvciBleGFtcGxlIHNuaXBwZXQ6IGVkaXQgdGhlIHRleHQgb2YgYSB0YWJsZSBpdGVtIChpbiBwbGFjZSkKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ4OCB7Ci0JCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5ISURFX1NFTEVDVElPTik7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJpdGVtICIgKyBpLCAiZWRpdCB0aGlzIHZhbHVlIn0pOwotCX0KLQljb2x1bW4xLnBhY2soKTsKLQljb2x1bW4yLnBhY2soKTsKLQkKLQlmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IodGFibGUpOwotCS8vVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotCS8vbm90IGJlIGFueSBzbWFsbGVyIHRoYW4gNTAgcGl4ZWxzLgotCWVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3IubWluaW11bVdpZHRoID0gNTA7Ci0JLy8gZWRpdGluZyB0aGUgc2Vjb25kIGNvbHVtbgotCWZpbmFsIGludCBFRElUQUJMRUNPTFVNTiA9IDE7Ci0JCi0JdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJQ29udHJvbCBvbGRFZGl0b3IgPSBlZGl0b3IuZ2V0RWRpdG9yKCk7Ci0JCQlpZiAob2xkRWRpdG9yICE9IG51bGwpIG9sZEVkaXRvci5kaXNwb3NlKCk7Ci0JCi0JCQkvLyBJZGVudGlmeSB0aGUgc2VsZWN0ZWQgcm93Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZS5pdGVtOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuOwotCQotCQkJLy8gVGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIHRoZSBlZGl0b3IgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBUYWJsZQotCQkJVGV4dCBuZXdFZGl0b3IgPSBuZXcgVGV4dCh0YWJsZSwgU1dULk5PTkUpOwotCQkJbmV3RWRpdG9yLnNldFRleHQoaXRlbS5nZXRUZXh0KEVESVRBQkxFQ09MVU1OKSk7Ci0JCQluZXdFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgbWUpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKFRleHQpZWRpdG9yLmdldEVkaXRvcigpOwotCQkJCQllZGl0b3IuZ2V0SXRlbSgpLnNldFRleHQoRURJVEFCTEVDT0xVTU4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCW5ld0VkaXRvci5zZWxlY3RBbGwoKTsKLQkJCW5ld0VkaXRvci5zZXRGb2N1cygpOwotCQkJZWRpdG9yLnNldEVkaXRvcihuZXdFZGl0b3IsIGl0ZW0sIEVESVRBQkxFQ09MVU1OKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4oKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0ODkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjcyNWJjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ4OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBNZW51IGV4YW1wbGUgc25pcHBldDogY3JlYXRlIGEgbWVudSB3aXRoIHJhZGlvIGl0ZW1zCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDg5IHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCWZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKLQkJTWVudUl0ZW0gaXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlJBRElPKTsKLQkJaXRlbS5zZXRUZXh0ICgiSXRlbSAiICsgaSk7Ci0JCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWVudUl0ZW0gaXRlbSA9IChNZW51SXRlbSllLndpZGdldDsKLQkJCQlpZiAoaXRlbS5nZXRTZWxlY3Rpb24gKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuIChpdGVtICsgIiBzZWxlY3RlZCIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoaXRlbSArICIgdW5zZWxlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCXNoZWxsLnNldE1lbnUgKG1lbnUpOwotCXNoZWxsLnNldFNpemUgKDMwMCwgMzAwKTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCAoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCX0KLQlkaXNwbGF5LmRpc3Bvc2UgKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1YmUyZi4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLQotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IHNjcm9sbCBhIGNoaWxkIGNvbnRyb2wgYXV0b21hdGljYWxseQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5IHsKLQkKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5LCBTV1QuU0hFTExfVFJJTSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHNoZWxsLCBTV1QuQk9SREVSKTsKLQljb21wb3NpdGUuc2V0U2l6ZSAoNzAwLCA2MDApOwotCWZpbmFsIENvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9SRUQpOwotCWNvbXBvc2l0ZS5hZGRQYWludExpc3RlbmVyIChuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sIChQYWludEV2ZW50IGUpIHsKLQkJCWUuZ2Muc2V0QmFja2dyb3VuZCAocmVkKTsKLQkJCWUuZ2MuZmlsbE92YWwgKDUsIDUsIDY5MCwgNTkwKTsKLQkJfQotCX0pOwotCWZpbmFsIFNjcm9sbEJhciBoQmFyID0gc2hlbGwuZ2V0SG9yaXpvbnRhbEJhciAoKTsKLQloQmFyLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJUG9pbnQgbG9jYXRpb24gPSBjb21wb3NpdGUuZ2V0TG9jYXRpb24gKCk7Ci0JCQlsb2NhdGlvbi54ID0gLWhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChsb2NhdGlvbik7Ci0JCX0KLQl9KTsKLQlmaW5hbCBTY3JvbGxCYXIgdkJhciA9IHNoZWxsLmdldFZlcnRpY2FsQmFyICgpOwotCXZCYXIuYWRkTGlzdGVuZXIgKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IGNvbXBvc2l0ZS5nZXRMb2NhdGlvbiAoKTsKLQkJCWxvY2F0aW9uLnkgPSAtdkJhci5nZXRTZWxlY3Rpb24gKCk7Ci0JCQljb21wb3NpdGUuc2V0TG9jYXRpb24gKGxvY2F0aW9uKTsKLQkJfQotCX0pOwotCXNoZWxsLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVBvaW50IHNpemUgPSBjb21wb3NpdGUuZ2V0U2l6ZSAoKTsKLQkJCVJlY3RhbmdsZSByZWN0ID0gc2hlbGwuZ2V0Q2xpZW50QXJlYSAoKTsKLQkJCWhCYXIuc2V0TWF4aW11bSAoc2l6ZS54KTsKLQkJCXZCYXIuc2V0TWF4aW11bSAoc2l6ZS55KTsKLQkJCWhCYXIuc2V0VGh1bWIgKE1hdGgubWluIChzaXplLngsIHJlY3Qud2lkdGgpKTsKLQkJCXZCYXIuc2V0VGh1bWIgKE1hdGgubWluIChzaXplLnksIHJlY3QuaGVpZ2h0KSk7Ci0JCQlpbnQgaFBhZ2UgPSBzaXplLnggLSByZWN0LndpZHRoOwotCQkJaW50IHZQYWdlID0gc2l6ZS55IC0gcmVjdC5oZWlnaHQ7Ci0JCQlpbnQgaFNlbGVjdGlvbiA9IGhCYXIuZ2V0U2VsZWN0aW9uICgpOwotCQkJaW50IHZTZWxlY3Rpb24gPSB2QmFyLmdldFNlbGVjdGlvbiAoKTsKLQkJCVBvaW50IGxvY2F0aW9uID0gY29tcG9zaXRlLmdldExvY2F0aW9uICgpOwotCQkJaWYgKGhTZWxlY3Rpb24gPj0gaFBhZ2UpIHsKLQkJCQlpZiAoaFBhZ2UgPD0gMCkgaFNlbGVjdGlvbiA9IDA7Ci0JCQkJbG9jYXRpb24ueCA9IC1oU2VsZWN0aW9uOwotCQkJfQotCQkJaWYgKHZTZWxlY3Rpb24gPj0gdlBhZ2UpIHsKLQkJCQlpZiAodlBhZ2UgPD0gMCkgdlNlbGVjdGlvbiA9IDA7Ci0JCQkJbG9jYXRpb24ueSA9IC12U2VsZWN0aW9uOwotCQkJfQotCQkJY29tcG9zaXRlLnNldExvY2F0aW9uIChsb2NhdGlvbik7Ci0JCX0KLQl9KTsKLQlzaGVsbC5vcGVuICgpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkwLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmMTNjZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUcmVlIGV4YW1wbGUgc25pcHBldDogZGV0ZWN0IG1vdXNlIGRvd24gaW4gYSB0cmVlIGl0ZW0KLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MCB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlmaW5hbCBUcmVlIHRyZWUgPSBuZXcgVHJlZSAoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCWZvciAoaW50IGk9MDsgaTwxMjsgaSsrKSB7Ci0JCVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTk9ORSk7Ci0JCXRyZWVJdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JdHJlZS5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRG93biwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0JCQlQb2ludCBwb2ludCA9IG5ldyBQb2ludCAoZXZlbnQueCwgZXZlbnQueSk7Ci0JCQlUcmVlSXRlbSBpdGVtID0gdHJlZS5nZXRJdGVtIChwb2ludCk7Ci0JCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuICgiTW91c2UgZG93bjogIiArIGl0ZW0pOwotCQkJfQotCQl9Ci0JfSk7Ci0JdHJlZS5zZXRTaXplICgyMDAsIDIwMCk7Ci0Jc2hlbGwuc2V0U2l6ZSAoMzAwLCAzMDApOwotCXNoZWxsLm9wZW4gKCk7Ci0Jd2hpbGUgKCFzaGVsbC5pc0Rpc3Bvc2VkICgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2ggKCkpIGRpc3BsYXkuc2xlZXAgKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSAoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkxLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmOTUzNS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIERyYWcgYW5kIERyb3AgZXhhbXBsZSBzbmlwcGV0OiBkcmFnIGxlYWYgaXRlbXMgaW4gYSB0cmVlCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5MSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCQotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5CT1JERVIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIml0ZW0gIitpKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLQkJCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJc3ViSXRlbS5zZXRUZXh0KCJpdGVtICIraSsiICIraik7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDM7IGsrKykgewotCQkJCVRyZWVJdGVtIHN1YnN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0oc3ViSXRlbSwgU1dULk5PTkUpOwotCQkJCXN1YnN1Ykl0ZW0uc2V0VGV4dCgiaXRlbSAiK2krIiAiK2orIiAiK2spOwotCQkJfQotCQl9Ci0JfQotCQotCVRyYW5zZmVyW10gdHlwZXMgPSBuZXcgVHJhbnNmZXJbXSB7VGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCl9OwotCWludCBvcGVyYXRpb25zID0gRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9MSU5LOwotCQotCWZpbmFsIERyYWdTb3VyY2Ugc291cmNlID0gbmV3IERyYWdTb3VyY2UgKHRyZWUsIG9wZXJhdGlvbnMpOwotCXNvdXJjZS5zZXRUcmFuc2Zlcih0eXBlcyk7Ci0JZmluYWwgVHJlZUl0ZW1bXSBkcmFnU291cmNlSXRlbSA9IG5ldyBUcmVlSXRlbVsxXTsKLQlzb3VyY2UuYWRkRHJhZ0xpc3RlbmVyIChuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJVHJlZUl0ZW1bXSBzZWxlY3Rpb24gPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAwICYmIHNlbGVjdGlvblswXS5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJZXZlbnQuZG9pdCA9IHRydWU7Ci0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0gPSBzZWxlY3Rpb25bMF07Ci0JCQl9IGVsc2UgewotCQkJCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEgKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJZXZlbnQuZGF0YSA9IGRyYWdTb3VyY2VJdGVtWzBdLmdldFRleHQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX01PVkUpCi0JCQkJZHJhZ1NvdXJjZUl0ZW1bMF0uZGlzcG9zZSgpOwotCQkJCWRyYWdTb3VyY2VJdGVtWzBdID0gbnVsbDsKLQkJfQotCX0pOwotCi0JRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0cmVlLCBvcGVyYXRpb25zKTsKLQl0YXJnZXQuc2V0VHJhbnNmZXIodHlwZXMpOwotCXRhcmdldC5hZGREcm9wTGlzdGVuZXIgKG5ldyBEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJaWYgKGV2ZW50Lml0ZW0gIT0gbnVsbCkgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCWlmIChwdC55IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkU7Ci0JCQkJfSBlbHNlIGlmIChwdC55ID4gYm91bmRzLnkgKyAyKmJvdW5kcy5oZWlnaHQvMykgewotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZGF0YSA9PSBudWxsKSB7Ci0JCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpZXZlbnQuZGF0YTsKLQkJCWlmIChldmVudC5pdGVtID09IG51bGwpIHsKLQkJCQlUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FKTsKLQkJCQlpdGVtLnNldFRleHQodGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pZXZlbnQuaXRlbTsKLQkJCQlQb2ludCBwdCA9IGRpc3BsYXkubWFwKG51bGwsIHRyZWUsIGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCVRyZWVJdGVtIHBhcmVudCA9IGl0ZW0uZ2V0UGFyZW50SXRlbSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gcGFyZW50LmdldEl0ZW1zKCk7Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpdGVtc1tpXSA9PSBpdGVtKSB7Ci0JCQkJCQkJaW5kZXggPSBpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwdC55IDwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzMpIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50LCBTV1QuTk9ORSwgaW5kZXgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHBhcmVudCwgU1dULk5PTkUsIGluZGV4KzEpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCQkJCQluZXdJdGVtLnNldFRleHQodGV4dCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWUuZ2V0SXRlbXMoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGl0ZW1zW2ldID09IGl0ZW0pIHsKLQkJCQkJCQlpbmRleCA9IGk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHB0LnkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQvMykgewotCQkJCQkJVHJlZUl0ZW0gbmV3SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgaW5kZXgpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9IGVsc2UgaWYgKHB0LnkgPiBib3VuZHMueSArIDIqYm91bmRzLmhlaWdodC8zKSB7Ci0JCQkJCQlUcmVlSXRlbSBuZXdJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWUsIFNXVC5OT05FLCBpbmRleCsxKTsKLQkJCQkJCW5ld0l0ZW0uc2V0VGV4dCh0ZXh0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVRyZWVJdGVtIG5ld0l0ZW0gPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJCQkJbmV3SXRlbS5zZXRUZXh0KHRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCQotCQkJfQotCQl9Ci0JfSk7Ci0KLQlzaGVsbC5zZXRTaXplICg0MDAsIDQwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNzEwOC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDdXJzb3IgZXhhbXBsZSBzbmlwcGV0OiBjcmVhdGUgYSBjdXJzb3IgZnJvbSBhIHNvdXJjZSBhbmQgYSBtYXNrCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkyIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9XSElURSk7Ci0JQ29sb3IgYmxhY2sgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yIChTV1QuQ09MT1JfQkxBQ0spOwotCQotCS8vQ3JlYXRlIGEgc291cmNlIEltYWdlRGF0YSBvZiBkZXB0aCAxIChtb25vY2hyb21lKQotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge3doaXRlLmdldFJHQigpLCBibGFjay5nZXRSR0IoKSx9KTsKLQlJbWFnZURhdGEgc291cmNlRGF0YSA9IG5ldyBJbWFnZURhdGEgKDIwLCAyMCwgMSwgcGFsZXR0ZSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSArKykgewotCQlmb3IgKGludCBqID0gMDsgaiA8IDIwOyBqKyspIHsKLQkJCXNvdXJjZURhdGEuc2V0UGl4ZWwoaSwgaiwgMSk7Ci0JCX0KLQl9Ci0JCi0JLy9DcmVhdGUgYSBtYXNrIEltYWdlRGF0YSBvZiBkZXB0aCAxIChtb25vY2hyb21lKQotCXBhbGV0dGUgPSBuZXcgUGFsZXR0ZURhdGEgKG5ldyBSR0IgW10ge3doaXRlLmdldFJHQigpLCBibGFjay5nZXRSR0IoKSx9KTsKLQlJbWFnZURhdGEgbWFza0RhdGEgPSBuZXcgSW1hZ2VEYXRhICgyMCwgMjAsIDEsIHBhbGV0dGUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkgKyspIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7Ci0JCQltYXNrRGF0YS5zZXRQaXhlbChpLCBqLCAxKTsKLQkJfQotCX0KLQkvL0NyZWF0ZSBjdXJzb3IKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2VEYXRhLCBtYXNrRGF0YSwgMTAsIDEwKTsKLQkKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlmaW5hbCBJbWFnZSBzb3VyY2UgPSBuZXcgSW1hZ2UgKGRpc3BsYXksc291cmNlRGF0YSk7Ci0JZmluYWwgSW1hZ2UgbWFzayA9IG5ldyBJbWFnZSAoZGlzcGxheSwgbWFza0RhdGEpOwotCS8vRHJhdyBzb3VyY2UgYW5kIG1hc2sganVzdCB0byBzaG93IHdoYXQgdGhleSBsb29rIGxpa2UKLQlzaGVsbC5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0JCQlHQyBnYyA9IGUuZ2M7Ci0JCQlnYy5kcmF3U3RyaW5nKCJzb3VyY2U6ICIsIDEwLCAxMCk7Ci0JCQlnYy5kcmF3SW1hZ2Uoc291cmNlLCAwLCAwLCAyMCwgMjAsIDYwLCAxMCwgMjAsIDIwKTsKLQkJCWdjLmRyYXdTdHJpbmcoIm1hc2s6ICIsMTAsIDQwKTsKLQkJCWdjLmRyYXdJbWFnZShtYXNrLCAwLCAwLCAyMCwgMjAsIDYwLCA0MCwgMjAsIDIwKTsKLQkJfQotCX0pOwotCXNoZWxsLnNldFNpemUoMTUwLCAxNTApOwotCXNoZWxsLm9wZW4oKTsKLQlzaGVsbC5zZXRDdXJzb3IoY3Vyc29yKTsKLQkKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWN1cnNvci5kaXNwb3NlKCk7Ci0Jc291cmNlLmRpc3Bvc2UoKTsKLQltYXNrLmRpc3Bvc2UoKTsKLQlkaXNwbGF5LmRpc3Bvc2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5My5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTcyOWQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDkzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBtZWFzdXJlIGEgc3RyaW5nCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi1wdWJsaWMgY2xhc3MgU25pcHBldDkzIHsKLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dCAobmV3IFJvd0xheW91dCAoKSk7Ci0JTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwgKHNoZWxsLCBTV1QuTk9ORSk7Ci0JR0MgZ2MgPSBuZXcgR0MgKGxhYmVsKTsKLQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudCAoIkhlbGxvIik7Ci0JZ2MuZGlzcG9zZSAoKTsKLQlsYWJlbC5zZXRUZXh0ICgiSGVsbG8gLT4gIiArIHNpemUpOwotCXNoZWxsLnBhY2sgKCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk0LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyNmUyMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBDbGlwYm9hcmQgZXhhbXBsZSBzbmlwcGV0OiBjb3B5IGFuZCBwYXN0ZSBkYXRhIHdpdGggdGhlIGNsaXBib2FyZAotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTQgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIENsaXBib2FyZCBjYiA9IG5ldyBDbGlwYm9hcmQoZGlzcGxheSk7Ci0JZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwgKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQlmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChzaGVsbCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCi0JQnV0dG9uIGNvcHkgPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JY29weS5zZXRUZXh0KCJDb3B5Iik7Ci0JY29weS5hZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpIHsKLQkJCVN0cmluZyB0ZXh0RGF0YSA9IHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpOwotCQkJaWYgKHRleHREYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCVRleHRUcmFuc2ZlciB0ZXh0VHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQljYi5zZXRDb250ZW50cyhuZXcgT2JqZWN0W117dGV4dERhdGF9LCBuZXcgVHJhbnNmZXJbXXt0ZXh0VHJhbnNmZXJ9KTsKLQkJCX0KLQkJfQotCX0pOwotCQotCUJ1dHRvbiBwYXN0ZSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlwYXN0ZS5zZXRUZXh0KCJQYXN0ZSIpOwotCXBhc3RlLmFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlTdHJpbmcgZGF0YSA9IChTdHJpbmcpY2IuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCXRleHQuaW5zZXJ0KGRhdGEpOwotCQkJfQotCQl9Ci0JfSk7Ci0JCi0JRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwYXN0ZSwgMCwgU1dULkxFRlQpOwotCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JY29weS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvcHksIDUpOwotCXBhc3RlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHBhc3RlLCAtNSk7Ci0JZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNSk7Ci0JdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQotCXNoZWxsLnNldFNpemUoMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JY2IuZGlzcG9zZSgpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk1LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkYzEwMS4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogR0MgZXhhbXBsZSBzbmlwcGV0OiBjYXB0dXJlIGEgd2lkZ2V0IGltYWdlIHdpdGggYSBHQwotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5NSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldFRleHQoIldpZGdldCIpOwotCQotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuTVVMVEkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQl0YWJsZS5zZXRCb3VuZHMoMTAsIDEwLCAxMDAsIDEwMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpLnNldFRleHQoIml0ZW0iICsgaSk7Ci0JfQotCQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoIkNhcHR1cmUiKTsKLQlidXR0b24ucGFjaygpOwotCWJ1dHRvbi5zZXRMb2NhdGlvbigxMCwgMTQwKTsKLQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJUG9pbnQgdGFibGVTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJR0MgZ2MgPSBuZXcgR0ModGFibGUpOwotCQkJZmluYWwgSW1hZ2UgaW1hZ2UgPQotCQkJCW5ldyBJbWFnZShkaXNwbGF5LCB0YWJsZVNpemUueCwgdGFibGVTaXplLnkpOwotCQkJZ2MuY29weUFyZWEoaW1hZ2UsIDAsIDApOwotCQkJZ2MuZGlzcG9zZSgpOwotCQkJCi0JCQlTaGVsbCBwb3B1cCA9IG5ldyBTaGVsbChzaGVsbCk7Ci0JCQlwb3B1cC5zZXRUZXh0KCJJbWFnZSIpOwotCQkJcG9wdXAuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHBvcHVwLCBTV1QuTk9ORSk7Ci0JCQljYW52YXMuc2V0Qm91bmRzKDEwLCAxMCwgdGFibGVTaXplLngrMTAsIHRhYmxlU2l6ZS55KzEwKTsKLQkJCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJZS5nYy5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwotCQkJCX0KLQkJCX0pOwotCQkJcG9wdXAucGFjaygpOwotCQkJcG9wdXAub3BlbigpOwotCQl9Ci0JfSk7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTYuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmUyNDg1Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0KLS8qCi0gKiBUYWJsZUN1cnNvciBleGFtcGxlIHNuaXBwZXQ6IG5hdmlnYXRlIGEgdGFibGUgY2VsbHMgd2l0aCBhcnJvdyBrZXlzLiAKLSAqIEVkaXQgd2hlbiB1c2VyIGhpdHMgUmV0dXJuIGtleS4gIEV4aXQgZWRpdCBtb2RlIGJ5IGhpdHRpbmcgRXNjYXBlIChjYW5jZWxzIGVkaXQpCi0gKiBvciBSZXR1cm4gKGFwcGxpZXMgZWRpdCB0byB0YWJsZSkuCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTYgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkvLyBjcmVhdGUgYSBhIHRhYmxlIHdpdGggMyBjb2x1bW5zIGFuZCBmaWxsIHdpdGggZGF0YQotCWZpbmFsIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiY2VsbCAiICsgaSArICIgMCIsIAkiY2VsbCAiICsgaSArICIgMSIsICJjZWxsICIgKyBpICsgIiAyIiB9KTsKLQl9Ci0JY29sdW1uMS5wYWNrKCk7Ci0JY29sdW1uMi5wYWNrKCk7Ci0JY29sdW1uMy5wYWNrKCk7Ci0KLQkvLyBjcmVhdGUgYSBUYWJsZUN1cnNvciB0byBuYXZpZ2F0ZSBhcm91bmQgdGhlIHRhYmxlCi0JZmluYWwgVGFibGVDdXJzb3IgY3Vyc29yID0gbmV3IFRhYmxlQ3Vyc29yKHRhYmxlLCBTV1QuTk9ORSk7Ci0JLy8gY3JlYXRlIGFuIGVkaXRvciB0byBlZGl0IHRoZSBjZWxsIHdoZW4gdGhlIHVzZXIgaGl0cyAiRU5URVIiIAotCS8vIHdoaWxlIG92ZXIgYSBjZWxsIGluIHRoZSB0YWJsZQotCWZpbmFsIENvbnRyb2xFZGl0b3IgZWRpdG9yID0gbmV3IENvbnRyb2xFZGl0b3IoY3Vyc29yKTsKLQllZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCWVkaXRvci5ncmFiVmVydGljYWwgPSB0cnVlOwotCi0JY3Vyc29yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkvLyB3aGVuIHRoZSBUYWJsZUVkaXRvciBpcyBvdmVyIGEgY2VsbCwgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHJvdyBpbiAKLQkJLy8gdGhlIHRhYmxlCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBjdXJzb3IuZ2V0Um93KCl9KTsKLQkJfQotCQkvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIiBpbiB0aGUgVGFibGVDdXJzb3IsIHBvcCB1cCBhIHRleHQgZWRpdG9yIHNvIHRoYXQgCi0JCS8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbAotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQoY3Vyc29yLCBTV1QuTk9ORSk7Ci0JCQlUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkJaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJCXRleHQuc2V0VGV4dChyb3cuZ2V0VGV4dChjb2x1bW4pKTsKLQkJCXRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciBhbmQgY29weSB0aGUgZGF0YSBvdmVyIAotCQkJCQkvLyB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkJCQkJaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJCQkJCXJvdy5zZXRUZXh0KGNvbHVtbiwgdGV4dC5nZXRUZXh0KCkpOwotCQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIHdoZW4gdGhlIHVzZXIgaGl0cyAiRVNDIgotCQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkVTQykgewotCQkJCQkJdGV4dC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIHRhYnMgYXdheQotCQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWVkaXRvci5zZXRFZGl0b3IodGV4dCk7Ci0JCQl0ZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQl9KTsKLQkvLyBIaWRlIHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlICJDVFJMIiBvciAiU0hJRlQiIGtleS4KLQkvLyBUaGlzIGFsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcyBpbiB0aGUgdGFibGUuCi0JY3Vyc29yLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkNUUkwKLQkJCQl8fCBlLmtleUNvZGUgPT0gU1dULlNISUZUCi0JCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDAKLQkJCQl8fCAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApIHsKLQkJCQljdXJzb3Iuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQkvLyBXaGVuIHRoZSB1c2VyIGRvdWJsZSBjbGlja3MgaW4gdGhlIFRhYmxlQ3Vyc29yLCBwb3AgdXAgYSB0ZXh0IGVkaXRvciBzbyB0aGF0IAotCS8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbAotCWN1cnNvci5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCWZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KGN1cnNvciwgU1dULk5PTkUpOwotCQkJVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJCWludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCQl0ZXh0LnNldFRleHQocm93LmdldFRleHQoY29sdW1uKSk7Ci0JCQl0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3IgYW5kIGNvcHkgdGhlIGRhdGEgb3ZlciAKLQkJCQkJLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkJCQkJVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJCQkJCWludCBjb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uKCk7Ci0JCQkJCQlyb3cuc2V0VGV4dChjb2x1bW4sIHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCS8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIGhpdHMgIkVTQyIKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLQkJCQkJCXRleHQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkvLyBjbG9zZSB0aGUgdGV4dCBlZGl0b3Igd2hlbiB0aGUgdXNlciBjbGlja3MgYXdheQotCQkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWVkaXRvci5zZXRFZGl0b3IodGV4dCk7Ci0JCQl0ZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQl9KTsKLQkKLQkvLyBTaG93IHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIHRoZSAiU0hJRlQiIG9yICJDVFJMIiBrZXkuCi0JLy8gVGhpcyBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIG11bHRpcGxlIHNlbGVjdGlvbiB0YXNrLgotCXRhYmxlLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQlpZiAoZS5rZXlDb2RlID09IFNXVC5DT05UUk9MICYmIChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlID09IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS5rZXlDb2RlICE9IFNXVC5DT05UUk9MCi0JCQkJJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUua2V5Q29kZSAhPSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKQotCQkJCXJldHVybjsKLQotCQkJVGFibGVJdGVtW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlUYWJsZUl0ZW0gcm93ID0gKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgPyB0YWJsZS5nZXRJdGVtKHRhYmxlLmdldFRvcEluZGV4KCkpIDogc2VsZWN0aW9uWzBdOwotCQkJdGFibGUuc2hvd0l0ZW0ocm93KTsKLQkJCWN1cnNvci5zZXRTZWxlY3Rpb24ocm93LCAwKTsKLQkJCWN1cnNvci5zZXRWaXNpYmxlKHRydWUpOwotCQkJY3Vyc29yLnNldEZvY3VzKCk7Ci0JCX0KLQl9KTsKLQotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQlkaXNwbGF5LnNsZWVwKCk7Ci0JfQotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk3LmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwMTc0Yy4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3Quc25pcHBldHM7Ci0gCi0vKgotICogTWVudSBleGFtcGxlIHNuaXBwZXQ6IGZpbGwgYSBtZW51IGR5bmFtaWNhbGx5ICh3aGVuIG1lbnUgc2hvd24pCi0gKgotICogRm9yIGEgbGlzdCBvZiBhbGwgU1dUIGV4YW1wbGUgc25pcHBldHMgc2VlCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dC9zbmlwcGV0cy8KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBTbmlwcGV0OTcgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSAoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7Ci0JZmluYWwgVHJlZSB0cmVlID0gbmV3IFRyZWUgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQlmaW5hbCBNZW51IG1lbnUgPSBuZXcgTWVudSAoc2hlbGwsIFNXVC5QT1BfVVApOwotCXRyZWUuc2V0TWVudSAobWVudSk7Ci0JZm9yIChpbnQgaT0wOyBpPDEyOyBpKyspIHsKLQkJVHJlZUl0ZW0gaXRlbSA9IG5ldyBUcmVlSXRlbSAodHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQgKCJJdGVtICIgKyBpKTsKLQl9Ci0JbWVudS5hZGRMaXN0ZW5lciAoU1dULlNob3csIG5ldyBMaXN0ZW5lciAoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBldmVudCkgewotCQkJTWVudUl0ZW0gW10gbWVudUl0ZW1zID0gbWVudS5nZXRJdGVtcyAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQltZW51SXRlbXMgW2ldLmRpc3Bvc2UgKCk7Ci0JCQl9Ci0JCQlUcmVlSXRlbSBbXSB0cmVlSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbiAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTx0cmVlSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULlBVU0gpOwotCQkJCW1lbnVJdGVtLnNldFRleHQgKHRyZWVJdGVtcyBbaV0uZ2V0VGV4dCAoKSk7Ci0JCQl9Ci0JCX0KLQl9KTsKLQl0cmVlLnNldFNpemUgKDIwMCwgMjAwKTsKLQlzaGVsbC5zZXRTaXplICgzMDAsIDMwMCk7Ci0Jc2hlbGwub3BlbiAoKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfSAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OC5qYXZhIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzkxODYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldDk4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotIAotLyoKLSAqIENvbXBvc2l0ZSBleGFtcGxlIHNuaXBwZXQ6IGNyZWF0ZSBhbmQgZGlzcG9zZSBjaGlsZHJlbiBvZiBhIGNvbXBvc2l0ZQotICoKLSAqIEZvciBhIGxpc3Qgb2YgYWxsIFNXVCBleGFtcGxlIHNuaXBwZXRzIHNlZQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9zd3Qvc25pcHBldHMvCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5OCB7Ci0KLXN0YXRpYyBpbnQgcGFnZU51bSA9IDA7Ci1zdGF0aWMgQ29tcG9zaXRlIHBhZ2VDb21wb3NpdGU7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJQdXNoIik7Ci0JcGFnZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQlwYWdlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQlwYWdlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCWlmICgocGFnZUNvbXBvc2l0ZSAhPSBudWxsKSAmJiAoIXBhZ2VDb21wb3NpdGUuaXNEaXNwb3NlZCgpKSkgewotCQkJCXBhZ2VDb21wb3NpdGUuZGlzcG9zZSgpOwotCQkJfQotCQkJcGFnZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJCXBhZ2VDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJcGFnZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCWlmIChwYWdlTnVtKysgJSAyID09IDApIHsKLQkJCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYWdlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSkuc2V0VGV4dCgidGFibGUgaXRlbSAiICsgaSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluZXcgQnV0dG9uKHBhZ2VDb21wb3NpdGUsIFNXVC5SQURJTykuc2V0VGV4dCgicmFkaW8iKTsKLQkJCX0KLQkJCXNoZWxsLmxheW91dCh0cnVlKTsKLQkJfQotCX0pOwotCi0Jc2hlbGwub3BlbigpOwotCXdoaWxlICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCWRpc3BsYXkuc2xlZXAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0OTkuamF2YSBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmEzYWNjLi4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL1NuaXBwZXQ5OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0czsKLSAKLS8qCi0gKiBTaGVsbCBleGFtcGxlIHNuaXBwZXQ6IHByZXZlbnQgYSBzaGVsbCBmcm9tIGNsb3NpbmcgKHByb21wdCB0aGUgdXNlcikKLSAqCi0gKiBGb3IgYSBsaXN0IG9mIGFsbCBTV1QgZXhhbXBsZSBzbmlwcGV0cyBzZWUKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0L3NuaXBwZXRzLwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotcHVibGljIGNsYXNzIFNuaXBwZXQ5OSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5ICgpOwotCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsIChkaXNwbGF5KTsKLQlzaGVsbC5hZGRMaXN0ZW5lciAoU1dULkNsb3NlLCBuZXcgTGlzdGVuZXIgKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLQkJCWludCBzdHlsZSA9IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5ZRVMgfCBTV1QuTk87Ci0JCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveCAoc2hlbGwsIHN0eWxlKTsKLQkJCW1lc3NhZ2VCb3guc2V0VGV4dCAoIkluZm9ybWF0aW9uIik7Ci0JCQltZXNzYWdlQm94LnNldE1lc3NhZ2UgKCJDbG9zZSB0aGUgc2hlbGw/Iik7Ci0JCQlldmVudC5kb2l0ID0gbWVzc2FnZUJveC5vcGVuICgpID09IFNXVC5ZRVM7Ci0JCX0KLQl9KTsKLQlzaGVsbC5wYWNrICgpOwotCXNoZWxsLm9wZW4oKTsKLQl3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsKLQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsKLQl9Ci0JZGlzcGxheS5kaXNwb3NlICgpOwotfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvU25pcHBldExhdW5jaGVyLmphdmEgYi9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0TGF1bmNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1NjI5ZC4uMDAwMDAwMAotLS0gYS9leGFtcGxlcy9vcmcuZWNsaXBzZS5zd3Quc25pcHBldHMvc3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cy9TbmlwcGV0TGF1bmNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzOwotCi0vKgotICogU2ltcGxlICJoYWNrYWJsZSIgY29kZSB0aGF0IHJ1bnMgYWxsIG9mIHRoZSBTV1QgU25pcHBldHMsCi0gKiB0eXBpY2FsbHkgZm9yIHRlc3RpbmcuIE9uZSBleGFtcGxlIG9mIGEgdXNlZnVsICJoYWNrIiBpcwotICogdG8gYWRkIHRoZSBsaW5lOgotICogICAgaWYgKHNvdXJjZS5pbmRleE9mKCJUYWJsZSIpID09IC0xICYmIHNvdXJjZS5pbmRleE9mKCJUcmVlIikgPT0gLTEpIGNvbnRpbnVlOwotICogYWZ0ZXIgdGhlIGxpbmU6Ci0gKiAgICBTdHJpbmcgc291cmNlID0gU3RyaW5nLnZhbHVlT2YoYnVmZmVyKTsKLSAqIGluIG9yZGVyIHRvIHJ1biBhbGwgb2YgdGhlIFRhYmxlIGFuZCBUcmVlIFNuaXBwZXRzLgotICovCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotcHVibGljIGNsYXNzIFNuaXBwZXRMYXVuY2hlciB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nIFtdIGFyZ3MpIHsKLQkJRmlsZSBzb3VyY2VEaXIgPSBuZXcgRmlsZSgic3JjL29yZy9lY2xpcHNlL3N3dC9zbmlwcGV0cyIpOwotCQlib29sZWFuIGhhc1NvdXJjZSA9IHNvdXJjZURpci5leGlzdHMoKTsKLQkJaW50IGNvdW50ID0gMzAwOwotCQlpZiAoaGFzU291cmNlKSB7Ci0JCQlGaWxlIFtdIGZpbGVzID0gc291cmNlRGlyLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApIGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotCQkJaWYgKGkgPT0gMTM2IHx8IGkgPT0gMTUxIHx8IGkgPT0gMTgwIHx8IGkgPT0gMjE5KSBjb250aW51ZTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAiU25pcHBldCIgKyBpOwotCQkJQ2xhc3MgY2xhenogPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy4iICsgY2xhc3NOYW1lKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge30KLQkJCWlmIChjbGF6eiAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBjbGF6ei5nZXROYW1lKCkpOwotCQkJCWlmIChoYXNTb3VyY2UpIHsKLQkJCQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyLCBjbGFzc05hbWUgKyAiLmphdmEiKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc291cmNlRmlsZSk7Ci0JCQkJCQljaGFyIFtdIGJ1ZmZlciA9IG5ldyBjaGFyIFsoaW50KXNvdXJjZUZpbGUubGVuZ3RoKCldOwotCQkJCQkJcmVhZGVyLnJlYWQoYnVmZmVyKTsKLQkJCQkJCVN0cmluZyBzb3VyY2UgPSBTdHJpbmcudmFsdWVPZihidWZmZXIpOwotCQkJCQkJaW50IHN0YXJ0ID0gc291cmNlLmluZGV4T2YoInBhY2thZ2UiKTsKLQkJCQkJCXN0YXJ0ID0gc291cmNlLmluZGV4T2YoIi8qIiwgc3RhcnQpOwotCQkJCQkJaW50IGVuZCA9IHNvdXJjZS5pbmRleE9mKCIqIEZvciBhIGxpc3Qgb2YgYWxsIik7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc291cmNlLnN1YnN0cmluZyhzdGFydCwgZW5kLTMpKTsKLQkJCQkJCWJvb2xlYW4gc2tpcCA9IGZhbHNlOwotCQkJCQkJU3RyaW5nIHBsYXRmb3JtID0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCQkJCQlpZiAoc291cmNlLmluZGV4T2YoIlBvY2tldFBDIikgIT0gLTEpIHsKLQkJCQkJCQlwbGF0Zm9ybSA9ICJQb2NrZXRQQyI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgaWYgKHNvdXJjZS5pbmRleE9mKCJPcGVuR0wiKSAhPSAtMSkgewotCQkJCQkJCXBsYXRmb3JtID0gIk9wZW5HTCI7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBbXSBwbGF0Zm9ybXMgPSB7IndpbjMyIiwgIm1vdGlmIiwgImd0ayIsICJwaG90b24iLCAiY2FyYm9uIn07Ci0JCQkJCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwbGF0Zm9ybXMubGVuZ3RoOyBwKyspIHsKLQkJCQkJCQkJaWYgKCFwbGF0Zm9ybXNbcF0uZXF1YWxzKHBsYXRmb3JtKSAmJiBzb3VyY2UuaW5kZXhPZigiLiIgKyBwbGF0Zm9ybXNbcF0pICE9IC0xKSB7Ci0JCQkJCQkJCQlwbGF0Zm9ybSA9IHBsYXRmb3Jtc1twXTsKLQkJCQkJCQkJCXNraXAgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoc2tpcCkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLi4uc2tpcHBpbmcgIiArIHBsYXRmb3JtICsgIiBleGFtcGxlLi4uIik7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCX0KLQkJCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJCQlTdHJpbmcgW10gcGFyYW0gPSBuZXcgU3RyaW5nIFswXTsKLQkJCQlpZiAoaSA9PSA4MSkgcGFyYW0gPSBuZXcgU3RyaW5nW10geyJTaGVsbC5FeHBsb3JlciJ9OwotCQkJCXRyeSB7Ci0JCQkJCW1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHtwYXJhbS5nZXRDbGFzcygpfSk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBEaWQgbm90IGZpbmQgbWFpbihTdHJpbmcgW10pIik7Ci0JCQkJfQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbWV0aG9kLmludm9rZShjbGF6eiwgbmV3IE9iamVjdCBbXSB7cGFyYW19KTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIEZhaWxlZCB0byBsYXVuY2ggKGlsbGVnYWwgYWNjZXNzKSIpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBGYWlsZWQgdG8gbGF1bmNoIChpbGxlZ2FsIGFyZ3VtZW50IHRvIG1haW4pIik7Ci0JCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBFeGNlcHRpb24gaW4gU25pcHBldDogIiArIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvY2FuY2VsLmdpZiBiL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2NhbmNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjQ3NjYuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvY2FuY2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29yZy5lY2xpcHNlLnN3dC5zbmlwcGV0cy9zcmMvb3JnL2VjbGlwc2Uvc3d0L3NuaXBwZXRzL2VjbGlwc2UucG5nIGIvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvZWNsaXBzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTc1MjQuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvb3JnLmVjbGlwc2Uuc3d0LnNuaXBwZXRzL3NyYy9vcmcvZWNsaXBzZS9zd3Qvc25pcHBldHMvZWNsaXBzZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU1ZGI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJKVW5pdCBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRhdGEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4OGNmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5zd3QudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5ODc4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBEZWMgMTEgMTU6MTI6MTkgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQnJvd3NlclRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEJyb3dzZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUwMjcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQnJvd3NlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyBhbGwgb2YgdGhlIGdyYXBoaWNzIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxCcm93c2VyVGVzdHMgewotCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Jyb3dzZXIuc3VpdGUoKSk7CQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3Nlci5UZXN0X0Jyb3dzZXJTdWl0ZS5zdWl0ZSgpKTsKLQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQ2FyYm9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsQ2FyYm9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmYmJmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbENhcmJvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBhbGwgU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxDYXJib25UZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLS8qKgotICogVGVzdHMgbm90IHJ1biBiZWNhdXNlIHRoZXkgY29uc2lzdGVudGx5IGZhaWwKLSAqLwotc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVUZXN0cyA9IHsKLQkidGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQpIiwKLQkidGVzdF9nZXRCb3VuZHNJKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0pIiwKLQkidGVzdF9nZXRCb3VuZHMob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0pIiwKLQkidGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZyhvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfZ2V0VG9wUGl4ZWwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2dldFRvcEluZGV4KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9jbGVhclNlbGVjdGlvbihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9nZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8pIiwKLQkidGVzdF9nZXRTZWxlY3Rpb25JbmRleChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibykiLAotCSJ0ZXN0X3NldFNlbGVjdGlvbkkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyKSIsCi0JIkJyb3dzZXI0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlKSIsCi0JIkJyb3dzZXI1KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlKSIsCi0JLy8KLQkidGVzdF9jb3B5KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9jdXQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQpIiwKLQkidGVzdF9zZWxlY3RBbGwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X2NvcHkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfY3V0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X2ludm9rZUFjdGlvbkkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfcGFzdGUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JCi0JLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyAoY3V0L2NvcHkvcGFzdGUpIGZhaWwgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiBUaGV5IGRvIG5vdCBmYWlsIGxvY2FsbHkuCi0JInRlc3RfY29weShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibykiLAotCSJ0ZXN0X2N1dChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibykiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKSIsCi19OwotCi1zdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKFN0cmluZyBuYW1lKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG5hbWUuZXF1YWxzKGV4Y2x1ZGVUZXN0c1tpXSkpIHJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JaWYgKFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIFN3dFRlc3RDYXNlLnVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkV4Y2x1ZGVkIFRlc3RzOiAiICsgZXhjbHVkZVRlc3RzLmxlbmd0aCk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBmdWxsU3VpdGUgPSAoVGVzdFN1aXRlKUFsbFRlc3RzLnN1aXRlKCk7Ci0JVGVzdFN1aXRlIGZpbHRlcmVkU3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsU3VpdGUudGVzdENvdW50KCk7IGkrKykgewotCQlUZXN0IGNhbmRpZGF0ZVRlc3QgPSBmdWxsU3VpdGUudGVzdEF0KGkpOwotCQlpZiAoY2FuZGlkYXRlVGVzdCBpbnN0YW5jZW9mIFRlc3RTdWl0ZSkgewotCQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSljYW5kaWRhdGVUZXN0OwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWl0ZS50ZXN0Q291bnQoKTsgaisrKSB7Ci0JCQkJVGVzdCB0ZXN0ID0gc3VpdGUudGVzdEF0KGopOwotCQkJCWlmICghaXNFeGNsdWRlZCh0ZXN0LnRvU3RyaW5nKCkpKSBmaWx0ZXJlZFN1aXRlLmFkZFRlc3QodGVzdCk7CQkJCQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBmaWx0ZXJlZFN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHcmFwaGljc1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEdyYXBoaWNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4MzcyZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEdyYXBoaWNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciB0ZXN0aW5nIGFsbCBvZiB0aGUgZ3JhcGhpY3MgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbEdyYXBoaWNzVGVzdHMgewotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuIChzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnRNZXRyaWNzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0Muc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0Iuc3VpdGUoKSk7Ci0JCi0JCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQuc3VpdGUoKSk7Ci0KLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEd0a1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbEd0a1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYzAzZmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxHdGtUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgYWxsIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsR3RrVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0vKioKLSAqIFRlc3RzIG5vdCBydW4gYmVjYXVzZSB0aGV5IGNvbnNpc3RlbnRseSBmYWlsCi0gKi8KLXN0YXRpYyBTdHJpbmdbXSBleGNsdWRlVGVzdHMgPSB7Ci0JInRlc3RfZ2V0QWN0aXZlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSkiLAotCSJ0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSkiLAotCSJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X2dldEJvdW5kcyhvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X3NldERlZmF1bHRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUpIiwKLQkidGVzdF9zZXRBY3RpdmUob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwpIiwKLQkidGVzdF9nZXRJdGVtSGVpZ2h0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QpIiwKLQkidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QpIiwKLQkidGVzdF9zZXRUb3BJbmRleEkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCkiLAotCSJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdCkiLAotCSJ0ZXN0X2dldFRleHRMaW1pdChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfZ2V0VG9wUGl4ZWwob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3NldFRleHRMaW1pdEkob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCkiLAotCSJ0ZXN0X3NldFRvcEluZGV4SShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0KSIsCi0JInRlc3RfZ2V0SGVhZGVySGVpZ2h0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUpIiwKLQkidGVzdF9zZXRTZWxlY3Rpb25JKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcikiLAotCSJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvKSIsCi0JInRlc3RfZ2V0Um93Q291bnQob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcikiLAotCSJ0ZXN0X2dldEhlYWRlckhlaWdodChvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSkiLAotfTsKLQotc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhleGNsdWRlVGVzdHNbaV0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FeGNsdWRlZCBUZXN0czogIiArIGV4Y2x1ZGVUZXN0cy5sZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgZnVsbFN1aXRlID0gKFRlc3RTdWl0ZSlBbGxUZXN0cy5zdWl0ZSgpOwotCVRlc3RTdWl0ZSBmaWx0ZXJlZFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJVGVzdCBjYW5kaWRhdGVUZXN0ID0gZnVsbFN1aXRlLnRlc3RBdChpKTsKLQkJaWYgKGNhbmRpZGF0ZVRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpY2FuZGlkYXRlVGVzdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VpdGUudGVzdENvdW50KCk7IGorKykgewotCQkJCVRlc3QgdGVzdCA9IHN1aXRlLnRlc3RBdChqKTsKLQkJCQlpZiAoIWlzRXhjbHVkZWQodGVzdC50b1N0cmluZygpKSkgZmlsdGVyZWRTdWl0ZS5hZGRUZXN0KHRlc3QpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZmlsdGVyZWRTdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsTW90aWZUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxNb3RpZlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTE5NDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9BbGxNb3RpZlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgcnVubmluZyBhbGwgU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxNb3RpZlRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotLyoqCi0gKiBUZXN0cyBub3QgcnVuIGJlY2F1c2UgdGhleSBjb25zaXN0ZW50bHkgZmFpbAotICovCi1zdGF0aWMgU3RyaW5nW10gZXhjbHVkZVRlc3RzID0gewotCSJ0ZXN0X3NsZWVwKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkpIiwKLQkidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcihvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UpIiwKLQkidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQpIiwKLQkidGVzdF9nZXRGb250RGF0YShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCkiLAotCSJ0ZXN0X2dldEJvdW5kc0kob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKSIsCi0JInRlc3RfZ2V0Qm91bmRzSShvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSkiLAotCSJ0ZXN0X3NldE1heGltaXplZFoob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwpIiwKLQkidGVzdF9nZXRMaW5lSW5kZXgob3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LlRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0KSIsCi0JInRlc3RfZ2V0TGluZVBpeGVsKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotCSJ0ZXN0X3Bhc3RlKG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCkiLAotfTsKLQotc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChTdHJpbmcgbmFtZSkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChuYW1lLmVxdWFscyhleGNsdWRlVGVzdHNbaV0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG5FeGNsdWRlZCBUZXN0czogIiArIGV4Y2x1ZGVUZXN0cy5sZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgZnVsbFN1aXRlID0gKFRlc3RTdWl0ZSlBbGxUZXN0cy5zdWl0ZSgpOwotCVRlc3RTdWl0ZSBmaWx0ZXJlZFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJVGVzdCBjYW5kaWRhdGVUZXN0ID0gZnVsbFN1aXRlLnRlc3RBdChpKTsKLQkJaWYgKGNhbmRpZGF0ZVRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpIHsKLQkJCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpY2FuZGlkYXRlVGVzdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3VpdGUudGVzdENvdW50KCk7IGorKykgewotCQkJCVRlc3QgdGVzdCA9IHN1aXRlLnRlc3RBdChqKTsKLQkJCQlpZiAoIWlzRXhjbHVkZWQodGVzdC50b1N0cmluZygpKSkgZmlsdGVyZWRTdWl0ZS5hZGRUZXN0KHRlc3QpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gZmlsdGVyZWRTdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1MjhkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHJ1bm5pbmcgYWxsIFNXVCB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JU3d0VGVzdENhc2UudW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCWlmIChTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyBTd3RUZXN0Q2FzZS51bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JfQotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgQWxsVGVzdHMoKTsKLX0KLQotcHVibGljIEFsbFRlc3RzKCkgewotCXN1cGVyKCk7Ci0JLyogVGhlIGxvZ2ljYWwgb3JkZXIgdG8gcnVuIHRoZSB0ZXN0cyBpbiBpczoKLQkgKiAtIFNXVCwgU1dURXJyb3IsIFNXVEV4Y2VwdGlvbgotCSAqIC0gRGlzcGxheQotCSAqIC0gZ3JhcGhpY3MgY2xhc3NlcwotCSAqIC0gaXRlbXMgYW5kIENhcmV0LCBldGMKLQkgKiAtIHdpZGdldHMKLQkgKiAtIGRpYWxvZ3MKLQkgKiAtIGxheW91dAotCSAqIC0gY3VzdG9tIHdpZGdldHMKLQkgKiAtIHByaW50aW5nIGFuZCBwcm9ncmFtCi0JICogLSBldmVudHMKLQkgKiAtIGRyYWcgJiBkcm9wCi0JICogLSBhY2Nlc3NpYmlsaXR5Ci0JICogLSBPTEUKLQkgKiAtIGJyb3dzZXIKLQkgKi8KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLnN1aXRlKCkpOwotCi0JLyogTk9URTogSWYgdGhlIERpc3BsYXkgdGVzdCBzdWl0ZSBpcyBydW4sIGl0IG11c3QgYmUgcnVuCi0JICogYmVmb3JlIGFueSBvdGhlciB0ZXN0cyB0aGF0IG5lZWQgYSBkaXNwbGF5IChpLmUuIGdyYXBoaWNzCi0JICogb3Igd2lkZ2V0IHRlc3RzLCBldGMpLiBPdGhlcndpc2UsIGFuIEludmFsaWRUaHJlYWRBY2Nlc3MKLQkgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gZm9yIGVhY2ggRGlzcGxheSB0ZXN0LgotCSAqLwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5LnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0Muc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250TWV0cmljcy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5zdWl0ZSgpKTsKLQkvL2FkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuc3VpdGUoKSk7Ci0JCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLnN1aXRlKCkpOwotCS8vYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsuc3VpdGUoKSk7Ci0JLy9hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0dyaWREYXRhLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0xheW91dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0LnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2Uuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdGFja0xheW91dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3Iuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NULnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudC5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50LnN1aXRlKCkpOwotCQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnREaWFsb2cuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5zdWl0ZSgpKTsKLQotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyLnN1aXRlKCkpOwotLy8JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2Zlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudC5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2Uuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuc3VpdGUoKSk7Ci0vLwlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2Zlci5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0NsaXBib2FyZC5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudC5zdWl0ZSgpKTsKLS8vCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQuc3VpdGUoKSk7Ci0KLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50LnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5zdWl0ZSgpKTsKLQotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRS5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbi5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50LnN1aXRlKCkpOwotCi0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Jyb3dzZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyLnN1aXRlKCkpOwotCWFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuc3VpdGUoKSk7Ci0JYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5zdWl0ZSgpKTsKLQlhZGRUZXN0KG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyLlRlc3RfQnJvd3NlclN1aXRlLnN1aXRlKCkpOwotCi0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsV2lkZ2V0VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvQWxsV2lkZ2V0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmMDg5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0FsbFdpZGdldFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogU3VpdGUgZm9yIHRlc3RpbmcgYWxsIG9mIHRoZSB3aWRnZXQgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFdpZGdldFRlc3RzIHsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1biAoc3VpdGUoKSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbS5zdWl0ZSgpKTsKLQkvL3N1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbi5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5zdWl0ZSgpKTsKLQkvL3N1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuc3VpdGUoKSk7Ci0JCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsLnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21iby5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TbGlkZXIuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Byb2dyZXNzQmFyLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUuc3VpdGUoKSk7Ci0JLy9zdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5zdWl0ZSgpKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZXNzYWdlQm94LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLnN1aXRlKCkpOwotCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9BbmltYXRlZFByb2dyZXNzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2Uuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdGFja0xheW91dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DQ29tYm8uc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyQWRhcHRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3Iuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NULnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuc3VpdGUoKSk7Ci0KLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Db25zaXN0ZW5jeVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMWYyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0NvbnNpc3RlbmN5VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENvbnNpc3RlbmN5VXRpbGl0eSB7Ci0KLSAgICBzdGF0aWMgSGFzaE1hcCBldmVudE9yZGVyaW5nID0gbmV3IEhhc2hNYXAoKTsKLSAgICBzdGF0aWMgSGFzaE1hcCBldmVudFR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBzdGF0aWMgewotICAgICAgICAKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkRvdWJsZUNsaWNrIiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIsICJNb3VzZURvd24iLCAiTW91c2VEb3VibGVDbGljayIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJEcmFnRGV0ZWN0IiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIkRyYWdEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkVudGVyU2VsZWN0aW9uIiwgCQluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpSZXR1cm4iLCAiS2V5RG93biIsICJEZWZhdWx0U2VsZWN0aW9uIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiS2V5U2VsZWN0aW9uIiwgCQkJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJLZXlEb3duIiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJNZW51RGV0ZWN0IiwgCQkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1lbnVEZXRlY3QiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJCdXR0b25Nb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29tYm9Nb3VzZVNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlZlcmlmeSIsICJNb2RpZnkiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNDb21ib01vdXNlU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW9kaWZ5IiwgIlNlbGVjdGlvbjoifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJFeHBhbmRCYXJNb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkxpc3RNb3VzZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2FzaE1vdXNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjpEcmFnIiwgIk1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJGb2xkZXJNb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZU1vdXNlU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUb29sQmFyTW91c2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVNb3VzZVNlbGVjdGlvbiIsCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZU1vdXNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJNb3VzZVVwIiB9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNUYWJGb2xkZXJNb3VzZVNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJNb3VzZURvd24iLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiTGlzdERvdWJsZUNsaWNrIiwgCQluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiTW91c2VVcCIsICJTZWxlY3Rpb246IiwgIk1vdXNlRG93biIsICJNb3VzZURvdWJsZUNsaWNrIiwgIkRlZmF1bHRTZWxlY3Rpb24iLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkJ1dHRvbkVudGVyU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiRXhwYW5kQmFyRW50ZXJTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDQ29tYm9FbnRlclNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJUcmF2ZXJzZTpSZXR1cm4iLCAiRGVmYXVsdFNlbGVjdGlvbiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVG9vbEJhckVudGVyU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOlJldHVybiIsICJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlRHJhZ0RldGVjdCIsIAkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiRHJhZ0RldGVjdCIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlRHJhZ0RldGVjdCIsIAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOiIsICJEcmFnRGV0ZWN0IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZU1lbnVEZXRlY3QiLCAJCW5ldyBTdHJpbmdbXSB7Ik1lbnVEZXRlY3QiLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZU1lbnVEZXRlY3QiLAluZXcgU3RyaW5nW10geyJNZW51RGV0ZWN0IiwgIk1vdXNlRG93biIsICJTZWxlY3Rpb246IiwgIk1vdXNlVXAifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQnV0dG9uU3BhY2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6TW5lbW9uaWMiLCAiS2V5RG93biIsICJLZXlVcCIsICJTZWxlY3Rpb246In0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiRXhwYW5kQmFyU3BhY2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJNb3VzZVVwIiwgIlNlbGVjdGlvbjoiLCAiVHJhdmVyc2U6TW5lbW9uaWMiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkxpc3RTcGFjZVNlbGVjdGlvbiIsIAluZXcgU3RyaW5nW10geyJTZWxlY3Rpb246IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUb29sQmFyU3BhY2VTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiU2VsZWN0aW9uOiIsICJUcmF2ZXJzZTpNbmVtb25pYyIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVHJlZVNwYWNlU2VsZWN0aW9uIiwgCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiS2V5RG93biIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYmxlVHJlZVNwYWNlU2VsZWN0aW9uIixuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIktleVVwIn0pOyAKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDb21ib0tleVNlbGVjdGlvbiIsIAkJbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJWZXJpZnkiLCAiTW9kaWZ5IiwgIlNlbGVjdGlvbjoiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDQ29tYm9LZXlTZWxlY3Rpb24iLCAJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJNb2RpZnkiLCAiU2VsZWN0aW9uOiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ1RhYkZvbGRlcktleVNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiU2VsZWN0aW9uOiIsICJLZXlEb3duIiwgIktleVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2xpZGVyS2V5U2VsZWN0aW9uIiwJCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiS2V5RG93biIsICJTZWxlY3Rpb246QXJyb3cgRG93biIsICJLZXlVcCIgfSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2xpZGVyQXJyb3dTZWxlY3Rpb24iLAluZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiU2VsZWN0aW9uOkFycm93IERvd24iLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiQ29vbEJhckNoZXZyb25EcmFnRGV0ZWN0IixuZXcgU3RyaW5nW10geyJNb3VzZURvd24iLCAiRHJhZ0RldGVjdCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNvb2xCYXJDaGV2cm9uTWVudURldGVjdCIsbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpBcnJvdyJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNvb2xCYXJDaGV2cm9uTW91c2VTZWxlY3Rpb24iLG5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246QXJyb3ciLCB9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTY2FsZVRyb3VnaFNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7IlNlbGVjdGlvbjoiLCAiTW91c2VEb3duIiwgIk1vdXNlVXAiIH0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2xpZGVyVHJvdWdoU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIlNlbGVjdGlvbjpQYWdlIERvd24iLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTY2FsZVRodW1iU2VsZWN0aW9uIiwJbmV3IFN0cmluZ1tdIHsiU2VsZWN0aW9uOiIsICJNb3VzZURvd24iLCAiTW91c2VVcCIgfSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTbGlkZXJUaHVtYlNlbGVjdGlvbiIsCW5ldyBTdHJpbmdbXSB7Ik1vdXNlRG93biIsICJTZWxlY3Rpb246RHJhZyIsICJNb3VzZVVwIiB9KTsKLQotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU2hlbGxDbG9zZSIsCQkJCW5ldyBTdHJpbmdbXSB7IkNsb3NlIiwgIkRpc3Bvc2UifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTaGVsbERpc3Bvc2UiLAkJCW5ldyBTdHJpbmdbXSB7IkRpc3Bvc2UifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJTaGVsbEljb25pZnkiLAkJCW5ldyBTdHJpbmdbXSB7IkZvY3VzT3V0IiwgIkljb25pZnkiLCAiRGVhY3RpdmF0ZSIsICJEZWljb25pZnkiLCAiQWN0aXZhdGUiLCAiRm9jdXNJbiIsICJBY3RpdmF0ZSJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlNoZWxsT3BlbiIsCQkJCW5ldyBTdHJpbmdbXSB7IkFjdGl2YXRlIiwgIkZvY3VzSW4iLCAiU2hvdyJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJGb2xkZXJQZ2R3blNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJUcmF2ZXJzZTpQYWdlIE5leHQiLCAiU2VsZWN0aW9uOiIsICJLZXlVcCIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRhYkZvbGRlclBndXBTZWxlY3Rpb24iLCBuZXcgU3RyaW5nW10geyJLZXlEb3duIiwgIlRyYXZlcnNlOlBhZ2UgUHJldmlvdXMiLCAiU2VsZWN0aW9uOiIsICJLZXlVcCIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIkNUYWJGb2xkZXJQZ2R3blNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJTZWxlY3Rpb246IiwgIlRyYXZlcnNlOk5vbmUiLCAiS2V5VXAiLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJDVGFiRm9sZGVyUGd1cFNlbGVjdGlvbiIsbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJTZWxlY3Rpb246IiwgIlRyYXZlcnNlOk5vbmUiLCAiS2V5VXAiLCAiS2V5VXAifSk7Ci0gICAgICAgIAotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiU3R5bGVkVGV4dE1vZGlmeSIsCQluZXcgU3RyaW5nW10geyJWZXJpZnkiLCAiTW9kaWZ5IiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUZXh0TW9kaWZ5IiwJCQkJbmV3IFN0cmluZ1tdIHsiS2V5RG93biIsICJWZXJpZnkiLCAiTW9kaWZ5IiwgIktleVVwIn0pOwkJCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUcmVlS2V5RXhwYW5kIiwgCQkJbmV3IFN0cmluZ1tdIHsiVHJhdmVyc2U6QXJyb3cgTmV4dCIsICJLZXlEb3duIiwgIkV4cGFuZCIsICJLZXlVcCJ9KTsKLSAgICAgICAgZXZlbnRPcmRlcmluZy5wdXQoIlRyZWVNb3VzZUV4cGFuZCIsIAkJbmV3IFN0cmluZ1tdIHsiRXhwYW5kIiwgIk1vdXNlRG93biIsICJNb3VzZVVwIn0pOwotICAgICAgICBldmVudE9yZGVyaW5nLnB1dCgiVGFibGVUcmVlS2V5RXhwYW5kIiwgCW5ldyBTdHJpbmdbXSB7IlRyYXZlcnNlOkFycm93IE5leHQiLCAiRXhwYW5kIiwgIktleURvd24iLCAiS2V5VXAifSk7Ci0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVNb3VzZUV4cGFuZCIsIAluZXcgU3RyaW5nW10geyJFeHBhbmQiLCAiTW91c2VEb3duIiwgIlNlbGVjdGlvbjoiLCAiTW91c2VVcCJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50T3JkZXJpbmcucHV0KCJUYWJsZVRyZWVUYWJsZSIsIAkJbmV3IFN0cmluZ1tdIHsiTW91c2VEb3duIiwgIk1vdXNlVXAiLCAiTW91c2VEb3VibGVDbGljayIsICJLZXlEb3duIiwgIktleVVwIiwgIk1lbnVEZXRlY3QiLCAiRHJhZ0RldGVjdCIsICJUcmF2ZXJzZSJ9KTsKLSAgICAgICAgCi0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJOb25lIiwgbmV3IEludGVnZXIoU1dULk5vbmUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIktleURvd24iLCBuZXcgSW50ZWdlcihTV1QuS2V5RG93bikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiS2V5VXAiLCBuZXcgSW50ZWdlcihTV1QuS2V5VXApKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlRG93biIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZURvd24pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vdXNlVXAiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VVcCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VNb3ZlIiwgbmV3IEludGVnZXIoU1dULk1vdXNlTW92ZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VFbnRlciIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUVudGVyKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZUV4aXQiLCBuZXcgSW50ZWdlcihTV1QuTW91c2VFeGl0KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3VzZURvdWJsZUNsaWNrIiwgbmV3IEludGVnZXIoU1dULk1vdXNlRG91YmxlQ2xpY2spKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlBhaW50IiwgbmV3IEludGVnZXIoU1dULlBhaW50KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJNb3ZlIiwgbmV3IEludGVnZXIoU1dULk1vdmUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlJlc2l6ZSIsIG5ldyBJbnRlZ2VyKFNXVC5SZXNpemUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkRpc3Bvc2UiLCBuZXcgSW50ZWdlcihTV1QuRGlzcG9zZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiU2VsZWN0aW9uIiwgbmV3IEludGVnZXIoU1dULlNlbGVjdGlvbikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRGVmYXVsdFNlbGVjdGlvbiIsIG5ldyBJbnRlZ2VyKFNXVC5EZWZhdWx0U2VsZWN0aW9uKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJGb2N1c0luIiwgbmV3IEludGVnZXIoU1dULkZvY3VzSW4pKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkZvY3VzT3V0IiwgbmV3IEludGVnZXIoU1dULkZvY3VzT3V0KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJFeHBhbmQiLCBuZXcgSW50ZWdlcihTV1QuRXhwYW5kKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJDb2xsYXBzZSIsIG5ldyBJbnRlZ2VyKFNXVC5Db2xsYXBzZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSWNvbmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5JY29uaWZ5KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEZWljb25pZnkiLCBuZXcgSW50ZWdlcihTV1QuRGVpY29uaWZ5KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJDbG9zZSIsIG5ldyBJbnRlZ2VyKFNXVC5DbG9zZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiU2hvdyIsIG5ldyBJbnRlZ2VyKFNXVC5TaG93KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJIaWRlIiwgbmV3IEludGVnZXIoU1dULkhpZGUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIk1vZGlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5Nb2RpZnkpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIlZlcmlmeSIsIG5ldyBJbnRlZ2VyKFNXVC5WZXJpZnkpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkFjdGl2YXRlIiwgbmV3IEludGVnZXIoU1dULkFjdGl2YXRlKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJEZWFjdGl2YXRlIiwgbmV3IEludGVnZXIoU1dULkRlYWN0aXZhdGUpKTsKLSAgICAgICAgZXZlbnRUeXBlcy5wdXQoIkhlbHAiLCBuZXcgSW50ZWdlcihTV1QuSGVscCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiRHJhZ0RldGVjdCIsIG5ldyBJbnRlZ2VyKFNXVC5EcmFnRGV0ZWN0KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJBcm0iLCBuZXcgSW50ZWdlcihTV1QuQXJtKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJUcmF2ZXJzZSIsIG5ldyBJbnRlZ2VyKFNXVC5UcmF2ZXJzZSkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTW91c2VIb3ZlciIsIG5ldyBJbnRlZ2VyKFNXVC5Nb3VzZUhvdmVyKSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJIYXJkS2V5RG93biIsIG5ldyBJbnRlZ2VyKFNXVC5IYXJkS2V5RG93bikpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiSGFyZEtleVVwIiwgbmV3IEludGVnZXIoU1dULkhhcmRLZXlVcCkpOwotICAgICAgICBldmVudFR5cGVzLnB1dCgiTWVudURldGVjdCIsIG5ldyBJbnRlZ2VyKFNXVC5NZW51RGV0ZWN0KSk7Ci0gICAgICAgIGV2ZW50VHlwZXMucHV0KCJTZXREYXRhIiwgbmV3IEludGVnZXIoU1dULlNldERhdGEpKTsKLSAgICB9Ci0gCi0gICAgc3RhdGljIFN0cmluZ1tdIGV2ZW50TmFtZXMgPSB7Ci0JCSJOb25lIiwgCQkJIktleURvd24iLCAJCSJLZXlVcCIsIAkJCSJNb3VzZURvd24iLCAKLQkJIk1vdXNlVXAiLAkJCSJNb3VzZU1vdmUiLAkiTW91c2VFbnRlciIsCQkiTW91c2VFeGl0IiwKLQkJIk1vdXNlRG91YmxlQ2xpY2siLAkiUGFpbnQiLAkJIk1vdmUiLAkJCQkiUmVzaXplIiwKLQkJIkRpc3Bvc2UiLAkJCSJTZWxlY3Rpb24iLAkiRGVmYXVsdFNlbGVjdGlvbiIsCSJGb2N1c0luIiwKLQkJIkZvY3VzT3V0IiwJCQkiRXhwYW5kIiwJCSJDb2xsYXBzZSIsCQkJIkljb25pZnkiLAotCQkiRGVpY29uaWZ5IiwJCSJDbG9zZSIsCQkiU2hvdyIsCQkJCSJIaWRlIiwKLQkJIk1vZGlmeSIsCQkJIlZlcmlmeSIsCQkiQWN0aXZhdGUiLAkJCSJEZWFjdGl2YXRlIiwKLQkJIkhlbHAiLAkJCQkiRHJhZ0RldGVjdCIsCSJBcm0iLAkJCQkiVHJhdmVyc2UiLAotCQkiTW91c2VIb3ZlciIsCQkiSGFyZEtleURvd24iLAkiSGFyZEtleVVwIiwJCSJNZW51RGV0ZWN0IiwKLQkJIlNldERhdGEifTsKLSAgICAKLSAgICBzdGF0aWMgaW50W10gY29udmVydEV2ZW50TmFtZXMoU3RyaW5nW10gb3JpZ05hbWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tvcmlnTmFtZXMubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnTmFtZXMsIDAsIG5hbWVzLCAwLCBvcmlnTmFtZXMubGVuZ3RoKTsKLSAgICAgICAgbmFtZXMgPSByZW1vdmVEdXBsaWNhdGVzKG5hbWVzKTsKLSAgICAgICAgaW50W10gdHlwZXMgPSBuZXcgaW50W25hbWVzLmxlbmd0aF07Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0eXBlc1tpXSA9ICgoSW50ZWdlcilldmVudFR5cGVzLmdldChuYW1lc1tpXSkpLmludFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVzOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSByZW1vdmVEdXBsaWNhdGVzKFN0cmluZ1tdIG5hbWVzKSB7Ci0gICAgICAgIGludCBkdXBzPTA7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lc1tpXS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZihpbmRleCAhPSAtMSkKLSAgICAgICAgICAgICAgICBuYW1lc1tpXSA9IG5hbWVzW2ldLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICBmb3IoaW50IGo9MDsgajxpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZihuYW1lc1tpXS5lcXVhbHMobmFtZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaz1pKzE7IGs8bmFtZXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzW2stMV0gPSBuYW1lc1trXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc1tuYW1lcy5sZW5ndGgtMV0gPSAiZHVwbGljYXRlIisgZHVwczsKLSAgICAgICAgICAgICAgICAgICAgZHVwcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSB0ZW1wID0gbmV3IFN0cmluZ1tuYW1lcy5sZW5ndGgtZHVwc107Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmFtZXMsIDAsIHRlbXAsIDAsIG5hbWVzLmxlbmd0aC1kdXBzKTsKLSAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc2VsZWN0aW9uVHlwZXMgPSB7Ci0gICAgICAgICJEcmFnIiwgCQkiSG9tZSIsICAJCQkiRW5kIiwgCQkJCSJBcnJvdyBEb3duIiwgCi0gICAgICAgICJBcnJvdyBVcCIsIAkiUGFnZSBEb3duIiwgCQkiUGFnZSBVcCIsIAkJCSJDaGVjayIsIAkKLSAgICAgICAgIkFycm93IiwgICAgIAotICAgIH07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnRbXSBbXSBzZWxlY3Rpb25Db252ZXJzaW9uID0gewotICAgICAgICB7U1dULkRSQUcsIDB9LAotICAgICAgICB7U1dULkhPTUUsIDF9LAotICAgICAgICB7U1dULkVORCwgMn0sCi0gICAgICAgIHtTV1QuQVJST1dfRE9XTiwgM30sCi0gICAgICAgIHtTV1QuQVJST1dfVVAsIDR9LAotICAgICAgICB7U1dULlBBR0VfRE9XTiwgNX0sCi0gICAgICAgIHtTV1QuUEFHRV9VUCwgNn0sCi0gICAgICAgIHtTV1QuQ0hFQ0ssIDd9LAotICAgICAgICB7U1dULkFSUk9XLCA4fSwKLSAgICB9OwotICAgIAotICAgIHN0YXRpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uVHlwZShpbnQgdHlwZSkgewotICAgICAgICBmb3IoaW50IGk9MDsgaTxzZWxlY3Rpb25Db252ZXJzaW9uLmxlbmd0aDtpKyspIHsKLSAgICAgICAgICAgIGlmKHR5cGUgPT0gc2VsZWN0aW9uQ29udmVyc2lvbltpXVswXSkgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvblR5cGVzW3NlbGVjdGlvbkNvbnZlcnNpb25baV1bMV1dOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZ1tdIHRyYXZlcnNhbFR5cGVzID0gewotICAgIAkgICAgIk5vbmUiLCAJCSJFc2NhcGUiLCAJCQkiUmV0dXJuIiwgCQkJIlRhYiBQcmV2aW91cyIsIAotICAgIAkgICAgIlRhYiBOZXh0IiwgCSJBcnJvdyBQcmV2aW91cyIsCSJBcnJvdyBOZXh0IiwgCQkiTW5lbW9uaWMiLCAKLSAgICAJICAgICJQYWdlIFByZXZpb3VzIiwgIlBhZ2UgTmV4dCJ9OwotCi0gICAgc3RhdGljIFN0cmluZyBnZXRUcmF2ZXJzYWxUeXBlKGludCB0eXBlKSB7Ci0gICAgICAgIGludCBwb3cgPSAwOwotICAgICAgICBpZih0eXBlICE9IDApCi0gICAgICAgICAgICBwb3cgPShpbnQpKE1hdGgubG9nKHR5cGUpL01hdGgubG9nKDIpKTsKLSAgICAgICAgcmV0dXJuIHRyYXZlcnNhbFR5cGVzW3Bvd107Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNIRUxMX0lDT05JRlkgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgS0VZX1BSRVNTID0gMTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBET1VCTEVfS0VZX1BSRVNTID0gMjA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1VTRV9DTElDSyA9IDMwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9VU0VfRE9VQkxFQ0xJQ0sgPSA0MDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVVNFX0RSQUcgPSA1MDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDYwOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVNDQVBFX01FTlUgPSAxOwotICAgIAotICAgIAotICAgIC8vcG9zdHMgYSBjbGljayBhdCBkaXNwbGF5IG1hcHBlZCB4IGFuZCB5IHdpdGggYnV0dG9uIGJ1dHRvbgotICAgIHN0YXRpYyBib29sZWFuIHBvc3RDbGljayhEaXNwbGF5IGRpc3BsYXksIGludCB4LCBpbnQgeSwgaW50IGJ1dHRvbikgewotICAgICAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlTW92ZTsKLSAgICAgICAgZXZlbnQueCA9IHg7Ci0gICAgICAgIGV2ZW50LnkgPSB5OwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VNb3ZlIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvd247Ci0gICAgICAgIGV2ZW50LmJ1dHRvbiA9IGJ1dHRvbjsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VEb3duIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0gICAgICAgIGV2ZW50LmJ1dHRvbiA9IGJ1dHRvbjsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VVcCBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICAvL1RPRE86IHBvdGVudGlhbGx5IGRhbmdlcm91cyB0byBoYXZlIGEgbW91c2Vkb3duIGFuZCBubyBtb3VzZXVwCi0gICAgICAgICAgICAvL2ZvcmNlIHRoZSBpc3N1ZT8KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotLy8JICAJdHJ5IHsKLS8vCSAgICAgICAgVGhyZWFkLnNsZWVwKDE2MDApOwkKLS8vCSAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdENsaWNrKERpc3BsYXkgZGlzcGxheSwgUG9pbnQgcHQsIGludCBidXR0b24pIHsKLSAgICAgICAgcmV0dXJuIHBvc3RDbGljayhkaXNwbGF5LCBwdC54LCBwdC55LCBidXR0b24pOwotICAgIH0KLSAgICAKLSAgICAvL2RvdWJsZWNsaWNrcyBhdCBkaXNwbGF5IG1hcHBlZCBwdCB3aXRoIGJ1dHRvbiBidXR0b24KLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0RG91YmxlQ2xpY2soRGlzcGxheSBkaXNwbGF5LCBQb2ludCBwdCwgaW50IGJ1dHRvbikgewotICAgICAgICBib29sZWFuIHJldCA9IHBvc3RDbGljayhkaXNwbGF5LCBwdCwgYnV0dG9uKTsKLSAgICAgICAgcmV0ICY9IHBvc3RDbGljayhkaXNwbGF5LCBwdCwgYnV0dG9uKTsKLS8vCSAgCXRyeSB7Ci0vLwkgICAgICAgIFRocmVhZC5zbGVlcCgxNjAwKTsJCi0vLwkgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkge30KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgCi0gICAgLy9wb3N0IGEga2V5IHByZXNzIAotICAgIHN0YXRpYyBib29sZWFuIHBvc3RLZXlQcmVzcyhEaXNwbGF5IGRpc3BsYXksIGludCBjaCwgaW50IGtleWNvZGUpIHsKLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotICAgICAgICBldmVudC5jaGFyYWN0ZXIgPSAoY2hhciljaDsKLSAgICAgICAgZXZlbnQua2V5Q29kZSA9IGtleWNvZGU7Ci0gICAgICAgIGlmKCFkaXNwbGF5LnBvc3QoZXZlbnQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleURvd24gbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0gICAgICAgIGV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0gICAgICAgIGV2ZW50LmNoYXJhY3RlciA9IChjaGFyKWNoOwotICAgICAgICBldmVudC5rZXlDb2RlID0ga2V5Y29kZTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5VXAgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgLy9UT0RPOiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdG8gaGF2ZSBhIGtleWRvd24gYW5kIG5vIGtleXVwCi0gICAgICAgICAgICAvL2ZvcmNlIHRoZSBpc3N1ZT8KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLy9wb3N0IHByZXNzaW5nIGFuZCBob2xkaW5nIGNoMS9rZXljb2RlMSBhbmQgdGhlbiBwcmVzc2luZyBjaDIva2V5Y29kZTIKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0RG91YmxlS2V5UHJlc3MoRGlzcGxheSBkaXNwbGF5LCBpbnQgY2gxLCBpbnQga2V5Y29kZTEsIAotICAgICAgICAgICAgCQkJCQkJICBpbnQgY2gyLCBpbnQga2V5Y29kZTIpIHsKLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotICAgICAgICBldmVudC5jaGFyYWN0ZXIgPSAoY2hhciljaDE7Ci0gICAgICAgIGV2ZW50LmtleUNvZGUgPSBrZXljb2RlMTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5RG93biBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zdEtleVByZXNzKGRpc3BsYXksIGNoMiwga2V5Y29kZTIpOwotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULktleVVwOwotICAgICAgICBldmVudC5jaGFyYWN0ZXIgPSAoY2hhciljaDE7Ci0gICAgICAgIGV2ZW50LmtleUNvZGUgPSBrZXljb2RlMTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5VXAgbm90IHBvc3RlZCIpOwotICAgICAgICAgICAgLy9UT0RPOiBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdG8gaGF2ZSBhIGtleWRvd24gYW5kIG5vIGtleXVwCi0gICAgICAgICAgICAvL2ZvcmNlIHRoZSBpc3N1ZT8KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLy9wb3N0cyBhIGRyYWcgZnJvbSBkaXNwbGF5IG1hcHBlZCBvcmlnaW4gdG8gZGVzdGluYXRpb24KLSAgICAvL3RoZSBidXR0b24gdG8gZHJhZyB3aXRoIGlzIHN5c3RlbSBkZXBlbmRlbnQKLSAgICBzdGF0aWMgYm9vbGVhbiBwb3N0RHJhZyhEaXNwbGF5IGRpc3BsYXksIFBvaW50IG9yaWdpbiwgUG9pbnQgZGVzdGluYXRpb24pIHsKLSAgICAgICAgaW50IGJ1dHRvbiA9IGRldGVybWluZURyYWcoKTsKLSAgICAgICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0gICAgICAgIGV2ZW50LnggPSBvcmlnaW4ueDsKLSAgICAgICAgZXZlbnQueSA9IG9yaWdpbi55OwotICAgICAgICBpZighZGlzcGxheS5wb3N0KGV2ZW50KSkgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VNb3ZlIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZURvd247Ci0gICAgICAgIGV2ZW50LmJ1dHRvbiA9IGJ1dHRvbjsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VEb3duIG5vdCBwb3N0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgZXZlbnQudHlwZSA9IFNXVC5Nb3VzZU1vdmU7Ci0gICAgICAgIGV2ZW50LnggPSBkZXN0aW5hdGlvbi54OwotICAgICAgICBldmVudC55ID0gZGVzdGluYXRpb24ueTsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1vdXNlTW92ZSBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBldmVudCA9IG5ldyBFdmVudCgpOwotICAgICAgICBldmVudC50eXBlID0gU1dULk1vdXNlVXA7Ci0gICAgICAgIGV2ZW50LmJ1dHRvbiA9IGJ1dHRvbjsKLSAgICAgICAgaWYoIWRpc3BsYXkucG9zdChldmVudCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTW91c2VVcCBub3QgcG9zdGVkIik7Ci0gICAgICAgICAgICAvL1RPRE86IHBvdGVudGlhbGx5IGRhbmdlcm91cyB0byBoYXZlIGEgbW91c2Vkb3duIGFuZCBubyBtb3VzZXVwCi0gICAgICAgICAgICAvL2ZvcmNlIHRoZSBpc3N1ZT8KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvL2RldGVybWluZXMgd2hpY2ggYnV0dG9uIHRvIGRyYWcgd2l0aAotICAgIHByaXZhdGUgc3RhdGljIGludCBkZXRlcm1pbmVEcmFnKCkgewotICAgICAgICBpZihTd3RKdW5pdC5pc1dpbmRvd3MgfHwgU3d0SnVuaXQuaXNDYXJib24gfHwgU3d0SnVuaXQuaXNHVEspCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIAotICAgIC8vcG9zdHMgYSBzZWxlY3Rpb24gaWUgY2xpY2tzIG9uIHB0MSwgdGhlbiBjbGljayBvbiBwdDIgKGZvciBleGFtcGxlLCBzZWxlY3RpbmcKLSAgICAvL29uZSBvZiB0aGUgb3B0aW9ucyBpbiBhIGNvbWJvIGJ5IGRyb3BwaW5nIGRvd24gdGhlIGxpc3QpCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdFNlbGVjdGlvbihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIFBvaW50IHB0MSwgUG9pbnQgcHQyKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gcG9zdENsaWNrKGRpc3BsYXksIHB0MSwgMSk7Ci0gICAgICAgIGRpc3BsYXkuc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LnVwZGF0ZSgpOwotICAgICAgICB9fSk7Ci0gICAgICAgIHJldCAmPSBwb3N0Q2xpY2soZGlzcGxheSwgcHQyLCAxKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvL2ljb25pZmllcyB0aGUgc2hlbGwuIHB0IGlzIGEgc3lzdGVtIGRlcGVuZGVudCBwb2ludCBvbiB0aGUgc2hlbGwuCi0gICAgc3RhdGljIGJvb2xlYW4gcG9zdFNoZWxsSWNvbmlmeShEaXNwbGF5IGRpc3BsYXksIFBvaW50IHB0LCBpbnQgYnV0dG9uKSB7Ci0gICAgICAgIGludCB4ID0gcHQueDsKLSAgICAgICAgaW50IHkgPSBwdC55IC0gMTA7Ci0gICAgICAgIGlmKFN3dEp1bml0LmlzV2luZG93cykgewotICAgICAgICAgICAgeCArPSAtMzU7Ci0gICAgICAgIH0gZWxzZSBpZihTd3RKdW5pdC5pc0xpbnV4KSB7Ci0gICAgICAgIAl4ICs9IC0xNjsKLSAgICAgICAgfSBlbHNlIGlmIChTd3RKdW5pdC5pc0NhcmJvbikgewotICAgICAgICAJeCArPSAzMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9zdENsaWNrKGRpc3BsYXksIHgsIHksIGJ1dHRvbik7ICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvRW11bGF0ZWRXaWRnZXRzVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvRW11bGF0ZWRXaWRnZXRzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiZjMyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L0VtdWxhdGVkV2lkZ2V0c1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBTdWl0ZSBmb3IgdGVzdGluZyB3aWRnZXRzIHRoYXQgaGF2ZSBiZWVuIGVtdWxhdGVkIG9uIE1vdGlmLgotICovCi1wdWJsaWMgY2xhc3MgRW11bGF0ZWRXaWRnZXRzVGVzdHMgewotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4gKHN1aXRlKCkpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5zdWl0ZSgpKTsJCi0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlci5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uc3VpdGUoKSk7CQotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5zdWl0ZSgpKTsKLQkJCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9TdHlsZWRUZXh0Q29udGVudFNwZWMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3R5bGVkVGV4dENvbnRlbnRTcGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDIxZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9TdHlsZWRUZXh0Q29udGVudFNwZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi0vKioKLSAqIFVzZSB0aGlzIHRlc3QgY2xhc3MgdG8gdmFsaWRhdGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFN0eWxlZFRleHRDb250ZW50Ci0gKiBpbnRlcmZhY2UuICBUbyBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uLCBjb3B5IHRoaXMgY2xhc3MgdG8gdGhlIHBhY2thZ2Ugd2hlcmUgCi0gKiB5b3VyIFN0eWxlZFRleHRDb250ZW50IGltcGxlbWVudGF0aW9uIGxpdmVzLiAgVGhlbiBzcGVjaWZ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLSAqIG5hbWUgb2YgeW91ciBTdHlsZWRUZXh0Q29udGVudCBjbGFzcyBhcyBhbiBhcmd1bWVudCB0byB0aGUgbWFpbiBtZXRob2Qgb2YgdGhpcyAKLSAqIGNsYXNzLiAKLSAqIAotICogTk9URTogIFRoaXMgdGVzdCBjbGFzcyBhc3N1bWVzIHRoYXQgeW91ciBTdHlsZWRUZXh0Q29udGVudCBpbXBsZW1lbnRhdGlvbiAKLSAqIGhhbmRsZXMgdGhlIGZvbGxvd2luZyBkZWxpbWl0ZXJzOgotICogCi0gKiAJCS9yCi0gKiAJCS9uCi0gKiAJCS9yL24KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotcHVibGljIGNsYXNzIFN0eWxlZFRleHRDb250ZW50U3BlYyBpbXBsZW1lbnRzIFRleHRDaGFuZ2VMaXN0ZW5lciB7Ci0Jc3RhdGljIFN0cmluZyBjb250ZW50Q2xhc3NOYW1lOwotCXN0YXRpYyBpbnQgZmFpbENvdW50ID0gMDsKLQlzdGF0aWMgaW50IGVycm9yQ291bnQgPSAwOwotCUNsYXNzIGNvbnRlbnRDbGFzcyA9IG51bGw7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudEluc3RhbmNlID0gbnVsbDsKLQlpbnQgdmVyaWZ5ID0gMDsKLQlNZXRob2QgY3VycmVudE1ldGhvZCA9IG51bGw7Ci0JYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKLQlTdHlsZWRUZXh0IHdpZGdldCA9IG51bGw7Ci0JU2hlbGwgc2hlbGwgPSBudWxsOwotCQotcHVibGljIFN0eWxlZFRleHRDb250ZW50U3BlYygpIHsKLX0KLXB1YmxpYyB2b2lkIGFzc2VydFRydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gY29uZGl0aW9uKSB7Ci0JU3lzdGVtLm91dC5wcmludCgiXHQiICsgY3VycmVudE1ldGhvZC5nZXROYW1lKCkgKyAiICIgKyBtZXNzYWdlKTsKLQlpZiAoIWNvbmRpdGlvbikgCi0JCWZhaWwobWVzc2FnZSk7Ci0JZWxzZSAKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgcGFzc2VkIik7Ci19Ci1wdWJsaWMgdm9pZCBmYWlsKFN0cmluZyBtZXNzYWdlKSB7Ci0JZmFpbGVkID0gdHJ1ZTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oIiBGQUlMRUQ6ICIgKyBtZXNzYWdlKTsKLQlmYWlsQ291bnQrKzsKLX0KLXB1YmxpYyBTdHlsZWRUZXh0Q29udGVudCBnZXRDb250ZW50SW5zdGFuY2UoKSB7Ci0JY29udGVudEluc3RhbmNlLnNldFRleHQoIiIpOwotCXdpZGdldC5zZXRDb250ZW50KGNvbnRlbnRJbnN0YW5jZSk7Ci0JcmV0dXJuIGNvbnRlbnRJbnN0YW5jZTsKLX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRlc3RUZXh0KCkgewotCXJldHVybiAKLQkJIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmUuXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgc2Vjb25kIGxpbmUuXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgdGhpcmQgbGluZS5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmb3VydGggbGluZS5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaWZ0aCBsaW5lLlxyXG4iICsKLQkJIlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgc2Vjb25kIGxpbmUgYWdhaW4uXHJcbiIgKwotCQkiVGhpcyBpcyB0aGUgdGhpcmQgbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmb3VydGggbGluZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmaWZ0aCBsaW5lIGFnYWluLlxyXG4iICsKLQkJIlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgb25jZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBzZWNvbmQgbGluZSBvbmNlIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIHRoaXJkIGxpbmUgb25jZSBhZ2Fpbi5cclxuIiArCi0JCSJUaGlzIGlzIHRoZSBmb3VydGggbGluZSBvbmNlIGFnYWluLlxyXG4iICsKLQkJIlRoaXMgaXMgdGhlIGZpZnRoIGxpbmUgb25jZSBhZ2Fpbi4iOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVN0eWxlZFRleHRDb250ZW50U3BlYyBzcGVjID0gbmV3IFN0eWxlZFRleHRDb250ZW50U3BlYygpOwotCWlmIChhcmdzLmxlbmd0aCA+IDApIHsKLQkJY29udGVudENsYXNzTmFtZSA9IGFyZ3NbMF07Ci0JfSBlbHNlIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCWJveC5zZXRNZXNzYWdlKCJDb250ZW50IGNsYXNzIG11c3QgYmUgc3BlY2lmaWVkIGFzIGFuIGV4ZWN1dGlvbiBhcmd1bWVudC4iKTsgLy8kTk9OLU5MUy0xJAotCQlib3gub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCXNwZWMucnVuKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JU3lzdGVtLm91dC5wcmludGxuKGZhaWxDb3VudCArICIgVEVTVCBGQUlMVVJFUy4iKTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3JDb3VudCArICIgVU5FWFBFQ1RFRCBFUlJPUlMuIik7Ci19Ci1wdWJsaWMgdm9pZCBydW4oKSB7Ci0JaWYgKGNvbnRlbnRDbGFzc05hbWUuZXF1YWxzKCIiKSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJYm94LnNldE1lc3NhZ2UoIkNvbnRlbnQgY2xhc3MgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYW4gZXhlY3V0aW9uIGFyZ3VtZW50LiIpOyAvLyROT04tTkxTLTEkCi0JCWJveC5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNvbnRlbnRDbGFzcyA9PSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQljb250ZW50Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNvbnRlbnRDbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VCb3ggYm94ID0gbmV3IE1lc3NhZ2VCb3goRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQkJYm94LnNldE1lc3NhZ2UoIkNvbnRlbnQgY2xhc3M6XG4iICsgY29udGVudENsYXNzTmFtZSArICJcbm5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQlib3gub3BlbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXRyeSB7Ci0JCWNvbnRlbnRJbnN0YW5jZSA9IChTdHlsZWRUZXh0Q29udGVudCljb250ZW50Q2xhc3MubmV3SW5zdGFuY2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJTWVzc2FnZUJveCBib3ggPSBuZXcgTWVzc2FnZUJveChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuSUNPTl9FUlJPUik7Ci0JCWJveC5zZXRNZXNzYWdlKCJVbmFibGUgdG8gYWNjZXNzIGNvbnRlbnQgY2xhc3M6XG4iICsgY29udGVudENsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYm94Lm9wZW4oKTsKLQkJcmV0dXJuOwotCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQlNZXNzYWdlQm94IGJveCA9IG5ldyBNZXNzYWdlQm94KERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJYm94LnNldE1lc3NhZ2UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBjb250ZW50IGNsYXNzOlxuIiArIGNvbnRlbnRDbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JCWJveC5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0JQ2xhc3MgY2xheno7Ci0JY2xhenogPSB0aGlzLmdldENsYXNzKCk7Ci0JTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCWZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCXNldFVwKCk7Ci0JCWN1cnJlbnRNZXRob2QgPSBtZXRob2RzW2ldOwotCQlmYWlsZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChjdXJyZW50TWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ0ZXN0XyIpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGN1cnJlbnRNZXRob2QuZ2V0TmFtZSgpICsgIi4uLiIpOwotCQkJCWN1cnJlbnRNZXRob2QuaW52b2tlKHRoaXMsIG5ldyBPYmplY3RbMF0pOwotCQkJCWlmICghZmFpbGVkKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUEFTU0VELiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRkFJTEVEIik7Ci0JCQkJfQotCQkJfSAKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBjdXJyZW50TWV0aG9kLmdldE5hbWUoKSArICIgRVJST1IgPT0+ICIgKyBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS50b1N0cmluZygpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRkFJTEVEIik7Ci0JCQllcnJvckNvdW50Kys7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBjdXJyZW50TWV0aG9kLmdldE5hbWUoKSArICIgRVJST1IgPT0+ICIgKyBleC50b1N0cmluZygpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRkFJTEVEIik7Ci0JCQllcnJvckNvdW50Kys7Ci0JCX0KLQkJaWYgKHZlcmlmeSAhPSAwKSB7Ci0JCQl2ZXJpZnkgPSAwOwotCQkJY29udGVudEluc3RhbmNlLnJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQl0ZWFyRG93bigpOwotCX0KLX0KLXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotfQotcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotfQotcHVibGljIHZvaWQgdGV4dENoYW5naW5nKFRleHRDaGFuZ2luZ0V2ZW50IGV2ZW50KSB7Ci0Jc3dpdGNoICh2ZXJpZnkpIHsKLQkJY2FzZSAxIDogewotCQkJYXNzZXJ0VHJ1ZSgiOjFhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAyIDogewotCQkJYXNzZXJ0VHJ1ZSgiOjJhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMik7Ci0JCQlhc3NlcnRUcnVlKCI6MmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAzIDogewotCQkJYXNzZXJ0VHJ1ZSgiOjNhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6M2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSA0OiB7Ci0JCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDUgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6NWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjo1YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDYgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6NmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCWFzc2VydFRydWUoIjo2YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDggOiB7Ci0JCQlhc3NlcnRUcnVlKCI6OGE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCWFzc2VydFRydWUoIjo4YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDkgOiB7Ci0JCQlhc3NlcnRUcnVlKCI6OWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCWFzc2VydFRydWUoIjo5YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDEwOnsKLQkJCWFzc2VydFRydWUoIjoxMDoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDExOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMjogewotCQkJYXNzZXJ0VHJ1ZSgiOjEyYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJYXNzZXJ0VHJ1ZSgiOjEyYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDEzOiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTNhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MTNiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTQ6IHsKLQkJCWFzc2VydFRydWUoIjoxNDoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE1OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MTVhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQlhc3NlcnRUcnVlKCI6MTViOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTY6ewotCQkJYXNzZXJ0VHJ1ZSgiOjE2OiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTc6IHsKLQkJCWFzc2VydFRydWUoIjoxNzoiLCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDE4OiB7Ci0JCQlhc3NlcnRUcnVlKCI6MThhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQlhc3NlcnRUcnVlKCI6MThiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgMTk6IHsKLQkJCWFzc2VydFRydWUoIjoxOWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCWFzc2VydFRydWUoIjoxOWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAyMDogewotCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdF9JbnNlcnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCVN0cmluZyBuZXdUZXh0OwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgInRlc3RcbiAiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIG5ld1RleHQuZXF1YWxzKCJ0ZXN0XG4gVGhpc1xuaXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoInRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiBUaGlzIikpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgIioqKiAiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG4qKiogaXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIioqKiBpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIG5ld1RleHQuZXF1YWxzKCJcckxpbmUgMVxyXG5MaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjozZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJMaW5lIDIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDksIDAsICJcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2Y6IiwgbmV3VGV4dC5lcXVhbHMoIlxyTGluZSAxXHJcblxyTGluZSAyIikpOwotCWFzc2VydFRydWUoIjozZzoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjozaDoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNpOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6M2o6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozazoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCJMaW5lIDIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuVGhpc1xuaXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo0ZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg3LCAwLCAiXHJcbm5ld0xpbmUiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5pc1xyXG5uZXdMaW5lIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjo1YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygibmV3TGluZSBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJUaGlzXG5pc1xyXG5uZXdMaW5lIGEgdGVzdFxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuaXNcclxubmV3TGluZSBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6NmI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIm5ld0xpbmUgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjo2ZjoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0KLQkvLyBpbnNlcnQgYXQgZW5kCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDQsIDAsICJcbiAiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG4gIikpOwotCWFzc2VydFRydWUoIjo3YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo3YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo3ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIgIikpOwotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2U6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcblxuIikpOwotCWFzc2VydFRydWUoIjo3ZjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo3ZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjo3aDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdpOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCS8vIGluc2VydCBhdCBiZWdpbm5pbmcKLQljb250ZW50LnNldFRleHQoIlRoaXMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo4YToiLCBuZXdUZXh0LmVxdWFscygiXG5UaGlzIikpOwotCWFzc2VydFRydWUoIjo4YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo4YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlRoaXMiKSk7Ci0KLQkvLyBpbnNlcnQgdGV4dAotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMCwgIioqKiAiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjlhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG4qKiogaXMgYSB0ZXN0XHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjliOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjljOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjlkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIioqKiBpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjllOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAibGluZSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTBhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5saW5lIikpOwotCWFzc2VydFRydWUoIjoxMGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MTBjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJsaW5lIikpOwotCWFzc2VydFRydWUoIjoxMGU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoOCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwZjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg5KSA9PSAxKTsKLQotCS8vIGluc2VydCBhdCBiZWdpbm5pbmcgCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgImxpbmVcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTFhOiIsIG5ld1RleHQuZXF1YWxzKCJsaW5lXG5UaGlzXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxMWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygibGluZSIpKTsKLQlhc3NlcnRUcnVlKCI6MTFkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg1KSA9PSAxKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMlxyXG5MaW5lIDMiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxMmE6IiwgbmV3VGV4dC5lcXVhbHMoIlxyTGluZSAxXHJcbkxpbmUgMlxyXG5MaW5lIDMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDQpOwotCWFzc2VydFRydWUoIjoxMmM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoxMmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAxIikpOwotCWFzc2VydFRydWUoIjoxMmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiTGluZSAyIikpOwotCWFzc2VydFRydWUoIjoxMmY6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiTGluZSAzIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcbkxpbmUgMlxuTGluZSAzIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDAsICJMaW5lMWFcbkxpbmUxYlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxM2E6IiwgbmV3VGV4dC5lcXVhbHMoIkxpbmUgMVxuTGluZTFhXG5MaW5lMWJcbkxpbmUgMlxuTGluZSAzIikpOwotCWFzc2VydFRydWUoIjoxM2I6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MTNjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTNkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUxYSIpKTsKLQlhc3NlcnRUcnVlKCI6MTNlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUxYiIpKTsKLQlhc3NlcnRUcnVlKCI6MTNmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6MTNnOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIkxpbmUgMyIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDJcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxMSwgMCwgImwxYSIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTRhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIDFcbkxpbmVsMWEgMlxuTGluZSAzIikpOwotCWFzc2VydFRydWUoIjoxNGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTRjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTRkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmVsMWEgMiIpKTsKLQlhc3NlcnRUcnVlKCI6MTRlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMyIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDIgaXMgYSB2ZXJ5IGxvbmcgbGluZSB0aGF0IHNwYW5zIG1hbnkgd29yZHNcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxOSwgMCwgInZlcnksIHZlcnksICIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTVhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIDFcbkxpbmUgMiBpcyBhIHZlcnksIHZlcnksIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BhbnMgbWFueSB3b3Jkc1xuTGluZSAzIikpOwotCWFzc2VydFRydWUoIjoxNWI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MTVjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6MTVkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIkxpbmUgMiBpcyBhIHZlcnksIHZlcnksIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BhbnMgbWFueSB3b3JkcyIpKTsKLQlhc3NlcnRUcnVlKCI6MTVlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMyIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9FbXB0eSgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgidGVzdCIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLDQsIiIpOwotCWFzc2VydFRydWUoIjoyYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X0xpbmVfQ29udmVyc2lvbigpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RccnJlcGVhdFxuZW5kXHIiKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA1KTsJCi0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwkKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoxZToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg0KSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWY6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMSkgPT0gNSk7CQotCWFzc2VydFRydWUoIjoxZzoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJyZXBlYXQiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFoOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDE1KTsJCi0JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoImVuZCIpKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMykgPT0gMjIpOwotCWFzc2VydFRydWUoIjoxazoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFsOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDQpID09IDI2KTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcclxuaXMgYSB0ZXN0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDApOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXHJcbmlzIGEgdGVzdFxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMTUpID09IDEpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcbiIpOwotCWFzc2VydFRydWUoIjo0YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDApOwotCWFzc2VydFRydWUoIjo0ZjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAxKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcblxuXHJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7CQotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVlOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDIpOwkKLQlhc3NlcnRUcnVlKCI6NWY6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1ZzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSAzKTsJCi0JYXNzZXJ0VHJ1ZSgiOjVoOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWk6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMykgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVqOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWs6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoNCkgPT0gNik7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJ0ZXN0XHJccnRlc3QyXHJcciIpOwotCWFzc2VydFRydWUoIjo2YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDUpOwotCWFzc2VydFRydWUoIjo2YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJ0ZXN0IikpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo2ZToiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSA1KTsJCi0JYXNzZXJ0VHJ1ZSgiOjZmOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoInRlc3QyIikpOwotCWFzc2VydFRydWUoIjo2ZzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSA2KTsJCi0JYXNzZXJ0VHJ1ZSgiOjZoOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6Nmk6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMykgPT0gMTIpOwotCWFzc2VydFRydWUoIjo2ajoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZrOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDQpID09IDEzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfT2Zmc2V0X1RvX0xpbmUoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHJyZXBlYXRcbmVuZFxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgzKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFkOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDI1KSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MWU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMjYpID09IDQpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xyXG5pcyBhIHRlc3QiKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDYpID09IDEpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxMCkgPT0gMSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDApID09IDApOwotCWFzc2VydFRydWUoIjozYjoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgxKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMikgPT0gMSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxyXG5cblxyXHJcbiIpOwotCWFzc2VydFRydWUoIjo0YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgzKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDUpID09IDMpOwotCWFzc2VydFRydWUoIjo0ZzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCg2KSA9PSA0KTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiXHJcblxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDApOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMykgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVlOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDQpID09IDIpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxyXHJcblxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NmE6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIGNvbnRlbnQuZ2V0TGluZUF0T2Zmc2V0KDEpID09IDEpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgyKSA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NmQ6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMyk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6N2E6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JCi0JY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWFzc2VydFRydWUoIjo4YToiLCBjb250ZW50LmdldExpbmVBdE9mZnNldCgwKSA9PSAwKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfTGluZV9Ub19PZmZzZXQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHJyZXBlYXRcbmVuZFxyIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjoxYjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSA1KTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMikgPT0gMTUpOwotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgzKSA9PSAyMik7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDQpID09IDI2KTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcclxuaXMgYSB0ZXN0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDApID09IDApOwotCWFzc2VydFRydWUoIjoyYjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgxKSA9PSA2KTsKLQkKLQljb250ZW50LnNldFRleHQoIlxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDIpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxuXG5cclxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDIpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGQ6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMykgPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDQpID09IDYpOwotCi0JY29udGVudC5zZXRUZXh0KCJcclxudGVzdFxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRPZmZzZXRBdExpbmUoMCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDIpOwotCWFzc2VydFRydWUoIjo1YzoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgyKSA9PSA4KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9EZWxldGUoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCVN0cmluZyBuZXdUZXh0OwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNiwgMiwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbmlhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6MWM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaWEgdGVzdCIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDUsIDksICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5cciIpKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoyZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMjEsIDcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjozZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJsaW5lIDMiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDUsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIG5ld1RleHQuZXF1YWxzKCJpcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0IikpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjo0YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImxpbmUgMyIpKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygibGluZSA0IikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxNiwgNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgbmV3VGV4dC5lcXVhbHMoImlzIGEgdGVzdFxubGluZSAzIikpOwotCWFzc2VydFRydWUoIjo0ZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImxpbmUgMyIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoOSwgNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGk6IiwgbmV3VGV4dC5lcXVhbHMoImlzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6NGo6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiaXMgYSB0ZXN0IikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCA4LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo0azoiLCBuZXdUZXh0LmVxdWFscygiaSIpKTsKLQlhc3NlcnRUcnVlKCI6NGw6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiaSIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NG06IiwgbmV3VGV4dC5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NG46IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBuZXdUZXh0LmVxdWFscygiVGhpc1xuXHIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiVGhpcyIpKTsKLQlhc3NlcnRUcnVlKCI6NWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg0LCA4LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2YToiLCBuZXdUZXh0LmVxdWFscygiTDFcclxuTDRcclxuIikpOwotCWFzc2VydFRydWUoIjo2YjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjZjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIkwxIikpOwotCWFzc2VydFRydWUoIjo2ZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJMNCIpKTsKLQlhc3NlcnRUcnVlKCI6NmU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJcbkwxXHJcbkwyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdhOiIsIG5ld1RleHQuZXF1YWxzKCJMMVxyXG5MMiIpKTsKLQlhc3NlcnRUcnVlKCI6N2I6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo3YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMMSIpKTsKLQlhc3NlcnRUcnVlKCI6N2Q6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTDIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhhOiIsIG5ld1RleHQuZXF1YWxzKCJcbkwxXHJcbkwyIikpOwotCWFzc2VydFRydWUoIjo4YjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjhjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6OGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkwyIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJcbkxpbmUgMVxuTGluZSAyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgNywgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6OWE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuTGluZSAyXG4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjliOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjljOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6OWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAyIikpOwotCWFzc2VydFRydWUoIjo5ZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIkxpbmUgMVxuTGluZSAyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNiwgOCwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MTBhOiIsIG5ld1RleHQuZXF1YWxzKCJMaW5lIDEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwYjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjoxMGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiTGluZSAxIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJMaW5lIG9uZSBpcyBzaG9ydFxyXG5MaW5lIDIgaXMgYSBsb25nZXIgbGluZVxyXG5MaW5lIDNcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxMiwgMTcsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYToiLCBuZXdUZXh0LmVxdWFscygiTGluZSBvbmUgaXMgYSBsb25nZXIgbGluZVxyXG5MaW5lIDNcbiIpKTsKLQlhc3NlcnRUcnVlKCI6MTFiOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjExYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMaW5lIG9uZSBpcyBhIGxvbmdlciBsaW5lIikpOwotCWFzc2VydFRydWUoIjoxMWQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGluZSAzIikpOwotCWFzc2VydFRydWUoIjoxMWU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X1JlcGxhY2UoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCVN0cmluZyBuZXdUZXh0OwotCQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgNCwgImEiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIG5ld1RleHQuZXF1YWxzKCJUaGlzXG5hIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoxYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoxZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJhIHRlc3QiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMiwgIndhcyIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXNcbndhcyBhIHRlc3RcciIpKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iixjb250ZW50LmdldExpbmVDb3VudCgpID09IDMpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJUaGlzIikpOwotCWFzc2VydFRydWUoIjoyZDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJ3YXMgYSB0ZXN0IikpOwotCWFzc2VydFRydWUoIjoyZToiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0KLQljb250ZW50LnNldFRleHQoIlRoaXMgaXMgYSB0ZXN0XHIiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNSwgMiwgIndhcyIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgbmV3VGV4dC5lcXVhbHMoIlRoaXMgd2FzIGEgdGVzdFxyIikpOwotCWFzc2VydFRydWUoIjozYjoiLGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIlRoaXMgd2FzIGEgdGVzdCIpKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgY29udGVudC5nZXRMaW5lQXRPZmZzZXQoMTUpID09IDApOwotCQotCWNvbnRlbnQuc2V0VGV4dCgiTGluZSAxXG5MaW5lIDJcbkxpbmUgMyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCA3LCAiTGFcbkxiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIG5ld1RleHQuZXF1YWxzKCJMYVxuTGJcbkxpbmUgMlxuTGluZSAzIikpOwotCWFzc2VydFRydWUoIjo0YjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJMYSIpKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiTGIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIkxpbmUgMiIpKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiTGluZSAzIikpOwotCi0JY29udGVudC5zZXRUZXh0KGdldFRlc3RUZXh0KCkpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlpbnQgc3RhcnQgPSBjb250ZW50LmdldE9mZnNldEF0TGluZSg2KTsKLQlpbnQgZW5kID0gY29udGVudC5nZXRPZmZzZXRBdExpbmUoMTEpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMTIpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg2KS5lcXVhbHMoIiIpKTsKLQlzdGFydCA9IGNvbnRlbnQuZ2V0T2Zmc2V0QXRMaW5lKDcpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZShzdGFydCwgY29udGVudC5nZXRDaGFyQ291bnQoKSAtIHN0YXJ0LCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDgpOwotCWFzc2VydFRydWUoIjo1YToiLCBjb250ZW50LmdldExpbmUoNSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIGNvbnRlbnQuZ2V0TGluZSg2KS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWE6IiwgY29udGVudC5nZXRMaW5lKDcpLmVxdWFscygiIikpOwotCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X1NwZWNpYWxfQ2FzZXMoKSB7Ci0JU3RyaW5nIG5ld1RleHQ7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IGdldENvbnRlbnRJbnN0YW5jZSgpOwotCWFzc2VydFRydWUoIjowYToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjowYjoiLCBjb250ZW50LmdldE9mZnNldEF0TGluZSgwKSA9PSAwKTsKLQkKLQljb250ZW50LnNldFRleHQoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWM6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxZDoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNCwgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCAwLCAiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MWY6Iixjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDYsIDAsICJcbiIpOwotCWFzc2VydFRydWUoIjoxZzoiLGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMCwgIlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjFoOiIsY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCi0JY29udGVudC5zZXRUZXh0KCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MmE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoyYzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCJUaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAwLCAiXG4iKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJkOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjoyZjoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJnOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0KLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozYToiLCBuZXdUZXh0LmVxdWFscygiXG5cblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6M2I6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozYzoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgY29udGVudC5nZXRMaW5lKDMpLmVxdWFscygiVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjozZjoiLCBuZXdUZXh0LmVxdWFscygiXG5cblxuXG5UaGlzIGlzIHRoZSBpbnB1dC9vdXRwdXQgdGV4dCBjb21wb25lbnQuIikpOwotCWFzc2VydFRydWUoIjozZzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjozajoiLCBjb250ZW50LmdldExpbmUoMykuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNrOiIsIGNvbnRlbnQuZ2V0TGluZSg0KS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0KLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6NGE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuXG5cblRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NGM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0ZDoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRlOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDIsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRmOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo0aDoiLCBjb250ZW50LmdldExpbmUoMSkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIGNvbnRlbnQuZ2V0TGluZSgyKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0KLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgImEiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIG5ld1RleHQuZXF1YWxzKCJcblxuYVRoaXMgaXMgdGhlIGlucHV0L291dHB1dCB0ZXh0IGNvbXBvbmVudC4iKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjViOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6NWM6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiIikpOwotCWFzc2VydFRydWUoIjo1ZDoiLCBjb250ZW50LmdldExpbmUoMikuZXF1YWxzKCJhVGhpcyBpcyB0aGUgaW5wdXQvb3V0cHV0IHRleHQgY29tcG9uZW50LiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiYWJjXHJcbmRlZiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2YToiLCBuZXdUZXh0LmVxdWFscygiYWNcclxuZGVmIikpOwotCWFzc2VydFRydWUoIjo2YjoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo2YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhYyIpKTsKLQlhc3NlcnRUcnVlKCI6NmQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiZGVmIikpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAxLCAiIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo2ZToiLCBuZXdUZXh0LmVxdWFscygiYVxyXG5kZWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZmOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjZnOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImEiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZoOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoImRlZiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6Nmk6IiwgbmV3VGV4dC5lcXVhbHMoImFkZWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZqOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZrOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImFkZWYiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDEsIDEsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZsOiIsIG5ld1RleHQuZXF1YWxzKCJhZWYiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZtOiIsIGNvbnRlbnQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZuOiIsIGNvbnRlbnQuZ2V0TGluZSgwKS5lcXVhbHMoImFlZiIpKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMSwgIiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6Nm86IiwgbmV3VGV4dC5lcXVhbHMoImFmIikpOwotCWFzc2VydFRydWUoIjo2cDoiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjo2cToiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCJhZiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiYWJjIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICIxIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo3YToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDEpOwotCWFzc2VydFRydWUoIjo3YjoiLCBuZXdUZXh0LmVxdWFscygiMWJjIikpOwotCWFzc2VydFRydWUoIjo3YzoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIxYmMiKSk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6N2Q6IiwgbmV3VGV4dC5lcXVhbHMoIlxuMWJjIikpOwotCWFzc2VydFRydWUoIjo3ZToiLCBjb250ZW50LmdldExpbmVDb3VudCgpID09IDIpOwotCWFzc2VydFRydWUoIjo3ZjoiLCBjb250ZW50LmdldExpbmUoMCkuZXF1YWxzKCIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdnOiIsIGNvbnRlbnQuZ2V0TGluZSgxKS5lcXVhbHMoIjFiYyIpKTsKLQkKLQljb250ZW50ID0gZ2V0Q29udGVudEluc3RhbmNlKCk7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwiYSIpOwotCQotCWNvbnRlbnQuc2V0VGV4dCgicGFja2FnZSB0ZXN0O1xuLyogTGluZSAxXG4gKiBMaW5lIDJcbiAqL1xucHVibGljIGNsYXNzIFNpbXBsZUNsYXNzIHtcbn0iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMTQsIDIzLCAiXHQvKkxpbmUgMVxuXHQgKiBMaW5lIDJcblx0ICovIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjo4YToiLCBuZXdUZXh0LmVxdWFscygicGFja2FnZSB0ZXN0O1xuXHQvKkxpbmUgMVxuXHQgKiBMaW5lIDJcblx0ICovXG5wdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3Mge1xufSIpKTsKLQlhc3NlcnRUcnVlKCI6OGI6IiwgY29udGVudC5nZXRMaW5lQ291bnQoKSA9PSA2KTsKLQlhc3NlcnRUcnVlKCI6OGM6IiwgY29udGVudC5nZXRMaW5lKDApLmVxdWFscygicGFja2FnZSB0ZXN0OyIpKTsKLQlhc3NlcnRUcnVlKCI6OGQ6IiwgY29udGVudC5nZXRMaW5lKDEpLmVxdWFscygiXHQvKkxpbmUgMSIpKTsKLQlhc3NlcnRUcnVlKCI6OGU6IiwgY29udGVudC5nZXRMaW5lKDIpLmVxdWFscygiXHQgKiBMaW5lIDIiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjhmOiIsIGNvbnRlbnQuZ2V0TGluZSgzKS5lcXVhbHMoIlx0ICovIikpOwotCWFzc2VydFRydWUoIjo4ZzoiLCBjb250ZW50LmdldExpbmUoNCkuZXF1YWxzKCJwdWJsaWMgY2xhc3MgU2ltcGxlQ2xhc3MgeyIpKTsKLQlhc3NlcnRUcnVlKCI6OGg6IiwgY29udGVudC5nZXRMaW5lKDUpLmVxdWFscygifSIpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfVGV4dF9DaGFuZ2VkX0V2ZW50KCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQljb250ZW50LmFkZFRleHRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl2ZXJpZnkgPSAxOwotCWNvbnRlbnQuc2V0VGV4dCgidGVzdGluZyIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDI7Ci0JY29udGVudC5zZXRUZXh0KCJcblxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAzOwotCWNvbnRlbnQuc2V0VGV4dCgiYSIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gNDsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjo0OiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDU7Ci0JY29udGVudC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gNjsKLQljb250ZW50LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMjEsIDcsICIiKTsKLQotCXZlcmlmeSA9IDc7Ci0JY29udGVudC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSA4OwotCWNvbnRlbnQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gOTsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdCIpOwotCi0JdmVyaWZ5ID0gMTA7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjEwOiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDExOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgIiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7YXNzZXJ0VHJ1ZSgiOjExOiIsIHRydWUpO30KLQotCXZlcmlmeSA9IDEyOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcciIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDEzOwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDE0OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxNDoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxNTsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAyLCAidGVzdFxuXG4iKTsKLQotCXZlcmlmeSA9IDE2OwotCWNvbnRlbnQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtjb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHthc3NlcnRUcnVlKCI6MTY6IiwgdHJ1ZSk7fQotCi0JdmVyaWZ5ID0gMTc7Ci0JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge2NvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAidGVzdFxuXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoxNzoiLCB0cnVlKTt9Ci0KLQl2ZXJpZnkgPSAxODsKLSAJY29udGVudC5zZXRUZXh0KCJMMVxyIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAxOTsKLQljb250ZW50LnNldFRleHQoIkwxXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgInRlc3RcclxyXHIiKTsKLQl2ZXJpZnkgPSAyMDsKLQljb250ZW50LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXRyeSB7Y29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjoyMDoiLCB0cnVlKTt9Ci0KLQotCXZlcmlmeSA9IDA7Ci0JY29udGVudC5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X0RlbGltaXRlcl9TcGVjaWFsX0Nhc2VzKCkgewotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBnZXRDb250ZW50SW5zdGFuY2UoKTsKLQlTdHJpbmcgbmV3VGV4dDsKLQkKLQljb250ZW50LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQluZXdUZXh0ID0gY29udGVudC5nZXRUZXh0UmFuZ2UoMCwgY29udGVudC5nZXRDaGFyQ291bnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgbmV3VGV4dC5lcXVhbHMoIlxuTDFcclxuTDIiKSk7Ci0JCi0JY29udGVudC5zZXRUZXh0KCJMMVxyXG4iKTsKLQljb250ZW50LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoyOiIsIG5ld1RleHQuZXF1YWxzKCJMMXRlc3RcblxuIikpOwotCi0vLwljb250ZW50LnNldFRleHQoIkwxXHJcbiIpOwotLy8JY29udGVudC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpOwotLy8JbmV3VGV4dCA9IGNvbnRlbnQuZ2V0VGV4dFJhbmdlKDAsIGNvbnRlbnQuZ2V0Q2hhckNvdW50KCkpOwotLy8JYXNzZXJ0VHJ1ZSgiOjM6IiwgbmV3VGV4dC5lcXVhbHMoIkwxXHJ0ZXN0XHJcbiIpKTsKLQotLy8JY29udGVudC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLS8vCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAidGVzdFxuXG4iKTsKLS8vCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLS8vCWFzc2VydFRydWUoIjo0OiIsIG5ld1RleHQuZXF1YWxzKCJMdGVzdFxuXG5cbkwyXHJcbkwzXHJcbkw0XHJcbiIpKTsKLQotCWNvbnRlbnQuc2V0VGV4dCgiTDFcbiIpOwotCWNvbnRlbnQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCW5ld1RleHQgPSBjb250ZW50LmdldFRleHRSYW5nZSgwLCBjb250ZW50LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBuZXdUZXh0LmVxdWFscygiTDF0ZXN0XHJcclxyXG4iKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpICB7Ci0JLy8gY3JlYXRlIHNoZWxsCi0Jc2hlbGwgPSBuZXcgU2hlbGwgKCk7Ci0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQlzaGVsbC5zZXRTaXplKDUwMCwgMzAwKTsKLQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkvLyBjcmVhdGUgd2lkZ2V0Ci0Jd2lkZ2V0ID0gbmV3IFN0eWxlZFRleHQgKHNoZWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKCk7Ci0Jc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQlzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCXNwZWMuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCXdpZGdldC5zZXRMYXlvdXREYXRhKHNwZWMpOwotCXNoZWxsLm9wZW4gKCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpICB7Ci0JaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQgKCkpIAotCQlzaGVsbC5kaXNwb3NlICgpOwotCXNoZWxsID0gbnVsbDsKLQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RKdW5pdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9Td3RKdW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ0ODUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0SnVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0KLS8qKgotICogUGxhdGZvcm0tc3BlY2lmaWMgY29uc3RhbnRzIHVzZWQgaW4gU1dUIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTd3RKdW5pdCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0Rm9udE5hbWU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFNXVC5nZXRQbGF0Zm9ybSgpLnN0YXJ0c1dpdGgoIndpbjMyIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzQ2FyYm9uID0gU1dULmdldFBsYXRmb3JtKCkuc3RhcnRzV2l0aCgiY2FyYm9uIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzTW90aWYgPSBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzR1RLID0gU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJndGsiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNQaG90b24gPSBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoInBob3RvbiIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0xpbnV4ID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJMaW51eCIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0FJWCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiQUlYIik7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzU29sYXJpcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiU29sYXJpcyIpIHx8IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmVxdWFscygiU3VuT1MiKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNIUFVYID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuZXF1YWxzKCJIUC1VWCIpOwotCQotCXN0YXRpYyB7Ci0JCWlmIChpc01vdGlmKSB7Ci0JCQl0ZXN0Rm9udE5hbWUgPSAibWlzYy1maXhlZCI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0ZXN0Rm9udE5hbWUgPSAiSGVsdmV0aWNhIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0VGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvU3d0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4MzM4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1N3dFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotCi1wdWJsaWMgY2xhc3MgU3d0VGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBtYXJrIHRlc3QgY2FzZXMgdGhhdAotCSAqIGFyZSBub3QgaGFuZGxlZCBjb3JyZWN0bHkgYnkgU1dUIGF0IHRoaXMgdGltZSwgb3IgdGVzdAotCSAqIGNhc2VzIHRoYXQgbWF5YmUgdGhlbXNlbHZlcyBkdWJpb3VzIChlZy4gd2hlbiB0aGUgY29ycmVjdAotCSAqIGJlaGF2aW91ciBtYXkgbm90IGJlIGNsZWFyKS4gTW9zdCBvZiB0aGVzZSBmbGFnZ2VkIHRlc3QKLQkgKiBjYXNlcyBpbnZvbHZlIGhhbmRsaW5nIGVycm9yIGNvbmRpdGlvbnMuCi0JICoKLQkgKiBTZXR0aW5nIHRoZXNlIGZsYWdzIHRvIHRydWUgd2lsbCBydW4gdGhvc2UgdGVzdHMuIEFzIGFwaQotCSAqIGlzIGltcGxlbWVudGVkIHRoaXMgZ2l2ZXMgdXMgYSBjb252ZW5pZW50IHdheSB0byBpbmNsdWRlCi0JICogaXQgaW4gdGhlIGp1bml0IHRlc3RzLgotCSAqLwotCi0JLy8gcnVuIHRlc3QgY2FzZXMgdGhhdCBtYXkgdGhlbXNlbHZlcyBiZSBkdWJpb3VzCi0JLy8gdGhlc2Ugc2hvdWxkIGJlIGV2ZW50dWFsbHkgY2hlY2tlZCB0byBzZWUgaWYgCi0JLy8gdGhlcmUgaXMgYSB2YWxpZCBmYWlsdXJlIG9yIHRoZSB0ZXN0IGlzIGJvZ3VzCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZDaGVja0JvZ3VzVGVzdENhc2VzID0gZmFsc2U7Ci0KLQkvLyBjaGVjayB2aXNpYmlsaXR5IGFwaSAoZWcgaW4gbWVudSkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZkNoZWNrVmlzaWJpbGl0eSA9IGZhbHNlOwotCi0JLy8gcnVuIHRlc3QgY2FzZXMgdGhhdCBjaGVjayBTV1QgcG9saWN5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBmbGFncyBhYm92ZQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmQ2hlY2tTV1RQb2xpY3kgPSBmYWxzZTsKLQotCS8vIG1ha2UgZGlhbG9nIG9wZW4gY2FsbHMsIG9wZXJhdG9yIG11c3QgdGhlbiBjbG9zZSB0aGVtCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZUZXN0RGlhbG9nT3BlbiA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmVGVzdENvbnNpc3RlbmN5ID0gZmFsc2U7Ci0KLQkvLyB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgdW5pbXBsZW1lbnRlZCBtZXRob2RzCi0JcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0JCi0JLy8gdmFyaWFibGUgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHVuaW1wbGVtZW50ZWQgQVBJIG1ldGhvZHMKLQlwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkQVBJOwotCQotCS8vIHVzZWQgdG8gc3BlY2lmeSB2ZXJib3NlIG1vZGUsIGlmIHRydWUgdW5pbXBsZW1lbnRlZCB3YXJuaW5nIG1lc3NhZ2VzIHdpbGwgCi0JLy8gYmUgd3JpdHRlbiB0byBTeXN0ZW0ub3V0Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQkKLQkvLyBhbGxvdyBzcGVjaWZpYyBpbWFnZSBmb3JtYXRzIHRvIGJlIHRlc3RlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW1hZ2VGb3JtYXRzID0gbmV3IFN0cmluZ1tdIHsiYm1wIiwgImpwZyIsICJnaWYiLCAicG5nIn07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbWFnZUZpbGVuYW1lcyA9IG5ldyBTdHJpbmdbXSB7ImZvbGRlciIsICJmb2xkZXJPcGVuIiwgInRhcmdldCJ9OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gaW52YWxpZEltYWdlRmlsZW5hbWVzID0gbmV3IFN0cmluZ1tdIHsiY29ycnVwdCIsICJjb3JydXB0QmFkQml0RGVwdGgucG5nIn07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzID0gbmV3IFN0cmluZ1tdIHsidHJhbnNwYXJlbnQucG5nIn07Ci0JCi0JLy8gc3BlY2lmeSByZXBhcmVudGFibGUgcGxhdGZvcm1zCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSByZXBhcmVudGFibGVQbGF0Zm9ybXMgPSBuZXcgU3RyaW5nW10geyJ3aW4zMiIsICJndGsiLCAiY2FyYm9uIn07Ci0JCi1wdWJsaWMgU3d0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZXhwZWN0ZWRbXSwgT2JqZWN0IGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHJldHVybjsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApIHJldHVybjsKLQkJc2FtZSA9IHRydWU7Ci0JCWJvb2xlYW5bXSBtYXRjaGVkID0gbmV3IGJvb2xlYW5bZXhwZWN0ZWQubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWQubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIW1hdGNoZWRbal0pIHsKLQkJCQkJaWYgKChhY3R1YWxbaV0gPT0gbnVsbCAmJiBleHBlY3RlZCBbal0gPT0gbnVsbCkgfHwKLQkJCQkJICAgIChhY3R1YWxbaV0gIT0gbnVsbCAmJiBhY3R1YWxbaV0uZXF1YWxzKGV4cGVjdGVkW2pdKSkpIHsKLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCW1hdGNoZWRbal0gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hdGNoKSB7Ci0JCQkJc2FtZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmICghc2FtZSkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRTYW1lKE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlhc3NlcnRTYW1lKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOwotfQotc3RhdGljIHB1YmxpYyB2b2lkIGFzc2VydFNhbWUoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkgcmV0dXJuOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCWlmIChleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsICYmIGV4cGVjdGVkLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoKSB7Ci0JCWlmIChleHBlY3RlZC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQlzYW1lID0gdHJ1ZTsKLQkJYm9vbGVhbltdIG1hdGNoZWQgPSBuZXcgYm9vbGVhbltleHBlY3RlZC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZC5sZW5ndGg7IGorKykgewotCQkJCWlmICghbWF0Y2hlZFtqXSAmJiBhY3R1YWxbaV0gPT0gZXhwZWN0ZWRbal0pIHsKLQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQltYXRjaGVkW2pdID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIXNhbWUpIHsKLQkJZmFpbE5vdEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci19Ci1zdGF0aWMgcHVibGljIHZvaWQgYXNzZXJ0U2FtZShpbnQgZXhwZWN0ZWRbXSwgaW50IGFjdHVhbFtdKSB7Ci0JYXNzZXJ0U2FtZShudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZFtdLCBPYmplY3QgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFleHBlY3RlZFtpXS5lcXVhbHMoYWN0dWFsW2ldKSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZENvZGUsIFRocm93YWJsZSBhY3R1YWxUaHJvd2FibGUpIHsKLQlpZiAoYWN0dWFsVGhyb3dhYmxlIGluc3RhbmNlb2YgU1dURXJyb3IpIHsKLQkJU1dURXJyb3IgZXJyb3IgPSAoU1dURXJyb3IpIGFjdHVhbFRocm93YWJsZTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQ29kZSwgZXJyb3IuY29kZSk7Ci0JfSBlbHNlIGlmIChhY3R1YWxUaHJvd2FibGUgaW5zdGFuY2VvZiBTV1RFeGNlcHRpb24pIHsKLQkJU1dURXhjZXB0aW9uIGV4Y2VwdGlvbiA9IChTV1RFeGNlcHRpb24pIGFjdHVhbFRocm93YWJsZTsKLQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkQ29kZSwgZXhjZXB0aW9uLmNvZGUpOwotCX0gZWxzZSB7Ci0JCXRyeSB7Ci0JCQlTV1QuZXJyb3IoZXhwZWN0ZWRDb2RlKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4cGVjdGVkVGhyb3dhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUaHJvd2FibGUuZ2V0TWVzc2FnZSgpLCBhY3R1YWxUaHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoT2JqZWN0IGV4cGVjdGVkW10sIE9iamVjdCBhY3R1YWxbXSkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZFtdLCBpbnQgYWN0dWFsW10pIHsKLQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJcmV0dXJuOwotCWJvb2xlYW4gZXF1YWwgPSBmYWxzZTsKLQlpZiAoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCAmJiBleHBlY3RlZC5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aCkgewotCQlpZiAoZXhwZWN0ZWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWVxdWFsID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGV4cGVjdGVkW2ldICE9IGFjdHVhbFtpXSkgewotCQkJCWVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFlcXVhbCkgewotCQlmYWlsTm90RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLX0KLXN0YXRpYyBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbHMoaW50IGV4cGVjdGVkW10sIGludCBhY3R1YWxbXSkgewotICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKLX0KLQotc3RhdGljIHByaXZhdGUgdm9pZCBmYWlsTm90RXF1YWxzKFN0cmluZyBtZXNzYWdlLCBPYmplY3RbXSBleHBlY3RlZCwgT2JqZWN0W10gYWN0dWFsKSB7Ci0JU3RyaW5nIGZvcm1hdHRlZD0gIiI7Ci0JaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLQkJZm9ybWF0dGVkPSBtZXNzYWdlKyIgIjsKLQlmb3JtYXR0ZWQgKz0gImV4cGVjdGVkOjwiOwotCWlmKGV4cGVjdGVkICE9IG51bGwpIHsKLQkgICAgZm9yKGludCBpPTA7IGk8TWF0aC5taW4oZXhwZWN0ZWQubGVuZ3RoLCA1KTsgaSsrKQotCSAgICAgICAgZm9ybWF0dGVkICs9IGV4cGVjdGVkW2ldICsiLCAiOwotCSAgICBpZihleHBlY3RlZC5sZW5ndGggIT0gMCkKLQkgICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5zdWJzdHJpbmcoMCwgZm9ybWF0dGVkLmxlbmd0aCgpLTIpOwotCX0KLQlpZihleHBlY3RlZC5sZW5ndGggPiA1KQotCSAgICBmb3JtYXR0ZWQgKz0gIi4uLiI7Ci0JZm9ybWF0dGVkICs9ICI+IGJ1dCB3YXM6PCI7Ci0JaWYoYWN0dWFsICE9IG51bGwpIHsKLQkgICAgZm9yKGludCBpPTA7IGk8TWF0aC5taW4oYWN0dWFsLmxlbmd0aCwgNSk7IGkrKykKLQkgICAgICAgIGZvcm1hdHRlZCArPSBhY3R1YWxbaV0gKyIsICI7Ci0JICAgIGlmKGFjdHVhbC5sZW5ndGggIT0gMCkKLQkgICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5zdWJzdHJpbmcoMCwgZm9ybWF0dGVkLmxlbmd0aCgpLTIpOwotCX0KLQlpZihhY3R1YWwubGVuZ3RoID4gNSkKLQkgICAgZm9ybWF0dGVkICs9ICIuLi4iOwotCWZhaWwoZm9ybWF0dGVkKyI+Iik7Ci19Ci0KLXByb3RlY3RlZCBib29sZWFuIGlzSjJNRSgpIHsKLQl0cnkgewotCQlDb21wYXRpYmlsaXR5Lm5ld0ZpbGVJbnB1dFN0cmVhbSgiIik7Ci0JfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci1wcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcGFyZW50YWJsZVBsYXRmb3JtKCkgewotCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCWZvciAoaW50IGk9MDsgaTxyZXBhcmVudGFibGVQbGF0Zm9ybXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHJlcGFyZW50YWJsZVBsYXRmb3Jtc1tpXS5lcXVhbHMocGxhdGZvcm0pKSByZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB3YXJuVW5pbXBsKFN0cmluZyBtZXNzYWdlKSB7Ci0JaWYgKHZlcmJvc2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0Q2xhc3MoKSArICI6ICIgKyBtZXNzYWdlKTsKLQl9Ci0JdW5pbXBsZW1lbnRlZE1ldGhvZHMrKzsKLX0KLXByb3RlY3RlZCB2b2lkIHdhcm5VbmltcGxBUEkoU3RyaW5nIG1lc3NhZ2UpIHsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFQSSBub3QgaW1wbGVtZW50ZWQgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgIiArIGdldE5hbWUoKSk7Ci0JfQotCXVuaW1wbGVtZW50ZWRBUEkrKzsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk1NWI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuU1dUCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuU1dUCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gRG8gbm90aGluZy4gQ2xhc3MgU1dUIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySSgpIHsKLQkvLyBUZXN0IHRoYXQgd2UgdGhyb3cgdGhlIGV4cGVjdGVkIGtpbmRzIG9mIGVycm9ycyBmb3IgdGhlIGdpdmVuIGVycm9yIHR5cGVzLgotCWJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgRVJST1JfTlVMTF9BUkdVTUVOVCIsIHBhc3NlZCk7Ci0JcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9GQUlMRURfRVhFQyk7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7Ci0JCXBhc3NlZCA9IHRydWU7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX0ZBSUxFRF9FWEVDIiwgcGFzc2VkKTsKLQlwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX05PX0hBTkRMRVMpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCXBhc3NlZCA9IHRydWU7Ci0JfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsgfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gZm9yIEVSUk9SX05PX0hBTkRMRVMiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcigtMSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gdHJ1ZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgZXJyb3IoLTEpIiwgcGFzc2VkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSgpIHsKLQkvLyBUZXN0IHRoYXQgdGhlIGNhdXNpbmcgdGhyb3dhYmxlIGlzIGZpbGxlZCBpbi4KLQlUaHJvd2FibGUgY2F1c2UgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigiSnVzdCBmb3IgdGVzdGluZyIpOwotCWJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0JdHJ5IHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGNhdXNlKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfTk9UX0lNUExFTUVOVEVELCBjYXVzZSk7Ci0JfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJcGFzc2VkID0gZXgudGhyb3dhYmxlID09IGNhdXNlOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7IH0KLQlhc3NlcnRUcnVlICgiZGlkIG5vdCBjb3JyZWN0bHkgdGhyb3cgZXhjZXB0aW9uIGZvciBFUlJPUl9OT1RfSU1QTEVNRU5URUQiLCBwYXNzZWQpOwotCXBhc3NlZCA9IGZhbHNlOwotCXRyeSB7Ci0JCVNXVC5lcnJvcigtMSwgY2F1c2UpOwotCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCXBhc3NlZCA9IGV4LnRocm93YWJsZSA9PSBjYXVzZTsKLQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB9Ci0JYXNzZXJ0VHJ1ZSAoImRpZCBub3QgY29ycmVjdGx5IHRocm93IGV4Y2VwdGlvbiBmb3IgZXJyb3IoLTEpIiwgcGFzc2VkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLQl0cnkgewotCQlwYXNzZWQgPSBmYWxzZTsKLQkJU1dULmdldE1lc3NhZ2UobnVsbCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCXBhc3NlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUgKCJkaWQgbm90IGNvcnJlY3RseSB0aHJvdyBleGNlcHRpb24gd2l0aCBudWxsIGFyZ3VtZW50IiwgcGFzc2VkKTsKLQl0cnkgewotCQlTV1QuZ2V0TWVzc2FnZSgiU1dUX1llcyIpOwotCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCWZhaWwgKCJleGNlcHRpb24gIiArIHQgKyAiIGdlbmVyYXRlZCBmb3IgU1dUX1llcyIpOwotCX0KLQlhc3NlcnRUcnVlICgKLQkJImludmFsaWQga2V5IGRpZCBub3QgcmV0dXJuIGFzIGl0c2VsZiIsCi0JCSJfTk9UX0ZPVU5EX0lOX1BST1BFUlRJRVNfIi5lcXVhbHMoU1dULmdldE1lc3NhZ2UoIl9OT1RfRk9VTkRfSU5fUFJPUEVSVElFU18iKSkpOwotCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQbGF0Zm9ybSgpIHsKLQkvLyBDYW4ndCB0ZXN0IHRoZSBsaXN0IG9mIHBsYXRmb3Jtcywgc2luY2UgdGhpcyBtYXkgY2hhbmdlLAotCS8vIHNvIGp1c3QgdGVzdCB0byBzZWUgaXQgcmV0dXJucyBzb21ldGhpbmcuCi0JYXNzZXJ0VHJ1ZSAoInJldHVybmVkIG51bGwgcGxhdGZvcm0gbmFtZSIsIFNXVC5nZXRQbGF0Zm9ybSgpICE9IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0JLy8gVGVzdCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciB3aGljaCBpcyByZXR1cm5lZCBpcyByZWFzb25hYmxlLgotCWludCB2ZXIgPSBTV1QuZ2V0VmVyc2lvbigpOwotCWFzc2VydFRydWUgKCJ1bnJlYXNvbmFibGUgdmFsdWUgcmV0dXJuZWQiLCB2ZXIgPiAwICYmIHZlciA8IDEwMDAwMDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1QoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJTGphdmFfbGFuZ19UaHJvd2FibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGxhdGZvcm0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZlcnNpb24iKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJIikpIHRlc3RfZXJyb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvcklMamF2YV9sYW5nX1Rocm93YWJsZSIpKSB0ZXN0X2Vycm9ySUxqYXZhX2xhbmdfVGhyb3dhYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9nZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBsYXRmb3JtIikpIHRlc3RfZ2V0UGxhdGZvcm0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZlcnNpb24iKSkgdGVzdF9nZXRWZXJzaW9uKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWRhNzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEVycm9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBmaWxsIGluIGNvZGUgcHJvcGVybHkiLAotCQluZXcgU1dURXJyb3IoKS5jb2RlID09IFNXVC5FUlJPUl9VTlNQRUNJRklFRCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBmaWxsIGluIGNvZGUgcHJvcGVybHkiLAotCQluZXcgU1dURXJyb3IoU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKS5jb2RlID09IFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFcnJvcihTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8sICJBbiB1bmludGVyZXN0aW5nIG1lc3NhZ2UiKS5jb2RlIAotCQkJPT0gU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBmaWxsIGluIGNvZGUgcHJvcGVybHkiLAotCQluZXcgU1dURXJyb3IoIkFuIHVuaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBpbmNsdWRlIGNyZWF0aW9uIHN0cmluZyBpbiByZXN1bHQiLAotCQluZXcgU1dURXJyb3IoU1dULkVSUk9SX0NBTk5PVF9CRV9aRVJPLCAiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmdldE1lc3NhZ2UoKSAKLQkJCS5pbmRleE9mKCJBbiBpbnRlcmVzdGluZyBtZXNzYWdlIikgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRTdGFja1RyYWNlKCkgewotCQotCS8vIFdBUk5JTkc6IHRoaXMgdGVzdCBpcyBub3QgQ0xEQyBzYWZlLCBiZWNhdXNlIGl0IHJlcXVpcmVzIGphdmEuaW8uUHJpbnRTdHJlYW0KLQkKLQl0cnkgewotCQlDbGFzcy5mb3JOYW1lKCJqYXZhLmlvLlByaW50U3RyZWFtIik7Ci0JfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIGlnbm9yZSB0ZXN0IGlmIHJ1bm5pbmcgb24gQ0xEQwotCQlyZXR1cm47Ci0JfQotCQotCS8vIHRlc3QgZGVmYXVsdCBTV1RFcnJvcgotCQotCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JU1dURXJyb3IgZXJyb3IgPSBuZXcgU1dURXJyb3IoKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotCQotCS8vIHRlc3QgU1dURXJyb3Igd2l0aCBjb2RlCi0JCi0Jb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCVN5c3RlbS5zZXRFcnIobmV3IFByaW50U3RyZWFtKG91dCkpOwotCWVycm9yID0gbmV3IFNXVEVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFcnJvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRTdGFja1RyYWNlIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvcklMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lc3NhZ2UiKSkgdGVzdF9nZXRNZXNzYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wcmludFN0YWNrVHJhY2UiKSkgdGVzdF9wcmludFN0YWNrVHJhY2UoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNiMTVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfU1dURXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oKS5jb2RlID09IFNXVC5FUlJPUl9VTlNQRUNJRklFRCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBmaWxsIGluIGNvZGUgcHJvcGVybHkiLAotCQluZXcgU1dURXhjZXB0aW9uKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTykuY29kZSA9PSBTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBmaWxsIGluIGNvZGUgcHJvcGVybHkiLAotCQluZXcgU1dURXhjZXB0aW9uKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTywgIkFuIHVuaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmNvZGUgCi0JCQk9PSBTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSAoCi0JCSJkaWQgbm90IGZpbGwgaW4gY29kZSBwcm9wZXJseSIsCi0JCW5ldyBTV1RFeGNlcHRpb24oIkFuIHVuaW50ZXJlc3RpbmcgbWVzc2FnZSIpLmNvZGUgPT0gU1dULkVSUk9SX1VOU1BFQ0lGSUVEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCWFzc2VydFRydWUgKAotCQkiZGlkIG5vdCBpbmNsdWRlIGNyZWF0aW9uIHN0cmluZyBpbiByZXN1bHQiLAotCQluZXcgU1dURXhjZXB0aW9uKFNXVC5FUlJPUl9DQU5OT1RfQkVfWkVSTywgIkFuIGludGVyZXN0aW5nIG1lc3NhZ2UiKS5nZXRNZXNzYWdlKCkgCi0JCQkuaW5kZXhPZigiQW4gaW50ZXJlc3RpbmcgbWVzc2FnZSIpID49IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3ByaW50U3RhY2tUcmFjZSgpIHsKLQkKLQkvLyBXQVJOSU5HOiB0aGlzIHRlc3QgaXMgbm90IENMREMgc2FmZSwgYmVjYXVzZSBpdCByZXF1aXJlcyBqYXZhLmlvLlByaW50U3RyZWFtCi0JCi0JdHJ5IHsKLQkJQ2xhc3MuZm9yTmFtZSgiamF2YS5pby5QcmludFN0cmVhbSIpOwotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLyBpZ25vcmUgdGVzdCBpZiBydW5uaW5nIG9uIENMREMKLQkJcmV0dXJuOwotCX0KLQkKLQkvLyB0ZXN0IGRlZmF1bHQgU1dURXhjZXB0aW9uCi0JCi0JQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQlTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShvdXQpKTsKLQlTV1RFeGNlcHRpb24gZXJyb3IgPSBuZXcgU1dURXhjZXB0aW9uKCk7Ci0JZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7Ci0JYXNzZXJ0VHJ1ZShvdXQuc2l6ZSgpID4gMCk7Ci0JYXNzZXJ0VHJ1ZShuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKS5pbmRleE9mKCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpICE9IC0xKTsKLQkKLQkvLyB0ZXN0IFNXVEV4Y2VwdGlvbiB3aXRoIGNvZGUKLQkKLQlvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0ob3V0KSk7Ci0JZXJyb3IgPSBuZXcgU1dURXhjZXB0aW9uKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQllcnJvci5wcmludFN0YWNrVHJhY2UoKTsKLQlhc3NlcnRUcnVlKG91dC5zaXplKCkgPiAwKTsKLQlhc3NlcnRUcnVlKG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpLmluZGV4T2YoInRlc3RfcHJpbnRTdGFja1RyYWNlIikgIT0gLTEpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9TV1RFeGNlcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lc3NhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50U3RhY2tUcmFjZSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcHJpbnRTdGFja1RyYWNlIikpIHRlc3RfcHJpbnRTdGFja1RyYWNlKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQUNDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWQ4ZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BQ0MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FDQygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmMzOTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCWFjY2Vzc2libGUgPSBzaGVsbC5nZXRBY2Nlc3NpYmxlKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgc2hlbGwuaXNEaXNwb3NlZCgpKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpIHsKLQlBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldENoaWxkcmVuKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldERlZmF1bHRBY3Rpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Rm9jdXMoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRTZWxlY3Rpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCX0KLQl9OwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYWNjZXNzaWJsZS5yZW1vdmVBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyKCkgewotCUFjY2Vzc2libGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXREZXNjcmlwdGlvbihBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0KEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCX0KLQl9OwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlhY2Nlc3NpYmxlLnJlbW92ZUFjY2Vzc2libGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCkgewotCUFjY2Vzc2libGVUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZ2V0U2VsZWN0aW9uUmFuZ2UoQWNjZXNzaWJsZVRleHRFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZ2V0Q2FyZXRPZmZzZXQoQWNjZXNzaWJsZVRleHRFdmVudCBlKSB7Ci0JCX0KLQl9OwotCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JYWNjZXNzaWJsZS5yZW1vdmVBY2Nlc3NpYmxlVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCWFzc2VydEVxdWFscyhzaGVsbCwgYWNjZXNzaWJsZS5nZXRDb250cm9sKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfQWNjZXNzaWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigpIHsKLQkvLyBUZXN0ZWQgaW4gdGVzdF9hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcigpIHsKLQkvLyBUZXN0ZWQgaW4gdGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFjY2Vzc2libGVUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lcigpIHsKLQkvLyBUZXN0ZWQgaW4gdGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2VsZWN0aW9uQ2hhbmdlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvY3VzSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXNJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdGV4dENhcmV0TW92ZWRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90ZXh0Q2FyZXRNb3ZlZEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0Q2hhbmdlZElJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdGV4dENoYW5nZWRJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0U2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRBY2Nlc3NpYmxlVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX1dNX0dFVE9CSkVDVElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0FjY2Vzc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19BY2Nlc3NpYmxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFjY2Vzc2libGVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3Rpb25DaGFuZ2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb2N1c0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRDYXJldE1vdmVkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENoYW5nZWRJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIikpIHRlc3RfYWRkQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyIikpIHRlc3RfYWRkQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfV01fR0VUT0JKRUNUSUkiKSkgdGVzdF9pbnRlcm5hbF9XTV9HRVRPQkpFQ1RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9BY2Nlc3NpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfQWNjZXNzaWJsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfaW50ZXJuYWxfbmV3X0FjY2Vzc2libGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBY2Nlc3NpYmxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQWNjZXNzaWJsZVRleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3Rpb25DaGFuZ2VkIikpIHRlc3Rfc2VsZWN0aW9uQ2hhbmdlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9jdXNJIikpIHRlc3Rfc2V0Rm9jdXNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0Q2FyZXRNb3ZlZEkiKSkgdGVzdF90ZXh0Q2FyZXRNb3ZlZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRDaGFuZ2VkSUlJIikpIHRlc3RfdGV4dENoYW5nZWRJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRTZWxlY3Rpb25DaGFuZ2VkIikpIHRlc3RfdGV4dFNlbGVjdGlvbkNoYW5nZWQoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcml2YXRlIFNoZWxsIHNoZWxsOwotcHJpdmF0ZSBBY2Nlc3NpYmxlIGFjY2Vzc2libGU7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDg5OGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlbHBMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE5hbWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50IikpIHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyZGNhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRyZW5Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0RGVmYXVsdEFjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFJvbGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFN0YXRlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRWYWx1ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZDM4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gT2JqZWN0IHdpbGwgdHlwaWNhbGx5IGJlIGEgd2lkZ2V0LgotCUFjY2Vzc2libGVDb250cm9sRXZlbnQgZXZlbnQgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci0JCi0JLy8gVGVzdCB3aXRoIHNvbWUgb3RoZXIgb2JqZWN0IGFsc28uCi0JZXZlbnQgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xFdmVudChuZXcgSW50ZWdlcig1KSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyODk4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZEF0UG9pbnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRDb3VudExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSb2xlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGlsZENvdW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRBY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9jdXNMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQXRQb2ludExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Q2hpbGRBdFBvaW50TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkQ291bnRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldENoaWxkTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoaWxkcmVuTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRDaGlsZHJlbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXREZWZhdWx0QWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvY3VzTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQiKSkgdGVzdF9nZXRGb2N1c0xvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0Um9sZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGF0ZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlQ29udHJvbEV2ZW50IikpIHRlc3RfZ2V0U3RhdGVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VmFsdWVMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUNvbnRyb2xFdmVudCIpKSB0ZXN0X2dldFZhbHVlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVDb250cm9sRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2NGM2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCkgewotCS8vIE9iamVjdCB3aWxsIHR5cGljYWxseSBiZSBhIHdpZGdldC4KLQlBY2Nlc3NpYmxlRXZlbnQgZXZlbnQgPSBuZXcgQWNjZXNzaWJsZUV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50KTsKLQkKLQkvLyBUZXN0IHdpdGggc29tZSBvdGhlciBvYmplY3QgYWxzby4KLQlldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQobmV3IEludGVnZXIoNSkpOwotCWFzc2VydE5vdE51bGwoZXZlbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUFjY2Vzc2libGVFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlRXZlbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFNoZWxsIHNoZWxsOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM3MjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25Mb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXNjcmlwdGlvbkxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleWJvYXJkU2hvcnRjdXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCIpKSB0ZXN0X2dldERlc2NyaXB0aW9uTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVscExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRIZWxwTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0S2V5Ym9hcmRTaG9ydGN1dExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXRLZXlib2FyZFNob3J0Y3V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlRXZlbnQiKSkgdGVzdF9nZXROYW1lTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmIzYzBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlZjAwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVRleHRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gT2JqZWN0IHdpbGwgdHlwaWNhbGx5IGJlIGEgd2lkZ2V0LgotCUFjY2Vzc2libGVUZXh0RXZlbnQgZXZlbnQgPSBuZXcgQWNjZXNzaWJsZVRleHRFdmVudChzaGVsbCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci0JCi0JLy8gVGVzdCB3aXRoIHNvbWUgb3RoZXIgb2JqZWN0IGFsc28uCi0JZXZlbnQgPSBuZXcgQWNjZXNzaWJsZVRleHRFdmVudChuZXcgSW50ZWdlcig1KSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQWNjZXNzaWJsZVRleHRFdmVudCBldmVudCA9IG5ldyBBY2Nlc3NpYmxlVGV4dEV2ZW50KHNoZWxsKTsKLQlhc3NlcnROb3ROdWxsKGV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZXZlbnQudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxYTQyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dExpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldE9mZnNldExvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRPZmZzZXRMb3JnX2VjbGlwc2Vfc3d0X2FjY2Vzc2liaWxpdHlfQWNjZXNzaWJsZVRleHRFdmVudCIpKSB0ZXN0X2dldENhcmV0T2Zmc2V0TG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlTG9yZ19lY2xpcHNlX3N3dF9hY2Nlc3NpYmlsaXR5X0FjY2Vzc2libGVUZXh0RXZlbnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZUxvcmdfZWNsaXBzZV9zd3RfYWNjZXNzaWJpbGl0eV9BY2Nlc3NpYmxlVGV4dEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2F3dF9TV1RfQVdULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjJkZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYXd0LlNXVF9BV1QKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hd3QuU1dUX0FXVAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYXd0X1NXVF9BV1QgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbmV3X1NoZWxsTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9hd3RfQ2FudmFzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9hd3RfU1dUX0FXVCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9uZXdfU2hlbGxMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2F3dF9DYW52YXMiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uZXdfRnJhbWVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIikpIHRlc3RfbmV3X0ZyYW1lTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbmV3X1NoZWxsTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9hd3RfQ2FudmFzIikpIHRlc3RfbmV3X1NoZWxsTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9hd3RfQ2FudmFzKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Jyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxYjNjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Jyb3dzZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Jyb3dzZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQlicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5kaXNwb3NlKCk7Ci0JYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuQk9SREVSKTsKLQlicm93c2VyLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlicm93c2VyID0gbmV3IEJyb3dzZXIobnVsbCwgU1dULk5PTkUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2FkZENsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JQ2xvc2VXaW5kb3dMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYWRkTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLnJlbW92ZUxvY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCU9wZW5XaW5kb3dMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobGlzdGVuZXIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIucmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKTsKLQl0cnkgewotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLnJlbW92ZVByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVN0YXR1c1RleHRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKGxpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLnJlbW92ZVN0YXR1c1RleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfYWRkVGl0bGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JVGl0bGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLnJlbW92ZVRpdGxlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIGJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKGxpc3RlbmVyKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSBicm93c2VyLnJlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYmFjaygpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2JhY2siKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYnJvd3Nlci5iYWNrKCk7Ci0JCXJ1bkxvb3BUaW1lcigxKTsKLQl9Ci0JLyogcmV0dXJuaW5nIDEwIHRpbWVzIGluIGhpc3RvcnkgLSBleHBlY3RpbmcgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuYmFjaygpOwotCWFzc2VydEZhbHNlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5leGVjdXRlKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzY3JpcHQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JLyogUmVhbCB0ZXN0aW5nIGlzIGRvbmUgaW4gdGhlIHRlc3RzIHRoYXQgcnVuIHRoZSBldmVudCBsb29wCi0JICogc2luY2UgYSBkb2N1bWVudCBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgdG8gZXhlY3V0ZSBhIHNjcmlwdCBvbiBpdC4KLQkgKi8KLX0KLQotcHVibGljIHZvaWQgdGVzdF9mb3J3YXJkKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfZm9yd2FyZCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLmZvcndhcmQoKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLQkvKiBnb2luZyBmb3J3YXJkIDEwIHRpbWVzIGluIGhpc3RvcnkgLSBleHBlY3RpbmcgZmFsc2UgaXMgcmV0dXJuZWQgKi8KLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuZm9yd2FyZCgpOwotCWFzc2VydEZhbHNlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VXJsKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfZ2V0VXJsIik7Ci0JU3RyaW5nIHN0cmluZyA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JYXNzZXJ0VHJ1ZShzdHJpbmcgIT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNCYWNrRW5hYmxlZCgpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X2lzQmFja0VuYWJsZWQiKTsKLQkKLQkvKiBiYWNrIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgdGhhdCBpc0JhY2tFbmFibGVkIHByZXZpb3VzbHkgcmV0dXJuZWQgKi8KLQlhc3NlcnRFcXVhbHMoYnJvd3Nlci5pc0JhY2tFbmFibGVkKCksIGJyb3dzZXIuYmFjaygpKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJYnJvd3Nlci5iYWNrKCk7Ci0JCXJ1bkxvb3BUaW1lcigxKTsKLQl9Ci0JLyogZ29pbmcgYmFjayAxMCB0aW1lcyBpbiBoaXN0b3J5IC0gZXhwZWN0aW5nIGZhbHNlIGlzIHJldHVybmVkICovCi0JYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmlzQmFja0VuYWJsZWQoKTsKLQlhc3NlcnRGYWxzZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRm9yd2FyZEVuYWJsZWQoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9pc0ZvcndhcmRFbmFibGVkIik7Ci0JCi0JLyogZm9yd2FyZCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXNGb3J3YXJkRW5hYmxlZCBwcmV2aW91c2x5IHJldHVybmVkICovCi0JYXNzZXJ0RXF1YWxzKGJyb3dzZXIuaXNGb3J3YXJkRW5hYmxlZCgpLCBicm93c2VyLmZvcndhcmQoKSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWJyb3dzZXIuZm9yd2FyZCgpOwotCQlydW5Mb29wVGltZXIoMSk7Ci0JfQotCS8qIGdvaW5nIGZvcndhcmQgMTAgdGltZXMgaW4gaGlzdG9yeSAtIGV4cGVjdGluZyBmYWxzZSBpcyByZXR1cm5lZCAqLwotCWJvb2xlYW4gcmVzdWx0ID0gYnJvd3Nlci5pc0ZvcndhcmRFbmFibGVkKCk7Ci0JYXNzZXJ0RmFsc2UocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWZyZXNoKCkgewotCXNoZWxsLnNldFRleHQoInRlc3RfcmVmcmVzaCIpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlicm93c2VyLnJlZnJlc2goKTsKLQkJcnVuTG9vcFRpbWVyKDEpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JdHJ5IHsKLQkJYnJvd3Nlci5yZW1vdmVDbG9zZVdpbmRvd0xpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyB0ZXN0ZWQgaW4gYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxvY2F0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZUxvY2F0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRMb2NhdGlvbkxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZE9wZW5XaW5kb3dMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVByb2dyZXNzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZVByb2dyZXNzTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRQcm9ncmVzc0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZVN0YXR1c1RleHRMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFN0YXR1c1RleHRMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZVRpdGxlTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIHRlc3RlZCBpbiBhZGRUaXRsZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQl0cnkgewotCQlicm93c2VyLnJlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gdGVzdGVkIGluIGFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzaGVsbC5zZXRUZXh0KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCQotCVN0cmluZyBodG1sID0gIjxIVE1MPjxIRUFEPjxUSVRMRT5IVE1MIGV4YW1wbGUgMjwvVElUTEU+PC9IRUFEPjxCT0RZPjxIMT5IVE1MIGV4YW1wbGUgMjwvSDE+IjsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgewotCQlodG1sICs9IjxQPlRoYXQgaXMgYSB0ZXN0IGxpbmUgd2l0aCB0aGUgbnVtYmVyICIraSsiPC9QPiI7Ci0JfQotCWh0bWwgKz0gIjwvQk9EWT48L0hUTUw+IjsKLQlib29sZWFuIHJlc3VsdCA9IGJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci0JcnVuTG9vcFRpbWVyKDEwKTsKLQkKLQl0cnkgewotCQlicm93c2VyLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VXJsTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc2hlbGwuc2V0VGV4dCgidGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZyIpOwotCXRyeSB7Ci0JCWJyb3dzZXIuc2V0VXJsKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB1cmwgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JCi0JLyogVEhJUyBURVNUIFJFUVVJUkVTIFdFQiBBQ0NFU1MhIEhvdyBlbHNlIGNhbiB3ZSByZWFsbHkgdGVzdCB0aGUgaHR0cDovLyBwYXJ0IG9mIGEgYnJvd3NlciB3aWRnZXQ/ICovCi0JYnJvd3Nlci5zZXRVcmwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvc3d0Iik7Ci0JcnVuTG9vcFRpbWVyKDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdG9wKCkgewotCXNoZWxsLnNldFRleHQoInRlc3Rfc3RvcCIpOwotCS8qIFRISVMgVEVTVCBSRVFVSVJFUyBXRUIgQUNDRVNTISBIb3cgZWxzZSBjYW4gd2UgcmVhbGx5IHRlc3QgdGhlIGh0dHA6Ly8gcGFydCBvZiBhIGJyb3dzZXIgd2lkZ2V0PyAqLwotCWJyb3dzZXIuc2V0VXJsKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3N3dCIpOwotCXJ1bkxvb3BUaW1lcigxKTsKLQlicm93c2VyLnN0b3AoKTsKLQlydW5Mb29wVGltZXIoMTApOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQnJvd3NlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZENsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYmFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb3J3YXJkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRVcmwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzQmFja0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRm9yd2FyZEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZnJlc2giKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRpdGxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRVcmxMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RvcCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZENsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lciIpKSB0ZXN0X2FkZENsb3NlV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkTG9jYXRpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyIikpIHRlc3RfYWRkT3BlbldpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkUHJvZ3Jlc3NMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyIikpIHRlc3RfYWRkUHJvZ3Jlc3NMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyIikpIHRlc3RfYWRkU3RhdHVzVGV4dExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyIikpIHRlc3RfYWRkVGl0bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIikpIHRlc3RfYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYmFjayIpKSB0ZXN0X2JhY2soKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9yd2FyZCIpKSB0ZXN0X2ZvcndhcmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFVybCIpKSB0ZXN0X2dldFVybCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNCYWNrRW5hYmxlZCIpKSB0ZXN0X2lzQmFja0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRm9yd2FyZEVuYWJsZWQiKSkgdGVzdF9pc0ZvcndhcmRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWZyZXNoIikpIHRlc3RfcmVmcmVzaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQ2xvc2VXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMb2NhdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU9wZW5XaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVPcGVuV2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVQcm9ncmVzc0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVN0YXR1c1RleHRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTdGF0dXNUZXh0TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVUaXRsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVWaXNpYmlsaXR5V2luZG93TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFVybExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VXJsTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0b3AiKSkgdGVzdF9zdG9wKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotQnJvd3NlciBicm93c2VyOwotCi12b2lkIHJ1bkxvb3BUaW1lcihmaW5hbCBpbnQgc2Vjb25kcykgewotCWZpbmFsIGJvb2xlYW5bXSBleGl0ID0ge2ZhbHNlfTsKLQluZXcgVGhyZWFkKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkge1RocmVhZC5zbGVlcChzZWNvbmRzICogMTAwMCk7fSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQlleGl0WzBdID0gdHJ1ZTsKLQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9LnN0YXJ0KCk7Ci0Jc2hlbGwub3BlbigpOwotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCXdoaWxlICghZXhpdFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQ5M2EwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9DbG9zZVdpbmRvd0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5DbG9zZVdpbmRvd0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5DbG9zZVdpbmRvd0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0Nsb3NlV2luZG93TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfQ2xvc2VXaW5kb3dMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Nsb3NlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2VMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9jbG9zZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM5MTlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25BZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCW5ldyBMb2NhdGlvbkFkYXB0ZXIoKSB7fTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlMb2NhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IG5ldyBMb2NhdGlvbkFkYXB0ZXIoKSB7CQotCX07Ci0JYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKGFkYXB0ZXIpOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQiKSkgdGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlY2UxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25MaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hhbmdlZChMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQl9CQkKLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5naW5nTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX0xvY2F0aW9uRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Mb2NhdGlvbkV2ZW50IikpIHRlc3RfY2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfTG9jYXRpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc3NzFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9PcGVuV2luZG93TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLk9wZW5XaW5kb3dMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX09wZW5XaW5kb3dMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfT3BlbldpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbldpbmRvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW5XaW5kb3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9vcGVuV2luZG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YWNlOTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuUHJvZ3Jlc3NBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Qcm9ncmVzc0FkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IFByb2dyZXNzQWRhcHRlcigpIHt9OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NBZGFwdGVyKCkge30pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0FkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jb21wbGV0ZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjJiMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlByb2dyZXNzTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfUHJvZ3Jlc3NFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQiKSkgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXBsZXRlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9Qcm9ncmVzc0V2ZW50IikpIHRlc3RfY29tcGxldGVkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Byb2dyZXNzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzYjNmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9TdGF0dXNUZXh0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1N0YXR1c1RleHRFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfU3RhdHVzVGV4dEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViZTIyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5UaXRsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1RpdGxlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9UaXRsZUV2ZW50KCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JYnJvd3Nlci5hZGRUaXRsZUxpc3RlbmVyKG5ldyBUaXRsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJfQotCX0pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCIpKSB0ZXN0X2NoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVGl0bGVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjZDI3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlZpc2liaWxpdHlXaW5kb3dBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0FkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IFZpc2liaWxpdHlXaW5kb3dBZGFwdGVyKCkge307Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93QWRhcHRlcigpe30pOwotCXNoZWxsLmNsb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpKSB0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODQwNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9icm93c2VyX1Zpc2liaWxpdHlXaW5kb3dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9WaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9KTsKLQlzaGVsbC5jbG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudAotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGlkZUxvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hpZGVMb3JnX2VjbGlwc2Vfc3d0X2Jyb3dzZXJfV2luZG93RXZlbnQiKSkgdGVzdF9oaWRlTG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93TG9yZ19lY2xpcHNlX3N3dF9icm93c2VyX1dpbmRvd0V2ZW50IikpIHRlc3Rfc2hvd0xvcmdfZWNsaXBzZV9zd3RfYnJvd3Nlcl9XaW5kb3dFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY3YzViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkFuaW1hdGVkUHJvZ3Jlc3MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQW5pbWF0ZWRQcm9ncmVzcwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQW5pbWF0ZWRQcm9ncmVzcyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NsZWFyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jbGVhciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0YXJ0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zdGFydCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N0b3AoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3N0b3Agbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0FuaW1hdGVkUHJvZ3Jlc3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdGFydCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RvcCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbGVhciIpKSB0ZXN0X2NsZWFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydCIpKSB0ZXN0X3N0YXJ0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdG9wIikpIHRlc3Rfc3RvcCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTZmZjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDdmNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CaWRpU2VnbWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJpZGlTZWdtZW50TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQmlkaVNlZ21lbnRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCB0ZXh0OwotCWJvb2xlYW4gbGlzdGVuZXJDYWxsZWQ7CQotCVN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQkJCQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXByaXZhdGUgYm9vbGVhbiBpc0JpZGkoKSB7Ci0JcmV0dXJuIEJpZGlVdGlsLmlzQmlkaVBsYXRmb3JtKCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotcHJpdmF0ZSB2b2lkIHRlc3RMaXN0ZW5lcihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgaW50W10gc2VnbWVudHMsIGJvb2xlYW4gZXhjZXB0aW9uRXhwZWN0ZWQpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCUJpZGlTZWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFNlZ21lbnRzKEJpZGlTZWdtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlICsgIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIDAsIGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UgKyAiIGluY29ycmVjdCBCaWRpU2VnbWVudEV2ZW50IiwgbGluZSwgZXZlbnQubGluZVRleHQpOwotCQkJCi0JCQlldmVudC5zZWdtZW50cyA9IHNlZ21lbnRzOwotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwkKLQkJfQotCX07Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkJCi0JdHJ5IHsKLQkJdGV4dC5hZGRCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JZmluYWxseSB7Ci0JCXRleHQucmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCWlmIChleGNlcHRpb25FeHBlY3RlZCkgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duID09IGZhbHNlKTsKLQl9Ci0JaWYgKGlzQmlkaSgpKSB7Ci0JCWFzc2VydFRydWUobWVzc2FnZSArICIgbGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsJCi0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIGxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci19Ci1wcml2YXRlIHZvaWQgdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKGZpbmFsIGludFtdIHNlZ21lbnRzLCBpbnRbXSBib2xkUmFuZ2VzKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlCaWRpU2VnbWVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEJpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTZWdtZW50cyhCaWRpU2VnbWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlhc3NlcnRFcXVhbHMoIiBpbmNvcnJlY3QgQmlkaVNlZ21lbnRFdmVudCIsIDAsIGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJYXNzZXJ0RXF1YWxzKCIgaW5jb3JyZWN0IEJpZGlTZWdtZW50RXZlbnQiLCBsaW5lLCBldmVudC5saW5lVGV4dCk7Ci0JCQkKLQkJCWV2ZW50LnNlZ21lbnRzID0gc2VnbWVudHM7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7CQotCQl9Ci0JfTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQkKLQl0cnkgewotCQl0ZXh0LmFkZEJpZGlTZWdtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0JCWZvciAoaW50IGk9MDsgaTxib2xkUmFuZ2VzLmxlbmd0aDsgaSs9MikgewotCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoYm9sZFJhbmdlc1tpXSwgYm9sZFJhbmdlc1tpKzFdLCBudWxsLCBudWxsLCBTV1QuQk9MRCk7Ci0JCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGVSYW5nZSk7Ci0JCX0KLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JZmluYWxseSB7Ci0JCXRleHQucmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCWFzc2VydFRydWUoIiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCBleGNlcHRpb25UaHJvd24gPT0gZmFsc2UpOwotCWlmIChpc0JpZGkoKSkgewotCQlhc3NlcnRUcnVlKCIgbGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsJCi0JfQotCWVsc2UgewotCQlhc3NlcnRUcnVlKCIgbGlzdGVuZXIgY2FsbGVkIHdoZW4gaXQgc2hvdWxkbid0IGJlIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9saW5lR2V0U2VnbWVudHNMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudEV2ZW50KCkgewotCWludCBsaW5lTGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JLy8gc2hvdWxkIG5vdCBjYXVzZSBhbiBleGNlcHRpb24KLQl0ZXN0TGlzdGVuZXIoIjphOiIsIG51bGwsIGZhbHNlKTsKLQl0ZXN0TGlzdGVuZXIoIjpiOiIsIG5ldyBpbnRbXSB7MCwgbGluZUxlbmd0aCAvIDIsIGxpbmVMZW5ndGh9LCBmYWxzZSk7Ci0JdGVzdExpc3RlbmVyKCI6YzoiLCBuZXcgaW50W10gezAsIGxpbmVMZW5ndGggLyAyfSwgZmFsc2UpOwotCQkJCi0JLy8gc2hvdWxkIGFsbCBjYXVzZSBhbiBleGNlcHRpb24gb24gYSBiaWRpIHBsYXRmb3JtCi0JaWYgKGlzQmlkaSgpKSB7Ci0JCXRlc3RMaXN0ZW5lcigiOmQ6IiwgbmV3IGludFtdIHtsaW5lTGVuZ3RoIC8gMn0sIHRydWUpOwotCQl0ZXN0TGlzdGVuZXIoIjplOiIsIG5ldyBpbnRbXSB7MCwgMSwgMSwgbGluZUxlbmd0aCAvIDJ9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6ZjoiLCBuZXcgaW50W10gezAsIDEsIDIsIGxpbmVMZW5ndGggKyAxfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmc6IiwgbmV3IGludFtdIHswLCAxLCBsaW5lTGVuZ3RoICsgMSwgbGluZUxlbmd0aCArIDF9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6aDoiLCBuZXcgaW50W10gezAsIDIsIDF9LCB0cnVlKTsKLQkJdGVzdExpc3RlbmVyKCI6aToiLCBuZXcgaW50W10gezAsIC0xLCAyfSwgdHJ1ZSk7Ci0JCXRlc3RMaXN0ZW5lcigiOmo6IiwgbmV3IGludFtdIHswLCAtMSwgMn0sIHRydWUpOwotCX0KLQotCS8vIHRlc3QgYm9sZCBzZWdtZW50aW5nCi0JbGluZSA9ICJ0aGlzIGlzIGEgbGluZSB3aXRoIDUwIGNoYXJzIC0gKioqKiAqKioqICoqKiogKioqKiI7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDUsNSwyLDEyLDMsMjAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDUsMTAsMTUsMjAsMjV9LCBuZXcgaW50W10gezAsNSw1LDIsMTIsMywyMCw1fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsNSw1LDEsNywzLDEwLDMsMTUsNSwyMCw1fQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNSwxMCwxNSwyMCwyNX0sIG5ldyBpbnRbXSB7MCw2LDcsNiwxNSwxMH0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHswLDUsNSw1LDEwLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1fSwgbmV3IGludFtdIHswLDE1fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezAsNX0KLQl0ZXN0U3R5bGVSYW5nZVNlZ21lbnRpbmcobmV3IGludFtdIHswLDV9LCBuZXcgaW50W10gezAsNX0pOwotCS8vIHNob3VsZCBzZWdtZW50IGFzIGludFtdIHsyLDN9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1fSwgbmV3IGludFtdIHsyLDN9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MCwyfQotCXRlc3RTdHlsZVJhbmdlU2VnbWVudGluZyhuZXcgaW50W10gezAsNX0sIG5ldyBpbnRbXSB7MCwyfSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezEwLDV9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1fSwgbmV3IGludFtdIHsxMCw1fSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezEyLDN9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1fSwgbmV3IGludFtdIHsxMiwzfSk7Ci0JLy8gc2hvdWxkIHNlZ21lbnQgYXMgaW50W10gezMsMiw1LDUsMTAsMywyMSw0LDI1LDN9Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1LDEwLDE1LDIwLDI1LDMwfSwgbmV3IGludFtdIHszLDEwLDIxLDd9KTsKLQkvLyBzaG91bGQgc2VnbWVudCBhcyBpbnRbXSB7MTAsMn0KLQlsaW5lID0gInRlc3QxdGVzdDIvci9uIjsKLQl0ZXh0LnNldFRleHQobGluZSk7Ci0JdGVzdFN0eWxlUmFuZ2VTZWdtZW50aW5nKG5ldyBpbnRbXSB7MCw1fSwgbmV3IGludFtdIHsxMCwyfSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xpbmVHZXRTZWdtZW50c0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGluZUdldFNlZ21lbnRzTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRFdmVudCIpKSB0ZXN0X2xpbmVHZXRTZWdtZW50c0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjNWEzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CdXN5SW5kaWNhdG9yIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1doaWxlTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlMamF2YV9sYW5nX1J1bm5hYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0J1c3lJbmRpY2F0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dXaGlsZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5TGphdmFfbGFuZ19SdW5uYWJsZSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9zaG93V2hpbGVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUxqYXZhX2xhbmdfUnVubmFibGUoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21iby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZGUxMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm8KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NDb21ibyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY2NvbWJvID0gbmV3IENDb21ibyhzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGNjb21ibyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JY2NvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNjb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNjb21iby5jb3B5KCk7Ci0JY2NvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwwKSk7Ci0JY2NvbWJvLnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2NvbWJvLmdldFRleHQoKS5lcXVhbHMoIjIzMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQljY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY2NvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY2NvbWJvLmN1dCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIxNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2xlYXJTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVzZWxlY3RBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rlc2VsZWN0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDaGlsZHJlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRhYmxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRFZGl0YWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUhlaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3R5bGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0eWxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRIZWlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRleHRMaW1pdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRm9jdXNDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0ZvY3VzQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bhc3RlKCkgewotCWNjb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljY29tYm8uY3V0KCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2NvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci0JY2NvbWJvLnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2NvbWJvLmdldFRleHQoKS5lcXVhbHMoIjEyMzQ1NiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZHJhdyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhd0lJSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZWRyYXdJSUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2VsZWN0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRhYmxlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RWRpdGFibGVaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVuYWJsZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvY3VzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExpbWl0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExpbWl0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRWaXNpYmxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0NvbWJvKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhd0lJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRhYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMaW1pdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NsZWFyU2VsZWN0aW9uIikpIHRlc3RfY2xlYXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SSIpKSB0ZXN0X2Rlc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW4iKSkgdGVzdF9nZXRDaGlsZHJlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdGFibGUiKSkgdGVzdF9nZXRFZGl0YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSGVpZ2h0IikpIHRlc3RfZ2V0SXRlbUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgdGVzdF9nZXRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEhlaWdodCIpKSB0ZXN0X2dldFRleHRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRMaW1pdCIpKSB0ZXN0X2dldFRleHRMaW1pdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJIikpIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb2N1c0NvbnRyb2wiKSkgdGVzdF9pc0ZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFzdGUiKSkgdGVzdF9wYXN0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3IikpIHRlc3RfcmVkcmF3KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXdJSUlJWiIpKSB0ZXN0X3JlZHJhd0lJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUkiKSkgdGVzdF9yZW1vdmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJSSIpKSB0ZXN0X3JlbW92ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEkiKSkgdGVzdF9zZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0YWJsZVoiKSkgdGVzdF9zZXRFZGl0YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMaW1pdEkiKSkgdGVzdF9zZXRUZXh0TGltaXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBDdXN0b20gKi8KLUNDb21ibyBjY29tYm87Ci0KLXByaXZhdGUgdm9pZCBhZGQoKSB7Ci0gICAgY2NvbWJvLmFkZCgidGhpcyIpOwotICAgIGNjb21iby5hZGQoImlzIik7Ci0gICAgY2NvbWJvLmFkZCgiU1dUIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChjY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMwLCBjY29tYm8uZ2V0SXRlbUhlaWdodCgpKjIsIAotICAgICAgICAgICAgCQkgQ29uc2lzdGVuY3lVdGlsaXR5LlNFTEVDVElPTik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgLy9vbiBhcnJvdwotICAgIGNvbnNpc3RlbmN5RXZlbnQoY2NvbWJvLmdldFNpemUoKS54LTEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIC8vb24gdGV4dAotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIENvbnNpc3RlbmN5VXRpbGl0eS5FU0NBUEVfTUVOVSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NDgzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWwKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DTGFiZWwgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ0xhYmVsKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsYWJlbCA9IG5ldyBDTGFiZWwoc2hlbGwsIDApOwotCXNldFdpZGdldChsYWJlbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QWxpZ25tZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb29sVGlwVGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsaWdubWVudEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEFsaWdubWVudEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NMYWJlbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWxpZ25tZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9vbFRpcFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsaWdubWVudCIpKSB0ZXN0X2dldEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvb2xUaXBUZXh0IikpIHRlc3RfZ2V0VG9vbFRpcFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFsaWdubWVudEkiKSkgdGVzdF9zZXRBbGlnbm1lbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSIpKSB0ZXN0X3NldEJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1DTGFiZWwgbGFiZWw7Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAyMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3MjEzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtQ291bnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRhYkhlaWdodCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGFiSGVpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUmlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvcFJpZ2h0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUNUYWJGb2xkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW5zZXJ0TWFya0laKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbnNlcnRNYXJrSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmQkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2VsZWN0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRhYkhlaWdodEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRhYkhlaWdodEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFiSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BSaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3JkZXJWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5zZXJ0TWFya0laIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGFiSGVpZ2h0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyIikpIHRlc3RfYWRkQ1RhYkZvbGRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYkhlaWdodCIpKSB0ZXN0X2dldFRhYkhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUmlnaHQiKSkgdGVzdF9nZXRUb3BSaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDVGFiRm9sZGVyTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3JkZXJWaXNpYmxlWiIpKSB0ZXN0X3NldEJvcmRlclZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5zZXJ0TWFya0laIikpIHRlc3Rfc2V0SW5zZXJ0TWFya0laKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW1aIikpIHRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yJEkiKSkgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRTZWxlY3Rpb25CYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYkhlaWdodEkiKSkgdGVzdF9zZXRUYWJIZWlnaHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSIpKSB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfUGdkd25TZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgQ1RhYkZvbGRlciBjdGFiRm9sZGVyOwotCi1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoKSB7Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci0JY3RhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY3RhYkZvbGRlcik7Ci19Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVUYWJGb2xkZXIoVmVjdG9yIGV2ZW50cykgewotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IG5ldyBDVGFiSXRlbShjdGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dCgiQ1RhYkl0ZW0gJiIgKyBpKTsKLQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiQ1RhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJVGV4dCBpdGVtVGV4dCA9IG5ldyBUZXh0KGN0YWJGb2xkZXIsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQlpdGVtVGV4dC5zZXRUZXh0KCJcblRleHQgZm9yIENUYWJJdGVtICIgKyBpICsgIlxuXG5cbiIpOwotCQlpdGVtLnNldENvbnRyb2woaXRlbVRleHQpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW1UZXh0LCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQljdGFiRm9sZGVyLnNldFNlbGVjdGlvbihjdGFiRm9sZGVyLmdldEl0ZW0oMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX1JJR0hULCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChjdGFiRm9sZGVyLmdldFNpemUoKS54LzIsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5DVFJMLCAwLCBTV1QuUEFHRV9ET1dOLCBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUywgZXZlbnRzLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJGb2xkZXIoZXZlbnRzKTsKLSAgICBjdGFiRm9sZGVyLnNldFNlbGVjdGlvbigyKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5DVFJMLCAwLCBTV1QuUEFHRV9VUCwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MsIGV2ZW50cywgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY3RhYkZvbGRlci5zZXRTZWxlY3Rpb24oMSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgY3RhYkZvbGRlci5zZXRTZWxlY3Rpb24oMSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgNSwgNzAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWNkZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCIpKSB0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzkyOGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiRm9sZGVyRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCXN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDJlY2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlckxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXJMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXRlbUNsb3NlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2l0ZW1DbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVyRXZlbnQiKSkgdGVzdF9pdGVtQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhZDZiOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotCUNUYWJGb2xkZXIgY1RhYkZvbGRlcjsKLQlDVGFiSXRlbSBjVGFiSXRlbTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY1RhYkZvbGRlciA9IG5ldyBDVGFiRm9sZGVyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JY1RhYkl0ZW0gPSBuZXcgQ1RhYkl0ZW0oY1RhYkZvbGRlciwgU1dULk5PTkUpOwotCXNldFdpZGdldChjVGFiSXRlbSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NUYWJGb2xkZXJJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREaXNhYmxlZEltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREaXNhYmxlZEltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYXJlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9vbFRpcFRleHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERpc2FibGVkSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9vbFRpcFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ1RhYkZvbGRlcklJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9DVGFiRm9sZGVySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNhYmxlZEltYWdlIikpIHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdiZjc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNvbnRyb2xFZGl0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ29udHJvbEVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFZGl0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEVkaXRvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbGF5b3V0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RWRpdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVkaXRvciIpKSB0ZXN0X2dldEVkaXRvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0IikpIHRlc3RfbGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDA1MDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uRXh0ZW5kZWRNb2RpZnlFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5FeHRlbmRlZE1vZGlmeUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDUyM2UxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5FeHRlbmRlZE1vZGlmeUxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlpbnQgdmVyaWZ5ID0gLTE7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQoKSB7Ci0JRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxYToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjJhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MmI6IiwgZXZlbnQubGVuZ3RoID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6MmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiXG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjNhOiIsIGV2ZW50LnN0YXJ0ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6M2I6IiwgZXZlbnQubGVuZ3RoID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6M2M6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiYSIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNDogewotCQkJCQlhc3NlcnRUcnVlKCI6NDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDUgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo1YToiLCBldmVudC5zdGFydCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjViOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjVjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZhOiIsIGV2ZW50LnN0YXJ0ID09IDIxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjZjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxubGluZSA0IikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA3IDogewotCQkJCQlhc3NlcnRUcnVlKCI6N2E6IiwgZXZlbnQuc3RhcnQgPT0gNSk7Ci0JCQkJCWFzc2VydFRydWUoIjo3YjoiLCBldmVudC5sZW5ndGggPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjo3YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJpcyBhIHRlc3QiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDggOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo4YToiLCBldmVudC5zdGFydCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhiOiIsIGV2ZW50Lmxlbmd0aCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDkgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo5YToiLCBldmVudC5zdGFydCA9PSAyKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjliOiIsIGV2ZW50Lmxlbmd0aCA9PSA0KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjljOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEwOnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTE6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjExOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTI6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYToiLCBldmVudC5zdGFydCA9PSAzKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYjoiLCBldmVudC5sZW5ndGggPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjoxMmM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTNhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTNiOiIsIGV2ZW50Lmxlbmd0aCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE1OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWE6IiwgZXZlbnQuc3RhcnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWI6IiwgZXZlbnQubGVuZ3RoID09IDYpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTVjOiIsIGV2ZW50LnJlcGxhY2VkVGV4dC5lcXVhbHMoIlxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE2OnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE2OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTc6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTg6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YToiLCBldmVudC5zdGFydCA9PSAzKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YjoiLCBldmVudC5sZW5ndGggPT0gNyk7Ci0JCQkJCWFzc2VydFRydWUoIjoxOGM6IiwgZXZlbnQucmVwbGFjZWRUZXh0LmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxOTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTlhOiIsIGV2ZW50LnN0YXJ0ID09IDIpOwotCQkJCQlhc3NlcnRUcnVlKCI6MTliOiIsIGV2ZW50Lmxlbmd0aCA9PSA3KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE5YzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCIiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIwOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIxOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMWE6IiwgZXZlbnQuc3RhcnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjoyMWI6IiwgZXZlbnQubGVuZ3RoID09IDE2KTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIxYzoiLCBldmVudC5yZXBsYWNlZFRleHQuZXF1YWxzKCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0Jc3R5bGVkVGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkKLQlib29sZWFuIGV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuXG4iKTsKLQl2ZXJpZnkgPSAyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAyLCAiYSIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoImEiKTsKLQl2ZXJpZnkgPSAzOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAxLCAiXG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6NDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCXZlcmlmeSA9IDU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxubGluZSAzXG5saW5lIDQiKTsKLQl2ZXJpZnkgPSA2OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyMSwgNywgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlRoaXNcbmlzIGEgdGVzdFxyIik7Ci0JdmVyaWZ5ID0gNzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0JdmVyaWZ5ID0gODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywgMiwgIiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0Iik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl2ZXJpZnkgPSAxMTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAiIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxMTogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcciIpOwotCXZlcmlmeSA9IDEyOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAiXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE0OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJ0ZXN0Iik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTU7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDIsICJ0ZXN0XG5cbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXZlcmlmeSA9IDE2OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTY6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDE3OwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICJ0ZXN0XG5cbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTc6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLSAJc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTg7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbnRlc3RcclxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXZlcmlmeSA9IDE5OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDIwOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjIwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDIxOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0V4dGVuZGVkTW9kaWZ5RXZlbnQiKSkgdGVzdF9tb2RpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE3NjU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZUJhY2tncm91bmRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQoKSB7Ci0JLy8gdGhpcyBtZXRob2QgdGVzdGVkIGJ5IG90aGVyIHRlc3QgY2xhc3NlcwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmOTc3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lQmFja2dyb3VuZExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVCYWNrZ3JvdW5kTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNoZWxsLm9wZW4oKTsKLX0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCgpIHsKLQlMaW5lQmFja2dyb3VuZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRCYWNrZ3JvdW5kKExpbmVCYWNrZ3JvdW5kRXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydFRydWUoIjoxOiIsIGV2ZW50LmxpbmVPZmZzZXQ9PTApOwotCQkJYXNzZXJ0VHJ1ZSgiOjI6IixldmVudC5saW5lVGV4dC5lcXVhbHMoIjAxMjM0NTY3ODkiKSk7Ci0JCX0KLQl9OwotCXN0eWxlZFRleHQuYWRkTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JLy8gZm9yY2UgZ2V0IGxpbmUgYmcgY2FsbGJhY2sKLQlzdHlsZWRUZXh0LnNlbGVjdEFsbCgpOwotCXN0eWxlZFRleHQuY29weSgpOwotCXN0eWxlZFRleHQucmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xpbmVHZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9saW5lR2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQiKSkgdGVzdF9saW5lR2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ1NThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dEV2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0RXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M3ZjM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzaGVsbC5vcGVuKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xpbmVHZXRTdHlsZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50KCkgewotCUxpbmVTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVTdHlsZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQkJCWFzc2VydFRydWUoIjoxOiIsIGV2ZW50LmxpbmVPZmZzZXQ9PTApOwotCQkJYXNzZXJ0VHJ1ZSgiOjI6IixldmVudC5saW5lVGV4dC5lcXVhbHMoIjAxMjM0NTY3ODkiKSk7Ci0JCX0KLQl9OwotCXN0eWxlZFRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCS8vIGZvcmNlIGdldCBsaW5lIHN0eWxlcyBjYWxsYmFjawotCXN0eWxlZFRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg1KTsKLQlzdHlsZWRUZXh0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xpbmVHZXRTdHlsZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xpbmVHZXRTdHlsZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUV2ZW50IikpIHRlc3RfbGluZUdldFN0eWxlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOTIwMjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fUG9wdXBMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uUG9wdXBMaXN0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlBvcHVwTGlzdAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1BvcHVwTGlzdCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb250IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bVdpZHRoKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNaW5pbXVtV2lkdGggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X29wZW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZWxlY3RMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtV2lkdGhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5pbXVtV2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Qb3B1cExpc3QoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW1XaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1XaWR0aEkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bVdpZHRoIikpIHRlc3RfZ2V0TWluaW11bVdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9vcGVuTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2VsZWN0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtV2lkdGhJIikpIHRlc3Rfc2V0TWluaW11bVdpZHRoSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1NULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2QyMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNUCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNUCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU1QoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JLy8gZG9lc24ndCBtYWtlIHNlbnNlIHRvIHRlc3QgdGhpcywgU1QgaXMgY29uc3RhbnRzIGNsYXNzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TVCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3MTU1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU2FzaEZvcm0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE9yaWVudGF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2VpZ2h0cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2VpZ2h0cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2xheW91dFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW1pemVkQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE9yaWVudGF0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdlaWdodHMkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2VpZ2h0cyRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TYXNoRm9ybSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbWl6ZWRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2VpZ2h0cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNYXhpbWl6ZWRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2VpZ2h0cyRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW1pemVkQ29udHJvbCIpKSB0ZXN0X2dldE1heGltaXplZENvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdlaWdodHMiKSkgdGVzdF9nZXRXZWlnaHRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X3NldE1heGltaXplZENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXZWlnaHRzJEkiKSkgdGVzdF9zZXRXZWlnaHRzJEkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM2NGJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TY3JvbGxlZENvbXBvc2l0ZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBbHdheXNTaG93U2Nyb2xsQmFycyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRPcmlnaW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE9yaWdpbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2xheW91dFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1ooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEFsd2F5c1Nob3dTY3JvbGxCYXJzWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEV4cGFuZEhvcml6b250YWxaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kVmVydGljYWxaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFeHBhbmRWZXJ0aWNhbFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluSGVpZ2h0SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluSGVpZ2h0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pblNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluU2l6ZUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluV2lkdGhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRNaW5XaWR0aEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmlnaW5JSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0T3JpZ2luSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRPcmlnaW5Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1Njcm9sbGVkQ29tcG9zaXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbHdheXNTaG93U2Nyb2xsQmFycyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T3JpZ2luIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sYXlvdXRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbHdheXNTaG93U2Nyb2xsQmFyc1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluSGVpZ2h0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluV2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmlnaW5JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbHdheXNTaG93U2Nyb2xsQmFycyIpKSB0ZXN0X2dldEFsd2F5c1Nob3dTY3JvbGxCYXJzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250ZW50IikpIHRlc3RfZ2V0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0T3JpZ2luIikpIHRlc3RfZ2V0T3JpZ2luKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaIikpIHRlc3Rfc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnNaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZEhvcml6b250YWxaIikpIHRlc3Rfc2V0RXhwYW5kSG9yaXpvbnRhbFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWiIpKSB0ZXN0X3NldEV4cGFuZFZlcnRpY2FsWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbkhlaWdodEkiKSkgdGVzdF9zZXRNaW5IZWlnaHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5TaXplSUkiKSkgdGVzdF9zZXRNaW5TaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pblNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TWluU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbldpZHRoSSIpKSB0ZXN0X3NldE1pbldpZHRoSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZ2luSUkiKSkgdGVzdF9zZXRPcmlnaW5JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZ2luTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldE9yaWdpbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdGFja0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWYwZDRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdGFja0xheW91dAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0YWNrTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDYwNDU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2UKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCWZpbmFsIHN0YXRpYyBSR0IgUkVEID0gbmV3IFJHQigyNTUsMCwwKTsKLQlmaW5hbCBzdGF0aWMgUkdCIEJMVUUgPSBuZXcgUkdCKDAsMCwyNTUpOwotCWZpbmFsIHN0YXRpYyBSR0IgR1JFRU4gPSBuZXcgUkdCKDAsMjU1LDApOwotCUhhc2h0YWJsZSBjb2xvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotcHJpdmF0ZSBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7Ci0JcmV0dXJuIChDb2xvciljb2xvcnMuZ2V0KHJnYik7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29sb3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCWNvbG9ycy5wdXQoUkVELCBuZXcgQ29sb3IgKGRpc3BsYXksIFJFRCkpOwotCWNvbG9ycy5wdXQoR1JFRU4sIG5ldyBDb2xvciAoZGlzcGxheSwgR1JFRU4pKTsKLQljb2xvcnMucHV0KEJMVUUsIG5ldyBDb2xvciAoZGlzcGxheSwgQkxVRSkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlpbml0aWFsaXplQ29sb3JzKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCUVudW1lcmF0aW9uIGVsZW1lbnRzID0gY29sb3JzLmtleXMoKTsKLQl3aGlsZSAoZWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJQ29sb3IgY29sb3IgPSAoQ29sb3IpY29sb3JzLmdldChlbGVtZW50cy5uZXh0RWxlbWVudCgpKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgpOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2Uuc3RhcnQgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5sZW5ndGggPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID09IG51bGwpOwotCWFzc2VydFRydWUoIjphOiIsIHN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZVJhbmdlLmZvbnRTdHlsZSA9PSBTV1QuTk9STUFMKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLnN0YXJ0ID09IDUpOwotCWFzc2VydFRydWUoIjpiOiIsIHN0eWxlUmFuZ2UubGVuZ3RoID09IDEwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLmZvcmVncm91bmQgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVSYW5nZS5iYWNrZ3JvdW5kID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzdHlsZVJhbmdlLmZvbnRTdHlsZSA9PSBTV1QuTk9STUFMKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JJKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2Uuc3RhcnQgPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVSYW5nZS5sZW5ndGggPT0gMTApOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2UuZm9yZWdyb3VuZCA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBzdHlsZVJhbmdlLmJhY2tncm91bmQgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjpjOiIsIHN0eWxlUmFuZ2UuZm9udFN0eWxlID09IFNXVC5CT0xEKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9uZSgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIG51bGwsIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VCID0gKFN0eWxlUmFuZ2Upc3R5bGVSYW5nZUEuY2xvbmUoKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCBzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VBID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQiA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUMgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgZ2V0Q29sb3IoQkxVRSksIGdldENvbG9yKEJMVUUpLCBTV1QuQk9MRCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRCA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUUgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMSwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VGID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTEsIGdldENvbG9yKFJFRCksIGdldENvbG9yKFJFRCksIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VHID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTEsIGdldENvbG9yKFJFRCksIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCFzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUMpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCFzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUQpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCFzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUUpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCFzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUYpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCFzdHlsZVJhbmdlQS5lcXVhbHMoc3R5bGVSYW5nZUcpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQlDb2xvciB0ZXN0Q29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCksIDAsIDAsIDApOwotCQotCS8vcmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMzA5MjQKLQlzZXQuYWRkKG5ldyBTdHlsZVJhbmdlKCkpOwotCXNldC5hZGQobmV3IFN0eWxlUmFuZ2UoMCwgMSwgdGVzdENvbG9yLCBudWxsKSk7Ci0Jc2V0LmFkZChuZXcgU3R5bGVSYW5nZSgwLCAxLCB0ZXN0Q29sb3IsIHRlc3RDb2xvcikpOwotCXNldC5hZGQobmV3IFN0eWxlUmFuZ2UoMCwgMSwgdGVzdENvbG9yLCB0ZXN0Q29sb3IsIFNXVC5CT0xEKSk7Ci0JdGVzdENvbG9yLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Vuc3R5bGVkKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUEgPSBuZXcgU3R5bGVSYW5nZSg1LCAxMCwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQiA9IG5ldyBTdHlsZVJhbmdlKDUsIDEwLCBnZXRDb2xvcihSRUQpLCBudWxsLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VDID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIG51bGwsIG51bGwsIFNXVC5CT0xEKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VEID0gbmV3IFN0eWxlUmFuZ2UoNiwgMTAsIG51bGwsIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2VFID0gbmV3IFN0eWxlUmFuZ2UoNSwgMTAsIG51bGwsIG51bGwpOwotCWFzc2VydFRydWUoIjplOiIsIHN0eWxlUmFuZ2VBLmlzVW5zdHlsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwhc3R5bGVSYW5nZUIuaXNVbnN0eWxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCFzdHlsZVJhbmdlQy5pc1Vuc3R5bGVkKCkpOwotCWFzc2VydFRydWUoIjplOiIsIXN0eWxlUmFuZ2VELmlzVW5zdHlsZWQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc3R5bGVSYW5nZUUuaXNVbnN0eWxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaW1pbGFyVG9Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUEgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUIgPSBuZXcgU3R5bGVSYW5nZSg1LCA1LCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlQyA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRCA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBnZXRDb2xvcihCTFVFKSwgZ2V0Q29sb3IoQkxVRSksIFNXVC5OT1JNQUwpOwotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZUUgPSBuZXcgU3R5bGVSYW5nZSg2LCAxMCwgZ2V0Q29sb3IoUkVEKSwgZ2V0Q29sb3IoUkVEKSwgU1dULk5PUk1BTCk7Ci0JU3R5bGVSYW5nZSBzdHlsZVJhbmdlRiA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBnZXRDb2xvcihSRUQpLCBnZXRDb2xvcihCTFVFKSwgU1dULkJPTEQpOwotCWFzc2VydFRydWUoIjpmOiIsIHN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlQikpOwotCWFzc2VydFRydWUoIjpmOiIsIHN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlQykpOwotCWFzc2VydFRydWUoIjpmOiIsICFzdHlsZVJhbmdlQS5zaW1pbGFyVG8oc3R5bGVSYW5nZUQpKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCAhc3R5bGVSYW5nZUEuc2ltaWxhclRvKHN0eWxlUmFuZ2VFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgIXN0eWxlUmFuZ2VBLnNpbWlsYXJUbyhzdHlsZVJhbmdlRikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKDYsIDEwLCBudWxsLCBnZXRDb2xvcihCTFVFKSwgU1dULk5PUk1BTCk7Ci0Jc3R5bGVSYW5nZS50b1N0cmluZygpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9uZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Vuc3R5bGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaW1pbGFyVG9Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9uZSIpKSB0ZXN0X2Nsb25lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Vuc3R5bGVkIikpIHRlc3RfaXNVbnN0eWxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2ltaWxhclRvTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSIpKSB0ZXN0X3NpbWlsYXJUb0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZTZhMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQmlkaVV0aWw7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotU3R5bGVkVGV4dCB0ZXh0OwotZmluYWwgc3RhdGljIFJHQiBSRUQgPSBuZXcgUkdCKDI1NSwwLDApOwotZmluYWwgc3RhdGljIFJHQiBCTFVFID0gbmV3IFJHQigwLDAsMjU1KTsKLWZpbmFsIHN0YXRpYyBSR0IgR1JFRU4gPSBuZXcgUkdCKDAsMjU1LDApOwotZmluYWwgc3RhdGljIFJHQiBZRUxMT1cgPSBuZXcgUkdCKDI1NSwyNTUsMCk7Ci1maW5hbCBzdGF0aWMgUkdCIENZQU4gPSBuZXcgUkdCKDAsMjU1LDI1NSk7Ci1maW5hbCBzdGF0aWMgUkdCIFBVUlBMRSA9IG5ldyBSR0IoMjU1LDAsMjU1KTsKLWZpbmFsIHN0YXRpYyBTdHJpbmcgUExBVEZPUk1fTElORV9ERUxJTUlURVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci1IYXNodGFibGUgY29sb3JzID0gbmV3IEhhc2h0YWJsZSgpOwotcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyQ2FsbGVkOwkKLXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lcjJDYWxsZWQ7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JaW5pdGlhbGl6ZUNvbG9ycygpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JRW51bWVyYXRpb24gZWxlbWVudHMgPSBjb2xvcnMua2V5cygpOwotCXdoaWxlIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlDb2xvciBjb2xvciA9IChDb2xvciljb2xvcnMuZ2V0KChSR0IpZWxlbWVudHMubmV4dEVsZW1lbnQoKSk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0Jc3VwZXIudGVhckRvd24oKTsKLQkKLX0KLQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgU3R5bGVSYW5nZVtdIGRlZmF1bHRTdHlsZXMoKSB7Ci0JcmV0dXJuIG5ldyBTdHlsZVJhbmdlW10gewotCQlnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCWdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSl9OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByb3RlY3RlZCB2b2lkIGdldExpbmVCYWNrZ3JvdW5kcygpIHsKLQlmb3IgKGludCBpPTA7IGk8dGV4dC5nZXRMaW5lQ291bnQoKTsgaSsrKSB7Ci0JCXRleHQuZ2V0TGluZUJhY2tncm91bmQoaSk7Ci0JfQotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgU3RyaW5nIHRleHRTdHJpbmcoKSB7Ci0JcmV0dXJuICJUaGlzIGlzIHRoZSB0ZXh0IGNvbXBvbmVudCBpbiB0ZXN0aW5nXG5OZXcgTGluZTFcbk5ldyBMaW5lMlxuTmV3IExpbmUzXG5OZXcgTGluZTQuIjsKLX0KLXByaXZhdGUgYm9vbGVhbiBpc0JpZGkoKSB7Ci0JcmV0dXJuIEJpZGlVdGlsLmlzQmlkaVBsYXRmb3JtKCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBwdWJsaWMgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBTdHlsZVJhbmdlIGdldFN0eWxlKGludCBzdGFydCwgaW50IGxlbmd0aCwgUkdCIGZnLCBSR0IgYmcpIHsKLQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQlzdHlsZS5zdGFydCA9IHN0YXJ0OwotCXN0eWxlLmxlbmd0aCA9IGxlbmd0aDsKLQlpZiAoZmcgIT0gbnVsbCkgc3R5bGUuZm9yZWdyb3VuZCA9IGdldENvbG9yKGZnKTsKLQllbHNlIHN0eWxlLmZvcmVncm91bmQgPSBudWxsOwotCWlmIChiZyAhPSBudWxsKSBzdHlsZS5iYWNrZ3JvdW5kID0gZ2V0Q29sb3IoYmcpOwotCWVsc2Ugc3R5bGUuYmFja2dyb3VuZCA9IG51bGw7Ci0JcmV0dXJuIHN0eWxlOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgQ29sb3IgZ2V0Q29sb3IoUkdCIHJnYikgewotCXJldHVybiAoQ29sb3IpY29sb3JzLmdldChyZ2IpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBub3QgYmUgcHVibGljIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JY29sb3JzLnB1dChSRUQsIG5ldyBDb2xvciAoZGlzcGxheSwgUkVEKSk7Ci0JY29sb3JzLnB1dChCTFVFLCBuZXcgQ29sb3IgKGRpc3BsYXksIEJMVUUpKTsKLQljb2xvcnMucHV0KEdSRUVOLCBuZXcgQ29sb3IgKGRpc3BsYXksIEdSRUVOKSk7Ci0JY29sb3JzLnB1dChZRUxMT1csIG5ldyBDb2xvciAoZGlzcGxheSwgWUVMTE9XKSk7Ci0JY29sb3JzLnB1dChDWUFOLCBuZXcgQ29sb3IgKGRpc3BsYXksIENZQU4pKTsKLQljb2xvcnMucHV0KFBVUlBMRSwgbmV3IENvbG9yIChkaXNwbGF5LCBQVVJQTEUpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCl7Ci0JU3R5bGVkVGV4dCB0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5SRUFEX09OTFkpOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5kaXNwb3NlKCk7Ci0KLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VmVydGljYWxCYXIoKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEhvcml6b250YWxCYXIoKSA9PSBudWxsKTsKLQl0ZXh0LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQlmaW5hbCBTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlFeHRlbmRlZE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoRXh0ZW5kZWRNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUubGVuZ3RoKCksIGV2ZW50Lmxlbmd0aCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkV4dGVuZGVkTW9kaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsICIiLCBldmVudC5yZXBsYWNlZFRleHQpOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIG1ldGhvZHMgc2VuZCBhbiBFeHRlbmRlZE1vZGlmeSBldmVudAotCXRleHQuYWRkRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuYXBwZW5kKGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJhcHBlbmQgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLmxlbmd0aCgpLCBldmVudC5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLnN1YnN0cmluZygwLCAxKSwgZXZlbnQucmVwbGFjZWRUZXh0KTsKLQkJfQotCX07Ci0JdGV4dC5hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgbGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlsaXN0ZW5lciA9IG5ldyBFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KEV4dGVuZGVkTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiRXh0ZW5kZWRNb2RpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLmxlbmd0aCgpLCBldmVudC5sZW5ndGgpOwotCQkJYXNzZXJ0RXF1YWxzKCJFeHRlbmRlZE1vZGlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lICsgbGluZS5zdWJzdHJpbmcoMSwgbGluZS5sZW5ndGgoKSkgKyBsaW5lLCBldmVudC5yZXBsYWNlZFRleHQpOwotCQl9Ci0JfTsKLQl0ZXh0LmFkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEtleUJpbmRpbmdJSSgpewotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMLCBTV1QuTlVMTCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwpID09IFNXVC5OVUxMKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCwgU1QuTElORV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwpID09IFNULkxJTkVfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlNFTEVDVF9QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyKSA9PSBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMiwgU1QuUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuUEFHRV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKC0xLCBTVC5QQUdFX1VQKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoLTEsIC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlCaWRpU2VnbWVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEJpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTZWdtZW50cyhCaWRpU2VnbWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkQmlkaVNlZ21lbnRMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuYWRkQmlkaVNlZ21lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBCaWRpU2VnbWVudExpc3RlbmVyLiAKLQl0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoMCk7Ci0JaWYgKGlzQmlkaSgpIHx8IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygiZ3RrIikpIHsKLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGNhbGxlZCB3aGVuIGl0IHNob3VsZG4ndCBiZSIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIEJpZGlTZWdtZW50TGlzdGVuZXIuIAotCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgcmVtb3ZlZCIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlMaW5lQmFja2dyb3VuZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpbmVCYWNrZ3JvdW5kTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRCYWNrZ3JvdW5kKExpbmVCYWNrZ3JvdW5kRXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJdGV4dC5hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JdGV4dC5hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFNlbGVjdGlvbigwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgY2FsbGVkIiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JdGV4dC5yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JTGluZVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGluZVN0eWxlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZExpbmVTdHlsZUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JdGV4dC5hZGRMaW5lU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JLy8gY2F1c2UgU3R5bGVkVGV4dCB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3Qgd2hldGhlciBhbGwgY29udGVudCBtb2RpZnlpbmcgQVBJIG1ldGhvZHMgc2VuZCBhIE1vZGlmeSBldmVudAkKLQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5hcHBlbmQobGluZSk7CQotCWFzc2VydFRydWUoImFwcGVuZCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0Lmluc2VydChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgbGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lcjJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCQkKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbGlzdGVuZXIyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX0VORCk7Ci0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBjYWxsZWQgdW5leHBlY3RlZGx5IiwgbGlzdGVuZXIyQ2FsbGVkID09IGZhbHNlKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCWxpc3RlbmVyMkNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9FTkQpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCWFzc2VydFRydWUoIkxpc3RlbmVyIGNhbGxlZCB1bmV4cGVjdGVkbHkiLCBsaXN0ZW5lcjJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlWZXJpZnlLZXlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWZXJpZnlLZXlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5S2V5KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCXRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0KLQkvLyBvbmx5IHRlc3Qgd2hldGhlciBsaXN0ZW5lciBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQuCi0JLy8gY2FuJ3QgdGVzdCBsaXN0ZW5lciBiZWNhdXNlIFZlcmlmeUtleSBpcyB1c2VyIGRyaXZlbi4KLQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyKCkgewotCWZpbmFsIFN0cmluZyBsaW5lID0gIkxpbmUxIjsKLQlmaW5hbCBTdHJpbmcgbmV3TGluZSA9ICJOZXdMaW5lMSI7Ci0JZmluYWwgaW50IHRleHRMZW5ndGg7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlWZXJpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWZXJpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuc3RhcnQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgMCwgZXZlbnQuZW5kKTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIGxpbmUsIGV2ZW50LnRleHQpOwotCQkJZXZlbnQuc3RhcnQgPSAyOwotCQkJZXZlbnQuZW5kID0gNTsKLQkJCWV2ZW50LnRleHQgPSBuZXdMaW5lOwotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgc2VuZHMgYSBWZXJpZnkgZXZlbnQKLQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5hcHBlbmQobGluZSk7CQotCWFzc2VydFRydWUoImFwcGVuZCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQl0ZXh0Lmluc2VydChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgicmVwbGFjZVRleHRSYW5nZSBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSArIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDEsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnN0YXJ0ID0gMjsKLQkJCWV2ZW50LmVuZCA9IDU7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07Ci0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dExlbmd0aCA9IHRleHQuZ2V0Q2hhckNvdW50KCkgLSAxICsgbmV3TGluZS5sZW5ndGgoKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMSwgbGluZSk7CQotCWFzc2VydFRydWUoInJlcGxhY2VUZXh0UmFuZ2UgZG9lcyBub3Qgc2VuZCBldmVudCIsIGxpc3RlbmVyQ2FsbGVkKTsKLQlhc3NlcnRFcXVhbHMoIkxpc3RlbmVyIGZhaWxlZCIsIG5ld0xpbmUgKyBuZXdMaW5lLnN1YnN0cmluZygxLCBuZXdMaW5lLmxlbmd0aCgpKSArIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIHRleHRMZW5ndGgsIGV2ZW50LmVuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBsaW5lLCBldmVudC50ZXh0KTsKLQkJCWV2ZW50LnN0YXJ0ID0gMjsKLQkJCWV2ZW50LmVuZCA9IDU7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07Ci0JdGV4dC5hZGRWZXJpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KGxpbmUpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAyLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCBuZXdMaW5lLmxlbmd0aCgpLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCX0KLQl9OwotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQucmVwbGFjZVRleHRSYW5nZSgyLCB0ZXh0LmdldENoYXJDb3VudCgpIC0gMiwgbGluZSk7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaXN0ZW5lciBmYWlsZWQiLCBuZXdMaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSBTdHlsZWRUZXh0IHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQl0ZXh0LnNldFRleHQobGluZSk7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwkKLQlTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JCi0JdGV4dC5hcHBlbmQobGluZSk7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgdG8gZW1wdHkgdGV4dCIsIGxpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LmFwcGVuZChudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiYXBwZW5kIG51bGwgc3RyaW5nIiwgZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuYXBwZW5kKCIiKTsKLQlhc3NlcnRFcXVhbHMoImFwcGVuZCBlbXB0eSBzdHJpbmciLCBsaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JdGV4dC5hcHBlbmQobGluZSk7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgbm9uLWVtcHR5IHN0cmluZyIsIGxpbmUgKyBsaW5lLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQlTdHJpbmcgdGV4dDIgPSAibGluZVxyIjsKLQl0ZXh0LmFwcGVuZCh0ZXh0Mik7Ci0JYXNzZXJ0RXF1YWxzKCJhcHBlbmQgc3RyaW5nIGVuZGluZyB3aXRoIGxpbmUgZGVsaW1pdGVyIiwgdGV4dDIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQlTdHJpbmcgdGV4dDMgPSAibGluZVxyXG5saW5lMyI7Ci0JdGV4dC5hcHBlbmQodGV4dDMpOwotCWFzc2VydEVxdWFscygiYXBwZW5kIG11bHRpIGxpbmUgc3RyaW5nIiwgdGV4dDIgKyB0ZXh0MywgdGV4dC5nZXRUZXh0KCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBpbmhlcml0ZWQgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29weSgpIHsKLQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZCh0ZXh0LmdldERpc3BsYXkoKSk7Ci0JVGV4dFRyYW5zZmVyIHRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JU3RyaW5nIGNsaXBib2FyZFRleHQ7Ci0JU3RyaW5nIGNvbnZlcnRlZFRleHQ7Ci0KLQlTdHJpbmcgYmVmb3JlID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuY29weSgpOwkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBiZWZvcmUgPT0gbnVsbCA/IGNsaXBib2FyZFRleHQgPT0gbnVsbCA6IGJlZm9yZS5lcXVhbHMoY2xpcGJvYXJkVGV4dCkpOwotCQotCWJlZm9yZSA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmNvcHkoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgYmVmb3JlID09IG51bGwgPyBjbGlwYm9hcmRUZXh0ID09IG51bGwgOiBiZWZvcmUuZXF1YWxzKGNsaXBib2FyZFRleHQpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMSk7Ci0JdGV4dC5jb3B5KCk7CQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjpkOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscygiMCIpKTsKLQkKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDEsIDIpOwkKLQl0ZXh0LmNvcHkoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWFzc2VydFRydWUoIjplOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscygiMTIiKSk7Ci0JCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JdGV4dC5zZXRUZXh0KCJcckxpbmUxXG5MaW5lMlxyXG5MaW5lM1xuXHJMaW5lNFxuIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJcclxuTGluZTFcclxuTGluZTJcclxuTGluZTNcclxuXHJcbkxpbmU0XHJcbiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxuTGluZTFcbkxpbmUyXG5MaW5lM1xuXG5MaW5lNFxuIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQkKLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQl0ZXh0LnNldFRleHQoIkxpbmUxXHJcbkxpbmUyIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmNvcHkoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjpnOiIsIGNsaXBib2FyZFRleHQgIT0gbnVsbCAmJiBjbGlwYm9hcmRUZXh0LmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0KLQl0ZXN0UnRmQ29weSgpOwotCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3V0KCkgewotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlUZXh0VHJhbnNmZXIgdHJhbnNmZXIgPSBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY2xpcGJvYXJkVGV4dDsKLQlTdHJpbmcgY29udmVydGVkVGV4dDsKLQotCVN0cmluZyBiZWZvcmUgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jdXQoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgYmVmb3JlID09IG51bGwgPyBjbGlwYm9hcmRUZXh0ID09IG51bGwgOiBiZWZvcmUuZXF1YWxzKGNsaXBib2FyZFRleHQpKTsKLQkKLQliZWZvcmUgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7Ci0JdGV4dC5jdXQoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgYmVmb3JlID09IG51bGwgPyBjbGlwYm9hcmRUZXh0ID09IG51bGwgOiBiZWZvcmUuZXF1YWxzKGNsaXBib2FyZFRleHQpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMSk7Ci0JdGV4dC5jdXQoKTsJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKCIwIikpOwotCQotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMSwgMik7CQotCXRleHQuY3V0KCk7CQkKLQljbGlwYm9hcmRUZXh0ID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKHRyYW5zZmVyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjbGlwYm9hcmRUZXh0ICE9IG51bGwgJiYgY2xpcGJvYXJkVGV4dC5lcXVhbHMoIjIzIikpOwotCQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCXRleHQuc2V0VGV4dCgiXHJMaW5lMVxuTGluZTJcclxuTGluZTNcblxyTGluZTRcbiIpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5jdXQoKTsJCQotCWNsaXBib2FyZFRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHModHJhbnNmZXIpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJcclxuTGluZTFcclxuTGluZTJcclxuTGluZTNcclxuXHJcbkxpbmU0XHJcbiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxuTGluZTFcbkxpbmUyXG5MaW5lM1xuXG5MaW5lNFxuIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQkKLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQl0ZXh0LnNldFRleHQoIkxpbmUxXHJcbkxpbmUyIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LmN1dCgpOwkJCi0JY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyh0cmFuc2Zlcik7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcbkxpbmUyIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgY2xpcGJvYXJkVGV4dCAhPSBudWxsICYmIGNsaXBib2FyZFRleHQuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQotCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmlkaUNvbG9yaW5nKCkgewotCS8vLyBnZXRCaWRpQ29sb3JpbmcgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCaWRpQ29sb3Jpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDYXJldE9mZnNldCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0KLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCwgIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCVN0cmluZyBuZXdUZXh0ID0gIkxpbmUtMVxyXG4iOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0KLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDEpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAxKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDEpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gbmV3VGV4dC5sZW5ndGgoKSArIDEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHRleHQuZ2V0Q29udGVudCgpOwotCQotCWFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsKLQljb250ZW50ID0gbmV3IFN0eWxlZFRleHRDb250ZW50KCkgewotCQlwdWJsaWMgdm9pZCBhZGRUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0QXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAwOwotCQl9CQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQl9OwotCXRleHQuc2V0Q29udGVudChjb250ZW50KTsKLQlhc3NlcnRFcXVhbHMoY29udGVudCwgdGV4dC5nZXRDb250ZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVkaXRhYmxlKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwkKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA+IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDEpOwotCS8vIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGNhbiBiZSBzY3JvbGxlZAotCXNoZWxsLm9wZW4oKTsKLQl0ZXh0LnNldFNpemUoMTAsIDUwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpqOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7CQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwoKSB7CQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwkKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID4gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLQkvLyBtYWtlIHN1cmUgdGhlIHdpZGdldCBjYW4gYmUgc2Nyb2xsZWQKLQlzaGVsbC5vcGVuKCk7Ci0JdGV4dC5zZXRTaXplKDEwLCA1MCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMCIpOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5QmluZGluZ0koKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwpID09IFNULkRFTEVURV9ORVhUKTsKLQl0ZXh0LnNldEtleUJpbmRpbmcoU1dULkRFTCwgU1QuTElORV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwpID09IFNULkxJTkVfVVApOwotCXRleHQuc2V0S2V5QmluZGluZyhTV1QuREVMIHwgU1dULk1PRDIsIFNULlNFTEVDVF9QQUdFX1VQKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldEtleUJpbmRpbmcoU1dULkRFTCB8IFNXVC5NT0QyKSA9PSBTVC5TRUxFQ1RfUEFHRV9VUCk7Ci0JdGV4dC5zZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMiwgU1QuUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5ERUwgfCBTV1QuTU9EMikgPT0gU1QuUEFHRV9VUCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKC0xKSA9PSBTV1QuTlVMTCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRLZXlCaW5kaW5nKFNXVC5GMikgPT0gU1dULk5VTEwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoYXJDb3VudCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDUpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXG4iKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDYpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVCYWNrZ3JvdW5kSSgpIHsKLQlTdHJpbmcgdGV4dFN0cmluZyA9ICJMMVxuTDJcbkwzXG5MNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUNvdW50KCkgewotCVN0cmluZyBkZWxpbWl0ZXJTdHJpbmcgPSAiXHJcbiI7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09MSk7Ci0JdGV4dC5hcHBlbmQoImRkZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTIpOwotCXRleHQuYXBwZW5kKCJkZGFzZGFzZGFzZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTMpOwotCi0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lQ291bnQoKT09MSk7Ci0JdGV4dC5pbnNlcnQoZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0yKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lQXRPZmZzZXRJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRMaW5lQXRPZmZzZXQoLTEpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRyeSB7Ci0JCXRleHQuZ2V0TGluZUF0T2Zmc2V0KDEwMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YzoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRMaW5lQXRPZmZzZXQoNCkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRMaW5lQXRPZmZzZXQoNSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRMaW5lQXRPZmZzZXQoNikgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRMaW5lQXRPZmZzZXQoNykgPT0gMSk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRMaW5lQXRPZmZzZXQoOCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6aDoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZURlbGltaXRlcigpIHsKLQlmaW5hbCBTdHJpbmcgbGluZURlbGltaXRlciA9ICJcbiI7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHRleHQuZ2V0Q29udGVudCgpOwotCQotCWFzc2VydEVxdWFscyhjb250ZW50LmdldExpbmVEZWxpbWl0ZXIoKSwgdGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkpOwotCi0JY29udGVudCA9IG5ldyBTdHlsZWRUZXh0Q29udGVudCgpIHsKLQkJcHVibGljIHZvaWQgYWRkVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0QXRMaW5lKGludCBsaW5lSW5kZXgpIHsKLQkJCXJldHVybiAwOwotCQl9CQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQl9OwotCXRleHQuc2V0Q29udGVudChjb250ZW50KTsKLQlhc3NlcnRFcXVhbHMobGluZURlbGltaXRlciwgdGV4dC5nZXRMaW5lRGVsaW1pdGVyKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVIZWlnaHQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSW5kZXggKCkgewotCXRlc3RfZ2V0TGluZUluZGV4KHRleHQpOwotCVN0eWxlZFRleHQgdGV4dDIgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULldSQVApOwotCXRlc3RfZ2V0TGluZUluZGV4KHRleHQyKTsKLQl0ZXh0Mi5kaXNwb3NlKCk7Ci19Ci0KLXZvaWQgdGVzdF9nZXRMaW5lSW5kZXggKFN0eWxlZFRleHQgdGV4dCkgewotCWludCBsaW5lSGVpZ2h0ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxuTGluZTFcbkxpbmUyIik7Ci0JdGV4dC5zZXRTaXplKDQwMCwgbGluZUhlaWdodCAqIDMpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCAvIDIpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0ICsgbGluZUhlaWdodCAvIDIpKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQgLSAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDIgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDIgKiBsaW5lSGVpZ2h0ICsgbGluZUhlaWdodCAvIDIpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMyAqIGxpbmVIZWlnaHQgLSAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDMgKiBsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDEwICogbGluZUhlaWdodCkpOwotCQotCXRleHQuc2V0U2l6ZSg0MDAsIGxpbmVIZWlnaHQpOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xMCAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLWxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLWxpbmVIZWlnaHQgLyAyKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KDApKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgxMCAqIGxpbmVIZWlnaHQpKTsKLQotCi0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEwICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMiAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLWxpbmVIZWlnaHQgLSAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KC1saW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRleHQuZ2V0TGluZUluZGV4KDApKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgobGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgxMCAqIGxpbmVIZWlnaHQpKTsKLQkKLQotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JdGV4dC5zZXRTaXplKDQwMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoLTEpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0IC0gMSkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleChsaW5lSGVpZ2h0KSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleCgyICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMiAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMikpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgzICogbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMyAqIGxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMTAgKiBsaW5lSGVpZ2h0KSk7Ci0JCi0JdGV4dC5zZXRUb3BQaXhlbCgzICogbGluZUhlaWdodCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0zICogbGluZUhlaWdodCAtMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0zICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgtMiAqIGxpbmVIZWlnaHQgLSAxKSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUluZGV4KC0yICogbGluZUhlaWdodCkpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVJbmRleCgtbGluZUhlaWdodCAtIDEpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoLWxpbmVIZWlnaHQpKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVJbmRleCgxMDApKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKDApOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lSW5kZXgoMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVJbmRleCgxKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZUluZGV4KDEwMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVQaXhlbCAoKSB7Ci0JdGVzdF9nZXRMaW5lUGl4ZWwodGV4dCk7Ci0JU3R5bGVkVGV4dCB0ZXh0MiA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuV1JBUCk7Ci0JdGVzdF9nZXRMaW5lUGl4ZWwodGV4dDIpOwotCXRleHQyLmRpc3Bvc2UoKTsKLX0KLQotdm9pZCB0ZXN0X2dldExpbmVQaXhlbChTdHlsZWRUZXh0IHRleHQpIHsKLQlpbnQgbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTBcbkxpbmUxXG5MaW5lMiIpOwotCXRleHQuc2V0U2l6ZSg0MDAsIGxpbmVIZWlnaHQgKiAzKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoLTEwMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDEpKTsKLQlhc3NlcnRFcXVhbHMoMiAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDIpKTsKLQlhc3NlcnRFcXVhbHMoMyAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDMpKTsKLQlhc3NlcnRFcXVhbHMoMyAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDEwMCkpOwotCQotCXRleHQuc2V0U2l6ZSg0MDAsIDApOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgtMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKDApKTsKLQlhc3NlcnRFcXVhbHMobGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscygyICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMikpOwotCWFzc2VydEVxdWFscygzICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMykpOwotCWFzc2VydEVxdWFscygzICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMTAwKSk7Ci0JCi0JdGV4dC5zZXRTaXplKDQwMCwgbGluZUhlaWdodCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRFcXVhbHMoLWxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKC0xMDApKTsKLQlhc3NlcnRFcXVhbHMoLWxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDApKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoMSkpOwotCWFzc2VydEVxdWFscyhsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgyKSk7Ci0JYXNzZXJ0RXF1YWxzKDIgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgzKSk7Ci0JYXNzZXJ0RXF1YWxzKDIgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgxMDApKTsKLQotCXRleHQuc2V0U2l6ZSg0MDAsIDApOyAKLQl0ZXh0LnNldFRvcFBpeGVsKDMgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRFcXVhbHMoLTMgKiBsaW5lSGVpZ2h0LCB0ZXh0LmdldExpbmVQaXhlbCgtMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKC0zICogbGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMCkpOwotCWFzc2VydEVxdWFscygtMiAqIGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDEpKTsKLQlhc3NlcnRFcXVhbHMoLWxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDIpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRMaW5lUGl4ZWwoMykpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgxMDApKTsKLQkKLQl0ZXh0LnNldFRvcFBpeGVsKDApOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0TGluZVBpeGVsKC0xMCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldExpbmVQaXhlbCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKGxpbmVIZWlnaHQsIHRleHQuZ2V0TGluZVBpeGVsKDEpKTsKLQlhc3NlcnRFcXVhbHMobGluZUhlaWdodCwgdGV4dC5nZXRMaW5lUGl4ZWwoMTApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhdGlvbkF0T2Zmc2V0SSgpewotCS8vIGNvcHkgZnJvbSBTdHlsZWRUZXh0LCBoYXMgdG8gbWF0Y2ggdmFsdWUgdXNlZCBieSBTdHlsZWRUZXh0Ci0JZmluYWwgaW50IFhJTlNFVCA9IGlzQmlkaSgpID8gMiA6IDA7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLmVxdWFscyhuZXcgUG9pbnQoWElOU0VULCAwKSkpOwotCXRyeSB7Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG9mZnNldCA9PSAtMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgb2Zmc2V0IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUxIik7CQotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg0KS54ID4gMCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNCkueSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNikueCA+IDAgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDYpLnkgPT0gMCk7Ci0JLy8geCBsb2NhdGlvbiB3aWxsID09IFN0eWxlZFRleHQgeCBpbnNldCBvbiBiaWRpIHBsYXRmb3JtcwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS54ID09IFhJTlNFVCAmJiB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueSA+IDApOwotCXRyeSB7Ci0JCXRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgxMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgb2Zmc2V0IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDQpLnggPiAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg0KS55IDwgMCk7Ci0JLy8geCBsb2NhdGlvbiB3aWxsID09IFN0eWxlZFRleHQgeCBpbnNldCBvbiBiaWRpIHBsYXRmb3JtcwkKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNykueCA9PSBYSU5TRVQgJiYgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnkgPT0gMCk7Ci0JCi0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLnggPCAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS55IDwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDcpLnggPCAwICYmIHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg3KS55ID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCB0ZXh0LmdldE9mZnNldEF0TGluZSgwKSk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExpbmUoLTEpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TGluZSgxMDApOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwkKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHRleHQuZ2V0T2Zmc2V0QXRMaW5lKDApKTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIDcsIHRleHQuZ2V0T2Zmc2V0QXRMaW5lKDEpKTsKLQotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMaW5lKDIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQotCXRleHQuc2V0VGV4dCgiIik7CQotCWFzc2VydEVxdWFscygiOmc6IiwgMCwgdGV4dC5nZXRPZmZzZXRBdExpbmUoMCkpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRPZmZzZXRBdExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVBvaW50IGxvY2F0aW9uOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpID09IDApOwotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoLTEsIDApKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpiOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0cnkgewotCQl0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDAsIC0xKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YzoiLCBleGNlcHRpb25UaHJvd24gPT0gdHJ1ZSk7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMSIpOwkKLQlsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCg1KTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDEwLCAwKSkgPiAwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KGxvY2F0aW9uLnggLSAxLCAwKSkgPT0gNCk7Ci0JbG9jYXRpb24gPSB0ZXh0LmdldExvY2F0aW9uQXRPZmZzZXQoNyk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihsb2NhdGlvbikgPT0gNyk7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgxMDAsIDApKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpnOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQotCXRyeSB7Ci0JCXRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoMTAwLCA1MCkpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgZXhjZXB0aW9uVGhyb3duID09IHRydWUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCi0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KDAsIC01KSkgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmo6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgwLCAwKSkgPT0gNyk7Ci0JCi0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOms6IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludCgtNSwgLTUpKSA9PSAwKTsKLQlhc3NlcnRUcnVlKCI6bDoiLCB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KC01LCAwKSkgPT0gNyk7Ci0KLQkvLyAxR0w0WlZFCi0JYXNzZXJ0VHJ1ZSgiOm06IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgyKSkgPT0gMik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOm46IiwgdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgyKSkgPT0gMik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE9yaWVudGF0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCl7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAyKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDIpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDIsIDMpKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMTEpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMywgMTEpKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCg0LCA0KSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDExKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAyKSk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAzKSkpOwkKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpIHsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldFNlbGVjdGlvbkJhY2tncm91bmQoKSAhPSBudWxsKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkJhY2tncm91bmQoZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCkgPT0gIGdldENvbG9yKFlFTExPVykpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCkgewotCWFzc2VydFRydWUoIjoxOiIsIHRleHQuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpICE9IG51bGwpOwotCXRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKSA9PSAgZ2V0Q29sb3IoUkVEKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvblJhbmdlKCkgewotCVN0cmluZyB0ZXN0VGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JaW50IGludmFsaWRSYW5nZXMgW11bXSA9IHt7LTEsIDB9LCB7LTEsIC0xfSwgezEwMCwgMX0sIHsxMDAsIC0xfSwgezEyLCAxfSwgezExLCAyfSwgezIsIC0zfSwgezUwLCAtMX19OwotCWludCBzZWxlY3Rpb25SYW5nZXMgW11bXSA9IHt7MCwgMX0sIHswLCAwfSwgezIsIDN9LCB7MTIsIDB9LCB7MiwgLTJ9LCB7NSwgLTF9fTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLQkKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IDAgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvblJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBzZWxlY3Rpb25SYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBzZWxlY3Rpb25SYW5nZXNbaV1bMV07Ci0JCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0JCWlmIChsZW5ndGggPCAwKSB7Ci0JCQlzdGFydCArPSBsZW5ndGg7Ci0JCQlsZW5ndGggKj0gLTE7Ci0JCQlhc3NlcnRFcXVhbHMoIjpjOmE6IiArIGksIHN0YXJ0LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzphOiIgKyBpLCBzdGFydCArIGxlbmd0aCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsJCQkKLQkJfQotCQlhc3NlcnRUcnVlKCI6YzoiICsgaSwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gbGVuZ3RoKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCl7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0yKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT05KTsKLQl0ZXh0LnNldFRleHQoIjAxMjNcbjQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTIpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvblRleHQoKSB7Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgc2VsZWN0aW9uUmFuZ2VzIFtdW10gPSB7ezAsIDF9LCB7MCwgMH0sIHsyLCAzfSwgezEyLCAwfX07Ci0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsICIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RUZXh0KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvblJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBzZWxlY3Rpb25SYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBzZWxlY3Rpb25SYW5nZXNbaV1bMV07Ci0JCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiOmM6IiArIGksIHRlc3RUZXh0LnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW5ndGgpLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlUmFuZ2VBdE9mZnNldEkoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBzdHlsZVN0YXJ0ID0gMDsKLQlpbnQgc3R5bGVMZW5ndGggPSA1OwotCWludCBpOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKHN0eWxlU3RhcnQsIHN0eWxlTGVuZ3RoLCBnZXRDb2xvcihCTFVFKSwgZ2V0Q29sb3IoUkVEKSwgU1dULkJPTEQpOwotCi0JdHJ5IHsKLQkJdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJvZmZzZXQgb3V0IG9mIHJhbmdlIG5vIHRleHQiLCBleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5zZXRUZXh0KGxpbmUpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KC0xKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIm9mZnNldCBvdXQgb2YgcmFuZ2UgbmVnYXRpdmUiLCBleGNlcHRpb25UaHJvd24pOwotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQobGluZS5sZW5ndGgoKSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJvZmZzZXQgb3V0IG9mIHJhbmdlIHBvc2l0aXZlIiwgZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQlzdHlsZS5sZW5ndGggPSAxOwotCWZvciAoaSA9IHN0eWxlU3RhcnQ7IGkgPCBzdHlsZVN0YXJ0ICsgc3R5bGVMZW5ndGg7IGkrKykgewotCQlzdHlsZS5zdGFydCA9IGk7Ci0JCWFzc2VydEVxdWFscyhzdHlsZSwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSkpOwotCX0KLQlhc3NlcnRFcXVhbHMobnVsbCwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSkpOwotCQkJCi0JLy8gdGVzdCBvZmZzZXQgYXQgbGluZSBkZWxpbWl0ZXIKLQlzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKDUsIDIsIG51bGwsIGdldENvbG9yKEJMVUUpLCBTV1QuTk9STUFMKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCXN0eWxlLmxlbmd0aCA9IDE7Ci0JYXNzZXJ0RXF1YWxzKHN0eWxlLCB0ZXh0LmdldFN0eWxlUmFuZ2VBdE9mZnNldCg1KSk7Ci0Jc3R5bGUuc3RhcnQgPSA2OwotCWFzc2VydEVxdWFscyhzdHlsZSwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoNikpOwkKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoMTApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZVJhbmdlcygpIHsKLQl0ZXh0LnNldFRleHQoInBhY2thZ2UgdGVzdDtcbi8qIExpbmUgMVxuICogTGluZSAyXG4gKi9cbnB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7XG59Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTQsMjMsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMzgsNixCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDUsNSxCTFVFLG51bGwpKTsKLSAJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDE0LCAyMywgIlx0LypMaW5lIDFcblx0ICogTGluZSAyXG5cdCAqLyIpOwotIAlTdHJpbmcgbmV3VGV4dCA9IHRleHQuZ2V0VGV4dFJhbmdlKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCWFzc2VydFRydWUoIjoxOiIsIG5ld1RleHQuZXF1YWxzKCJwYWNrYWdlIHRlc3Q7XG5cdC8qTGluZSAxXG5cdCAqIExpbmUgMlxuXHQgKi9cbnB1YmxpYyBjbGFzcyBTaW1wbGVDbGFzcyB7XG59IikpOwotCVN0eWxlUmFuZ2VbXSBzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0MCw2LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDQ3LDUsQkxVRSxudWxsKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlUmFuZ2VzSUkoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0vLwkwCi0vLwkgMTIzNAotLy8JIDU2Ci0vLwkgNzgKLS8vCTkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMSw0LEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDIsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNywyLFlFTExPVyxudWxsKSk7Ci0KLQlTdHlsZVJhbmdlW10gc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygwLDEpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygwLDUpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDQsQkxVRSxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoNywzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNywyLFlFTExPVyxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCwxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDEsNCxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg3LDIsWUVMTE9XLG51bGwpKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygwLDQpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxLDMsQkxVRSxudWxsKSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMiw2KTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMiwzLEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDcsMSxZRUxMT1csbnVsbCkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OVxyXG5BQkNERUZHSElKS0wiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDUsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMSxZRUxMT1csbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMTUsMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTUsMSxZRUxMT1csbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDE1LDApOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoMCwyMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCwzLEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDUsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTUsMSxZRUxMT1csbnVsbCkpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKDgsMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoOCwyLFJFRCxudWxsKSkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGFicygpIHsKLQl0ZXh0LnNldFRhYnMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUYWJzKCkgPT0gMSk7Ci0JdGV4dC5zZXRUYWJzKDgpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VGFicygpID09IDgpOwotCXRleHQuc2V0VGV4dCgiTGluZVx0MVxyXG4iKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRhYnMoKSA9PSA4KTsKLQl0ZXh0LnNldFRhYnMoNyk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUYWJzKCkgPT0gNyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKHRlc3RUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0VGV4dCkpOwotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCArICJcclxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKHRlc3RUZXh0ICsgIlxyXG4iKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SUkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd247Ci0JU3RyaW5nIHRlc3RUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQlpbnQgaW52YWxpZFJhbmdlc1tdW10gPSB7ey0xLCAwfSwgezAsIC0xfSwgey0xLCAtMX0sIHsxMDAsIDF9LCB7MTAwLCAtMX0sIHsyLCB0ZXN0VGV4dC5sZW5ndGgoKX0sIHs1LCAyfX07Ci0JaW50IHJhbmdlc1tdW10gPSB7ezAsIDF9LCB7MCwgMH0sIHsyLCA1fSwgezcsIDExfX07Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBlbmQgPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dChzdGFydCwgZW5kKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9CQotCXRleHQuc2V0VGV4dCh0ZXN0VGV4dCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gcmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gcmFuZ2VzW2ldWzFdOwotCQlhc3NlcnRFcXVhbHMoIjpiOiIgKyBpLCB0ZXN0VGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCArIDEpLCB0ZXh0LmdldFRleHQoc3RhcnQsIGVuZCkpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGVuZCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJdGV4dC5nZXRUZXh0KHN0YXJ0LCBlbmQpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCI6YToiLCBleGNlcHRpb25UaHJvd24pOwotCX0JCi0JdGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0KDAsMCkuZXF1YWxzKCJ0IikpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgwLDEpLmVxdWFscygidGUiKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0KDEsNSkuZXF1YWxzKCJlc3RpbiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0UmFuZ2VJSSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93bjsKLQlTdHJpbmcgdGVzdFRleHQgPSAiTGluZTFcclxuTGluZTIiOwotCWludCBpbnZhbGlkUmFuZ2VzW11bXSA9IHt7LTEsIDB9LCB7MCwgLTF9LCB7LTEsIC0xfSwgezEwMCwgMX0sIHsxMDAsIC0xfSwgezEsIHRlc3RUZXh0Lmxlbmd0aCgpfSwgezUsIC0xfX07Ci0JaW50IHJhbmdlc1tdW10gPSB7ezAsIDF9LCB7MCwgMH0sIHs1LCAxfSwgezcsIDV9LCB7MTIsIDB9fTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IGludmFsaWRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50IHN0YXJ0ID0gaW52YWxpZFJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IGludmFsaWRSYW5nZXNbaV1bMV07Ci0JCi0JCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJdGV4dC5nZXRUZXh0UmFuZ2Uoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIjphOiIsIGV4Y2VwdGlvblRocm93bik7Ci0JfQkKLQl0ZXh0LnNldFRleHQodGVzdFRleHQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IHJhbmdlc1tpXVswXTsKLQkJaW50IGxlbmd0aCA9IHJhbmdlc1tpXVsxXTsKLQkJYXNzZXJ0RXF1YWxzKCI6YjoiICsgaSwgdGVzdFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIGxlbmd0aCksIHRleHQuZ2V0VGV4dFJhbmdlKHN0YXJ0LCBsZW5ndGgpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWludCBzdGFydCA9IGludmFsaWRSYW5nZXNbaV1bMF07Ci0JCWludCBsZW5ndGggPSBpbnZhbGlkUmFuZ2VzW2ldWzFdOwotCQotCQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRleHQuZ2V0VGV4dFJhbmdlKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCI6YToiLCBleGNlcHRpb25UaHJvd24pOwotCX0JCi0JdGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0UmFuZ2UoMCwwKS5lcXVhbHMoIiIpKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRleHRSYW5nZSgwLDEpLmVxdWFscygidCIpKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0UmFuZ2UoMCwyKS5lcXVhbHMoInRlIikpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dFJhbmdlKDEsNSkuZXF1YWxzKCJlc3RpbiIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA8IDApOwotCXRleHQuc2V0VGV4dExpbWl0KDEwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BJbmRleCgpIHsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUwYVxyXG4iKTsKLQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0yKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDEpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDIpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCAiTGluZTEiKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wUGl4ZWwoKSB7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG5MaW5lMGFcclxuIik7Ci0KLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIDIpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCAiTGluZTEiKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V29yZFdyYXAoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFdvcmRXcmFwKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0V29yZFdyYXAodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRXb3JkV3JhcCgpKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmcoKXsKLQlTdHJpbmcgZGVsaW1pdGVyU3RyaW5nID0gIlxuIjsKLQl0cnkgewotCQl0ZXh0Lmluc2VydChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0ZXh0Lmluc2VydCgiZnJlZCIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiZnJlZCIpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQl0ZXh0Lmluc2VydCgiaGVsbXV0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJmcmhlbG11dGVkIikpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldExpbmVDb3VudCgpPT0xKTsKLQl0ZXh0Lmluc2VydChkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0TGluZUNvdW50KCk9PTIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZUFjdGlvbkkoKSB7Ci0JLy8gaW52b2tpbmcgYWN0aW9ucyBvbiBhbiBlbXB0eSB0ZXh0IHNob3VsZCBub3QgY3Jhc2gKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0RPV04pOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfVVApOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DT0xVTU5fTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9ET1dOKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5QQUdFX1VQKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfUFJFVklPVVMpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX0VORCk7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRFWFRfU1RBUlQpOwkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XSU5ET1dfRU5EKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV0lORE9XX1NUQVJUKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRE9XTik7CQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9MSU5FX1VQKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfQ09MVU1OX1BSRVZJT1VTKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfQ09MVU1OX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9QQUdFX1VQKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfUEFHRV9ET1dOKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfV09SRF9QUkVWSU9VUyk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dPUkRfTkVYVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1RFWFRfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfVEVYVF9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dJTkRPV19TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dJTkRPV19FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNVVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuQ09QWSk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFTVEUpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkRFTEVURV9QUkVWSU9VUyk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuREVMRVRFX05FWFQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlRPR0dMRV9PVkVSV1JJVEUpOwotCi0JLy9Tb21lIHBsYXRmb3JtcyBjb25zaWRlciBudW1iZXIgYSB3b3JkIHN0YXJ0LCBvdGhlciBkb24ndCAgCi0vLwl0ZXh0LnNldFRleHQoIkxpbmUxXHJcbkxpbmUyIik7CQkKLQl0ZXh0LnNldFRleHQoIkxpbmVMXHJcbkxpbmVXIik7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9ET1dOKTsKLQlhc3NlcnRFcXVhbHMoNywgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1VQKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JYXNzZXJ0RXF1YWxzKDUsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0JCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DT0xVTU5fTkVYVCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5QQUdFX0RPV04pOwotCWFzc2VydEVxdWFscyg4LCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuUEFHRV9VUCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX1NUQVJUKTsJCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuV09SRF9ORVhUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XT1JEX05FWFQpOwkKLQlhc3NlcnRFcXVhbHMoNywgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULldPUkRfUFJFVklPVVMpOwkKLQlhc3NlcnRFcXVhbHMoNSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRFWFRfRU5EKTsJCi0JYXNzZXJ0RXF1YWxzKHRleHQuZ2V0Q2hhckNvdW50KCksIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX1NUQVJUKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XSU5ET1dfRU5EKTsJCi0JYXNzZXJ0RXF1YWxzKDUsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5XSU5ET1dfU1RBUlQpOwkKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQkKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9ET1dOKTsJCi0JYXNzZXJ0RXF1YWxzKCJMaW5lTFxyXG4iLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfVVApOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0xJTkVfU1RBUlQpOwotCWFzc2VydEVxdWFscygiTGluZUxcclxuTGluZVciLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9FTkQpOwotCWFzc2VydEVxdWFscygiTGluZUwiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5MSU5FX0VORCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9QUkVWSU9VUyk7Ci0JYXNzZXJ0RXF1YWxzKCJMIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX0NPTFVNTl9ORVhUKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9QQUdFX1VQKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9QQUdFX0RPV04pOwotCWFzc2VydEVxdWFscygiXHJcbkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XT1JEX1BSRVZJT1VTKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVXIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuTElORV9TVEFSVCk7Ci0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dPUkRfTkVYVCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9URVhUX0VORCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lVyIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9URVhUX1NUQVJUKTsKLQlhc3NlcnRFcXVhbHMoIkxpbmVMXHJcbiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfU1RBUlQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULlNFTEVDVF9XSU5ET1dfU1RBUlQpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5pbnZva2VBY3Rpb24oU1QuU0VMRUNUX1dJTkRPV19FTkQpOwotCWFzc2VydEVxdWFscygiTGluZUwiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9FTkQpOwotCXRleHQuaW52b2tlQWN0aW9uKFNULkNVVCk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5TRUxFQ1RfTElORV9ET1dOKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5DT1BZKTsKLQlhc3NlcnRFcXVhbHMoIlxyXG5MaW5lVyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkxJTkVfRU5EKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5QQVNURSk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciICsgUExBVEZPUk1fTElORV9ERUxJTUlURVIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULkRFTEVURV9QUkVWSU9VUyk7Ci0JYXNzZXJ0RXF1YWxzKCJcclxuTGluZVciLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5URVhUX1NUQVJUKTsKLQl0ZXh0Lmludm9rZUFjdGlvbihTVC5ERUxFVEVfTkVYVCk7Ci0JYXNzZXJ0RXF1YWxzKCJMaW5lVyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuaW52b2tlQWN0aW9uKFNULlRPR0dMRV9PVkVSV1JJVEUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Bhc3RlKCl7Ci0JQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQodGV4dC5nZXREaXNwbGF5KCkpOwotCVRleHRUcmFuc2ZlciB0cmFuc2ZlciA9IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpOwotCVN0cmluZyBjb252ZXJ0ZWRUZXh0OwotCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsieCJ9LCBuZXcgVHJhbnNmZXJbXXt0cmFuc2Zlcn0pOwotCQotCXRleHQuY29weSgpOwkKLQl0ZXh0LnBhc3RlKCk7CQotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gMSk7Ci0JCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAwKTsKLQl0ZXh0LmNvcHkoKTsJCi0JdGV4dC5wYXN0ZSgpOwkKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IDIpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCAxKTsKLQl0ZXh0LmNvcHkoKTsJCi0JdGV4dC5zZXRDYXJldE9mZnNldCgwKTsKLQl0ZXh0LnBhc3RlKCk7CQotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiMDAxMjM0NTY3ODkiKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAyKTsJCi0JdGV4dC5jb3B5KCk7CQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VGV4dCgpLmVxdWFscygiMDEiKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IlxyTGluZTFcbkxpbmUyXHJcbkxpbmUzXG5cckxpbmU0XG4ifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQl0ZXh0LnBhc3RlKCk7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIlxyXG5MaW5lMVxyXG5MaW5lMlxyXG5MaW5lM1xyXG5cclxuTGluZTRcclxuIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiXG5MaW5lMVxuTGluZTJcbkxpbmUzXG5cbkxpbmU0XG4iOwotCX0KLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRleHQoKSAhPSBudWxsICYmIHRleHQuZ2V0VGV4dCgpLmVxdWFscyhjb252ZXJ0ZWRUZXh0KSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQotCS8vIHRlc3QgbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgU3RyaW5nW117IkxpbmUxXHJcbkxpbmUyIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0JLy8gdGVzdCBsaW5lIGRlbGltaXRlciBjb252ZXJzaW9uCi0JY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBTdHJpbmdbXXsiTGluZTFcckxpbmUyIn0sIG5ldyBUcmFuc2Zlcltde3RyYW5zZmVyfSk7Ci0JdGV4dC5wYXN0ZSgpOwotCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MpIHsKLQkJY29udmVydGVkVGV4dCA9ICJMaW5lMVxyXG5MaW5lMiI7Ci0JfQotCWVsc2UgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXG5MaW5lMiI7Ci0JfQotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGV4dC5nZXRUZXh0KCkuZXF1YWxzKGNvbnZlcnRlZFRleHQpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCi0KLQkvLyB0ZXN0IGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQljbGlwYm9hcmQuc2V0Q29udGVudHMobmV3IFN0cmluZ1tdeyJMaW5lMVxuTGluZTIifSwgbmV3IFRyYW5zZmVyW117dHJhbnNmZXJ9KTsKLQl0ZXh0LnBhc3RlKCk7Ci0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQljb252ZXJ0ZWRUZXh0ID0gIkxpbmUxXHJcbkxpbmUyIjsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnZlcnRlZFRleHQgPSAiTGluZTFcbkxpbmUyIjsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUZXh0KCkgIT0gbnVsbCAmJiB0ZXh0LmdldFRleHQoKS5lcXVhbHMoY29udmVydGVkVGV4dCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0KLQotCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnQoKSB7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgPT0gbnVsbCkgcmV0dXJuOwotCQotCS8qIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIHJ1biB0aGlzIHRlc3QsIGJlY2F1c2UgaXQgd2FzdGVzIHBhcGVyLgotCSAqIEFsbW9zdCBhbGwgb2YgdGhlIHByaW50KCkgbWV0aG9kIGlzIHRlc3RlZCBpbiBwcmludChQcmludGVyKSwgYmVsb3cuCi0JICovCi0vLwl0ZXh0LnByaW50KCk7Ci0vLwl0ZXh0LnNldFRleHQoIkxpbmUxIik7Ci0vLwl0ZXh0LnByaW50KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIoKSB7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgPT0gbnVsbCkgcmV0dXJuOwotCi0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnByaW50KG51bGwpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0JCi0JYXNzZXJ0VHJ1ZSgibm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHJpbnQobnVsbCkiLCBleGNlcHRpb25UaHJvd24pOwotCQotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKCk7Ci0JdGV4dC5wcmludChwcmludGVyKTsgLy8gZG9uJ3QgcnVuIHRoZSBydW5uYWJsZSwgdG8gc2F2ZSBwYXBlcgotCXRleHQuc2V0VGV4dCgiTGluZTEiKTsKLQl0ZXh0LnByaW50KHByaW50ZXIpOyAvLyBkb24ndCBydW4gdGhlIHJ1bm5hYmxlLCB0byBzYXZlIHBhcGVyCi0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0UHJpbnRPcHRpb25zKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9wcmludExvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRQcmludE9wdGlvbnMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXcoKSB7Ci0JLy8gaW5oZXJpdGVkIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlZHJhd0lJSUlaKCkgewotCS8vIGluaGVyaXRlZCB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWRyYXdSYW5nZUlJWigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCi0JdGV4dC5yZWRyYXdSYW5nZSgwLCAwLCB0cnVlKTsKLQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDAsIGZhbHNlKTsKLQkKLQl0cnkgewotCQl0ZXh0LnJlZHJhd1JhbmdlKDAsIDEsIHRydWUpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoMCwgMSwgZmFsc2UpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQkJCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgtMSwgMiwgdHJ1ZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgtMSwgMiwgZmFsc2UpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiSW5kZXggb3V0IG9mIGJvdW5kcyIpKSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JfQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OSIpOwotCXRleHQucmVkcmF3UmFuZ2UoMCwgMCwgdHJ1ZSk7Ci0JdGV4dC5yZWRyYXdSYW5nZSgwLCAwLCBmYWxzZSk7CQotCXRleHQucmVkcmF3UmFuZ2UoMCwgMSwgdHJ1ZSk7Ci0JdGV4dC5yZWRyYXdSYW5nZSgwLCAxLCBmYWxzZSk7CQotCXRleHQucmVkcmF3UmFuZ2UoOCwgMiwgdHJ1ZSk7Ci0JdGV4dC5yZWRyYXdSYW5nZSg4LCAyLCBmYWxzZSk7CQotCXRleHQucmVkcmF3UmFuZ2UoMTAsIDAsIHRydWUpOwkKLQl0ZXh0LnJlZHJhd1JhbmdlKDEwLCAwLCBmYWxzZSk7CQotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZWRyYXdSYW5nZSgxMCwgMSwgdHJ1ZSk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlpZiAoZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJJbmRleCBvdXQgb2YgYm91bmRzIikpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCXRleHQucmVkcmF3UmFuZ2UoMTAsIDEsIGZhbHNlKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkluZGV4IG91dCBvZiBib3VuZHMiKSkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCX0KLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKSB7Ci0JU3R5bGVSYW5nZVtdIHN0eWxlczsKLQlTdHJpbmcgdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQotCS8qIAotCQlkZWZhdWx0U3R5bGVzCi0JCQotCQkJKDAsNDgsUkVELFlFTExPVyksIAotCQkJKDU4LDEwLEJMVUUsQ1lBTiksIAotCQkJKDY4LDEwLEdSRUVOLFBVUlBMRSkKLQkqLwotCi0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA3OCwgbmV3IFN0eWxlUmFuZ2VbXSB7fSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDc4LCBuZXcgU3R5bGVSYW5nZVtdIHt9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MDoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjowOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE5vIG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdHlsZXMKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQ4LCA1LCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSg0OCw1LFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg0OCw1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBPdmVybGFwIG1pZGRsZSBvZiBvbmUgc3R5bGUgLSBwYXJ0aWFsCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygxMCwgMTAsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDEwLDEwLFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjAsMjgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbNF0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBuZXcgU3R5bGVSYW5nZVtdIHt9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQkvLyBPdmVybGFwIG1pZGRsZSBvZiBvbmUgc3R5bGUgLSBmdWxsCi0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSwgZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1OCwgMTAsIG5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDU4LDEwLFlFTExPVyxSRUQpfSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE92ZXJsYXAgZW5kIG9mIG9uZSBzdHlsZQotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIHRleHQuZ2V0Q2hhckNvdW50KCksIGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMzgsIDE1LCBuZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgzOCwxNSxZRUxMT1csUkVEKX0pOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMTUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQkvLyBPdmVybGFwIGJlZ2lubmluZyBvZiBvbmUgc3R5bGUKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUwLCAxMCwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoNTAsMTAsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUwLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2MCw4LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIE92ZXJsYXAgY29tcGxldGUgc3R5bGUKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCB0ZXh0LmdldENoYXJDb3VudCgpLCBkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQ4LCAyMCwgbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoNDgsMjAsWUVMTE9XLFJFRCl9KTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQ4LDIwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JU3R5bGVSYW5nZSByYW5nZXNbXSA9IG5ldyBTdHlsZVJhbmdlWzNdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNDgsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKTsKLQlyYW5nZXNbMl0gPSBnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDc4LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE1LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoInJlZGdyZWVuYmx1ZXllbGxvd2N5YW5wdXJwbGUiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVs0XTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDMsUkVELG51bGwpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDMsNSxHUkVFTixudWxsKTsKLQlyYW5nZXNbMl0gPSBnZXRTdHlsZSg4LDQsQkxVRSxudWxsKTsKLQlyYW5nZXNbM10gPSBnZXRTdHlsZSgxMiw2LFlFTExPVyxudWxsKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxOCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMyxSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDMsNSxHUkVFTixudWxsKSkpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoOCw0LEJMVUUsIG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgxMiw2LFlFTExPVyxudWxsKSkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDE4LDQsQ1lBTixudWxsKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygxOCwgMTAsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gNik7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSgxOCw0LENZQU4sbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbNV0uZXF1YWxzKGdldFN0eWxlKDIyLDYsUFVSUExFLG51bGwpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCQkJCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMTAsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAzNSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDE1LEJMVUUsQ1lBTik7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMjAsMTAsR1JFRU4sUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAyNSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwxNSxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjAsMTUsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMTAsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDMsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTIsNSxCTFVFLENZQU4pOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDEyLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MTE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMiw4LEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDUsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTik7Ci0JcmFuZ2VzWzJdID0gZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE1LCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSgxMCw1LFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDE1LFJFRCxZRUxMT1cpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDE1LCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKTsKLQlyYW5nZXNbMV0gPSBnZXRTdHlsZSg1LDUsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjEzOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MTM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxNSwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDcsQkxVRSxDWUFOKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCA3LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MTQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDEwLEJMVUUsQ1lBTikpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCS8vIEVuZC9CZWdpbm5pbmcgb3ZlcmxhcAotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMzgsIDI1LCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMzgsMjUsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2Myw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MWE6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDYzLCAxMCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNzMsNSxHUkVFTixQVVJQTEUpKSk7Ci0KLQkvLyBDb21wbGV0ZSBvdmVybGFwCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgNzgsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDc4LFlFTExPVyxSRUQpKSk7Ci0KLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCA2OCwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyYToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNTgsMjAsWUVMTE9XLFJFRCk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNTgsIDIwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMjAsWUVMTE9XLFJFRCkpKTsKLQotCS8vIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKCAKLQkJbmV3IFN0eWxlUmFuZ2VbXSB7Z2V0U3R5bGUoMCw1LFJFRCxSRUQpLCBnZXRTdHlsZSg1LDUsWUVMTE9XLFlFTExPVyksCi0JCQlnZXRTdHlsZSgxMCw1LENZQU4sQ1lBTiksIGdldFN0eWxlKDE1LDUsQkxVRSxCTFVFKSwKLQkJCWdldFN0eWxlKDIwLDUsR1JFRU4sR1JFRU4pLCBnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpfQotCSk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcyg1LCAyMywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozYToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI4LDIsUFVSUExFLFBVUlBMRSkpKTsKLQkKLQkvLyBlbmQsIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyggCi0JCW5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDAsNSxSRUQsUkVEKSwgZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpLAotCQkJZ2V0U3R5bGUoMTAsNSxDWUFOLENZQU4pLCBnZXRTdHlsZSgxNSw1LEJMVUUsQkxVRSksCi0JCQlnZXRTdHlsZSgyMCw1LEdSRUVOLEdSRUVOKSwgZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKX0KLQkpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDEzLDEyLFlFTExPVyxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEzLCAxMiwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlcy5sZW5ndGggPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMyxDWUFOLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTMsMTIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSgyNSw1LFBVUlBMRSxQVVJQTEUpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQkvLyBpbnNlcnQgd2l0aCBubyBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDEwLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCi0JLy8gaW5zZXJ0IGJlZm9yZSAxIHN0eWxlCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDMsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMywgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoxeGI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDMsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhiOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKSk7Ci0KLQkvLyBpbnNlcnQgYWZ0ZXIgMSBzdHlsZQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDMsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMTAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoOCwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDgsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MXhjOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4YzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDgsMSxQVVJQTEUsUFVSUExFKSkpOwotCi0JLy8gaW5zZXJ0IGJlZm9yZSAyIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDIsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgyLDEsUFVSUExFLFBVUlBMRSk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMiwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxeGU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgyLDEsUFVSUExFLFBVUlBMRSkpKTsKLQlhc3NlcnRUcnVlKCI6MXhlOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEwLDIsUkVELFlFTExPVykpKTsKLQotCS8vIGluc2VydCBhZnRlciAyIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSg1LDIsUkVELFlFTExPVyk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMTAsMixSRUQsWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyMCwgcmFuZ2VzKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsxXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxMiwxLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEyLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MXhmOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxeGY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDEyLDEsUFVSUExFLFBVUlBMRSkpKTsKLQotCS8vIGluc2VydCBtaWRkbGUgMiBzdHlsZXMKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMSwyLFJFRCxZRUxMT1cpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEyLDIsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNSwzLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDUsIDMsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MXhnOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwyLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4ZzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMyxQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGc6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgxMiwyLFJFRCxZRUxMT1cpKSk7Ci0JCi0JLy8gaW5zZXJ0IG1pZGRsZSAzIHN0eWxlcwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDMsUkVELFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoNiwzLFBVUlBMRSxZRUxMT1cpOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDEyLDMsUkVELFlFTExPVyk7Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoMCwgMjAsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwyLFBVUlBMRSxQVVJQTEUpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDIsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMSwzLFJFRCxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjF4aDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQsMixQVVJQTEUsUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjoxeGg6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2LDMsUFVSUExFLFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MXhoOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoMTIsMyxSRUQsWUVMTE9XKSkpOwkKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCXRleHQuc2V0VGV4dCgiMCIpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxIik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMl07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpOwotCXJhbmdlc1sxXSA9IGdldFN0eWxlKDEsMSxSRUQsUkVEKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAyLCByYW5nZXMpOwotCXJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzFdOwotCXJhbmdlc1swXSA9IGdldFN0eWxlKDAsMSxZRUxMT1csWUVMTE9XKTsKLQl0ZXh0LnJlcGxhY2VTdHlsZVJhbmdlcygwLCAxLCByYW5nZXMpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MnhiOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMSxZRUxMT1csWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyeGI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxLDEsUkVELFJFRCkpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMSwxLFJFRCxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMSwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDEsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MnhjOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4YzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMSxZRUxMT1csWUVMTE9XKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVsyXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgwLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMSwxLFJFRCxSRUQpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDAsIDIsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoMiwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDIsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MnhkOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFBVUlBMRSxQVVJQTEUpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsMSxSRUQsUkVEKSkpOwotCWFzc2VydFRydWUoIjoyeGQ6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyLDEsWUVMTE9XLFlFTExPVykpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiKTsKLQlyYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVszXTsKLQlyYW5nZXNbMF0gPSBnZXRTdHlsZSgxLDEsUFVSUExFLFBVUlBMRSk7Ci0JcmFuZ2VzWzFdID0gZ2V0U3R5bGUoMiwxLFJFRCxSRUQpOwotCXJhbmdlc1syXSA9IGdldFN0eWxlKDMsMSxQVVJQTEUsUFVSUExFKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGU6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MnhlOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyeGY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MnhmOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0Iik7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMV07Ci0JcmFuZ2VzWzBdID0gZ2V0U3R5bGUoNCwxLFlFTExPVyxZRUxMT1cpOwotCXRleHQucmVwbGFjZVN0eWxlUmFuZ2VzKDQsIDEsIHJhbmdlcyk7Ci0JcmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JdGV4dC5yZXBsYWNlU3R5bGVSYW5nZXMoNCwgMSwgcmFuZ2VzKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJ4ZzoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKXsKLQlTdHJpbmcgZGVmYXVsdFRleHQgPSAibGluZTBcblxybGluZTFcblxybGluZTJcblxyIjsKLQlpbnQgZGVmYXVsdFRleHRMZW5ndGggPSBkZWZhdWx0VGV4dC5sZW5ndGgoKTsKLQlpbnQgc2VsZWN0aW9uU3RhcnQgPSA3OwotCWludCBzZWxlY3Rpb25MZW5ndGggPSA3OwotCWludCByZXBsYWNlU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIHNlbGVjdGlvbkxlbmd0aCArIDE7Ci0JaW50IHJlcGxhY2VMZW5ndGggPSA1OwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU3RyaW5nIG5ld1RleHQgPSAibmV3bGluZTBcblxybmV3bGluZTEiOwotCWludCBuZXdUZXh0TGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJCQotCS8vIGluc2VydCB0ZXh0Ci0JLy8gd2l0aGluIHJhbmdlCi0JLy8gYWZ0ZXIgc2VsZWN0aW9uCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UocmVwbGFjZVN0YXJ0LCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCi0JLy8gYmVmb3JlIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCArIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQotCi0JLy8gaW50ZXJzZWN0aW5nIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMSwgMCwgbmV3VGV4dCk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDaGFyQ291bnQoKSA9PSBkZWZhdWx0VGV4dExlbmd0aCArIG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IHNlbGVjdGlvblN0YXJ0ICsgMSArIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0JCQkJCi0JLy8gb3V0IG9mIHJhbmdlCi0JdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkvLyBzZWxlY3QgMm5kIGxpbmUgaW5jbHVkaW5nIGxpbmUgYnJlYWsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25MZW5ndGgpOwkKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoLTEsIDAsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSArIDEsIDAsIG5ld1RleHQpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0KLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQl0cnkgewotCQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgbnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0JCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JYXNzZXJ0VHJ1ZSgiOmg6IiwgZXhjZXB0aW9uVGhyb3duKTsKLQlhc3NlcnRUcnVlKCI6aToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQkKLQkvLyBhcHBlbmQgdGV4dAotCS8vIGFwcGVuZCBpbiBlbXB0eSB3aWRnZXQKLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IG5ld1RleHRMZW5ndGgpOwotCWFzc2VydFRydWUoIjprOiIsIHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKS54ID09IDAgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0JCQkKLQkvLyBhcHBlbmQgaW4gbm9uLWVtcHR5IHdpZGdldCAoc2VsZWN0aW9uIHNob3VsZCBhbHdheXMgYmUgcHJlc2VydmVkKQotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCksIDAsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpsOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoKTsKLQlhc3NlcnRUcnVlKCI6bToiLCB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueCA9PSBzZWxlY3Rpb25TdGFydCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLy8gcGxhY2UgY2FyZXQgYXQgZW5kIG9mIHRleHQKLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2UodGV4dC5nZXRDaGFyQ291bnQoKSwgMCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZSh0ZXh0LmdldENoYXJDb3VudCgpLCAwLCBuZXdUZXh0KTsKLQlhc3NlcnRUcnVlKCI6bjoiLCB0ZXh0LmdldENoYXJDb3VudCgpID09IGRlZmF1bHRUZXh0TGVuZ3RoICsgbmV3VGV4dExlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOm86IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gdGV4dC5nZXRDaGFyQ291bnQoKSAtIG5ld1RleHRMZW5ndGggJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gMCk7Ci0KLQkvLyByZXBsYWNlIHRleHQKLQkvLyB3aXRoaW4gcmFuZ2UKLQkvLyBhZnRlciBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShyZXBsYWNlU3RhcnQsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpwOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOnE6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCi0JLy8gYmVmb3JlIHNlbGVjdGlvbgotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjpyOiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOnM6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSBzZWxlY3Rpb25MZW5ndGgpOwotCQotCS8vIGludGVyc2VjdGluZyBzZWxlY3Rpb24KLQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCS8vIHNlbGVjdCAybmQgbGluZSBpbmNsdWRpbmcgbGluZSBicmVhawotCXRleHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkxlbmd0aCk7CQotCXRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb25TdGFydCArIDEsIHJlcGxhY2VMZW5ndGgsIG5ld1RleHQpOwotCWFzc2VydFRydWUoIjp0OiIsIHRleHQuZ2V0Q2hhckNvdW50KCkgPT0gZGVmYXVsdFRleHRMZW5ndGggKyBuZXdUZXh0TGVuZ3RoIC0gcmVwbGFjZUxlbmd0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOnU6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgKyAxICsgbmV3VGV4dExlbmd0aCAmJiB0ZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueSA9PSAwKTsKLQkJCQotCS8vIG91dCBvZiByYW5nZQotCXRleHQuc2V0VGV4dChkZWZhdWx0VGV4dCk7Ci0JLy8gc2VsZWN0IDJuZCBsaW5lIGluY2x1ZGluZyBsaW5lIGJyZWFrCi0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uTGVuZ3RoKTsJCi0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKC0xLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjp2OiIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5yZXBsYWNlVGV4dFJhbmdlKHRleHQuZ2V0Q2hhckNvdW50KCkgKyAxLCByZXBsYWNlTGVuZ3RoLCBuZXdUZXh0KTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjp3OiIsIGV4Y2VwdGlvblRocm93bik7Ci0JYXNzZXJ0VHJ1ZSgiOng6IiwgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnggPT0gc2VsZWN0aW9uU3RhcnQgJiYgdGV4dC5nZXRTZWxlY3Rpb25SYW5nZSgpLnkgPT0gc2VsZWN0aW9uTGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JU3RyaW5nIGxpbmUgPSAiTGluZTFcckxpbmUyIjsKLQkKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCQotCXRleHQuc2V0VGV4dChsaW5lKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhsaW5lLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KCkgewotCUNhcmV0IGNhcmV0ID0gbmV3IENhcmV0KHRleHQsIFNXVC5OT05FKTsKLQlmaW5hbCBpbnQgWElOU0VUID0gaXNCaWRpKCkgPyAyIDogMDsKLQkKLQl0ZXh0LnNldENhcmV0KGNhcmV0KTsKLQlhc3NlcnRFcXVhbHMoWElOU0VULCB0ZXh0LmdldENhcmV0KCkuZ2V0TG9jYXRpb24oKS54KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueSk7Ci0KLQl0ZXh0LnNldENhcmV0KG51bGwpOwkJCi0JdGV4dC5zZXRUZXh0KCJcckxpbmUyIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0KLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCXRleHQuc2V0Q2FyZXQoY2FyZXQpOwotCWFzc2VydFRydWUodGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueCA+IDApOwotCWFzc2VydEVxdWFscyh0ZXh0LmdldExpbmVIZWlnaHQoKSwgdGV4dC5nZXRDYXJldCgpLmdldExvY2F0aW9uKCkueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmlkaUNvbG9yaW5nWigpIHsKLQkvLy8gc2V0QmlkaUNvbG9yaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4KLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QmlkaUNvbG9yaW5nWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcmV0T2Zmc2V0SSgpewotCXRleHQuc2V0Q2FyZXRPZmZzZXQoLTIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KDApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRPZmZzZXQoKSA9PSAwKTsKLQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDEpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDApOwotCi0JdGV4dC5zZXRDYXJldE9mZnNldCh0ZXh0LmdldENoYXJDb3VudCgpKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCh0ZXh0LmdldENoYXJDb3VudCgpICsgMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmg6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuc2V0Q2FyZXRPZmZzZXQoNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRDYXJldE9mZnNldCgpID09IDUpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldENhcmV0T2Zmc2V0KC0yKTsKLQlhc3NlcnRUcnVlKCI6ajoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgxKTsKLQlhc3NlcnRUcnVlKCI6azoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci0JdGV4dC5zZXRDYXJldE9mZnNldCgwKTsKLQlhc3NlcnRUcnVlKCI6bDoiLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGVudExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duOwotCVN0eWxlZFRleHRDb250ZW50IGNvbnRlbnQgPSBuZXcgU3R5bGVkVGV4dENvbnRlbnQoKSB7Ci0JCXB1YmxpYyB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCQlwdWJsaWMgaW50IGdldENoYXJDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZShpbnQgbGluZUluZGV4KSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHRSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIoVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJfQotCX07Ci0JdGV4dC5zZXRDb250ZW50KGNvbnRlbnQpOwotCWFzc2VydEVxdWFscyhjb250ZW50LCB0ZXh0LmdldENvbnRlbnQoKSk7Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJdGV4dC5zZXRDb250ZW50KG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFooKXsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IHRydWUpOwotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldERvdWJsZUNsaWNrRW5hYmxlZCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXREb3VibGVDbGlja0VuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXREb3VibGVDbGlja0VuYWJsZWQoKSA9PSB0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0YWJsZVooKXsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpewotCUZvbnREYXRhIGZvbnREYXRhID0gdGV4dC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLQlpbnQgbGluZUhlaWdodDsKLQlGb250IGZvbnQ7Ci0JCi0JZm9udCA9IG5ldyBGb250KHRleHQuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDIwLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMjUsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVIZWlnaHQoKSA+IGxpbmVIZWlnaHQgJiYgZm9udC5lcXVhbHModGV4dC5nZXRGb250KCkpKTsKLQl0ZXh0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SG9yaXpvbnRhbEluZGV4SSgpewotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbEluZGV4KDEpOwkKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsSW5kZXgoKSA9PSAxKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCg1MDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgtMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjpnOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7CQotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnNldEhvcml6b250YWxJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldEhvcml6b250YWxJbmRleCgpID09IDApOwotCi0JLy8gbWFrZSBzdXJlIHRoZSB3aWRnZXQgY2FuIGJlIHNjcm9sbGVkCi0Jc2hlbGwub3BlbigpOwotCXRleHQuc2V0U2l6ZSgxMCwgNTApOwkKLQl0ZXh0LnNldFRleHQoIkxpbmUwIik7Ci0JdGV4dC5zZXRIb3Jpem9udGFsSW5kZXgoMSk7CQotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0SG9yaXpvbnRhbEluZGV4KCkgPT0gMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SG9yaXpvbnRhbFBpeGVsSSgpewotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDEpOwkKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDApOwotCQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgxKTsJCi0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSAxKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCg1MDApOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPiAwKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCgtMSk7CQotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRIb3Jpem9udGFsUGl4ZWwoMjUpOwkKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldEhvcml6b250YWxQaXhlbCgpID09IDI1KTsJCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0SG9yaXpvbnRhbFBpeGVsKDIpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0SG9yaXpvbnRhbFBpeGVsKCkgPT0gMCk7Ci0KLQkvLyBtYWtlIHN1cmUgdGhlIHdpZGdldCBjYW4gYmUgc2Nyb2xsZWQKLQlzaGVsbC5vcGVuKCk7Ci0JdGV4dC5zZXRTaXplKDEwLCA1MCk7CQotCXRleHQuc2V0VGV4dCgiTGluZTAiKTsKLQl0ZXh0LnNldEhvcml6b250YWxQaXhlbCg1KTsJCi0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRIb3Jpem9udGFsUGl4ZWwoKSA9PSA1KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMaW5lQmFja2dyb3VuZElJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpewotCVN0cmluZyB0ZXh0U3RyaW5nOwotCi0JdGV4dFN0cmluZyA9ICJMMVxuTDJcbkwzXG5MNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDUsIiIpOwotCWFzc2VydFRydWUoIjowYToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowYToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDQsIiIpOwotCWFzc2VydFRydWUoIjowYjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjowYjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwxLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MGM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihCTFVFKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBjOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMykgPT0gZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDEsZ2V0Q29sb3IoQkxVRSkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMywxLGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNiwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBkOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoQkxVRSkpOwotCWFzc2VydFRydWUoIjowZDoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEdSRUVOKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxLDMsIiIpOwotCWFzc2VydFRydWUoIjowZToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowZToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKEJMVUUpKTsKLQlhc3NlcnRUcnVlKCI6MGU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihHUkVFTikpOwotCi0JdGV4dFN0cmluZyA9ICJMMVxuTDIiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSw0LCIiKTsKLQlhc3NlcnRUcnVlKCI6MGExOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDQsIiIpOwotCWFzc2VydFRydWUoIjowYjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsMSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBjMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjowYzE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDEsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsNSwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBkMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwzLCIiKTsKLQlhc3NlcnRUcnVlKCI6MGUxOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjBlMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IG51bGwpOwotCXRleHRTdHJpbmcgPSAiTDFcbkwyIjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgxLDEsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsNCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjBmMToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKyJcbiIpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDYsIiIpOwotCWFzc2VydFRydWUoIjowZzE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQkJCQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDAsZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBudWxsKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IGdldENvbG9yKFJFRCkpOwotCQotCXRleHRTdHJpbmcgPSAiTmV3IExpbmUxXG5OZXcgTGluZTJcbk5ldyBMaW5lM1xuTmV3IExpbmU0IjsKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgwLDIsZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgyLDIsZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwiXG4iKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBnZXRDb2xvcihSRUQpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IGdldENvbG9yKFlFTExPVykpOwotCWFzc2VydFRydWUoIjoyOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoNCkgPT0gZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JCi0JdGV4dFN0cmluZyA9ICJOZXcgTGluZTFcbk5ldyBMaW5lMlxuTmV3IExpbmUzXG5OZXcgTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMixnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMixnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwyMCwiIik7Ci0JYXNzZXJ0VHJ1ZSgiOjM6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgwKSA9PSBnZXRDb2xvcihZRUxMT1cpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDEpID09IGdldENvbG9yKFlFTExPVykpOwotCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDE4LCIiKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgwLDE4LCJMMVxuTDJcbkwzXG4iKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDApID09IG51bGwpOwotCWFzc2VydFRydWUoIjo1OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgyKSA9PSBudWxsKTsKLQlhc3NlcnRUcnVlKCI6NToiLCB0ZXh0LmdldExpbmVCYWNrZ3JvdW5kKDMpID09IG51bGwpOwotCi0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgzLDksIkwxXG5MMlxuIik7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gZ2V0Q29sb3IoUkVEKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjZhOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMSkgPT0gbnVsbCk7Ci0JdGV4dFN0cmluZyA9ICJMaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNCI7Ci0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMCwxLGdldENvbG9yKFJFRCkpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMSwxLGdldENvbG9yKFlFTExPVykpOwotCXRleHQuc2V0TGluZUJhY2tncm91bmQoMiwxLGdldENvbG9yKEJMVUUpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDMsMSxnZXRDb2xvcihHUkVFTikpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMSwxMSwiTDNcbkw0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMikgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjZiOiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMykgPT0gbnVsbCk7Ci0JCQotCXRleHRTdHJpbmcgPSAiTGluZTFcbkxpbmUyXG5MaW5lM1xuTGluZTQiOwotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDAsMSxnZXRDb2xvcihSRUQpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDEsMSxnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldExpbmVCYWNrZ3JvdW5kKDIsMSxnZXRDb2xvcihCTFVFKSk7Ci0JdGV4dC5zZXRMaW5lQmFja2dyb3VuZCgzLDEsZ2V0Q29sb3IoR1JFRU4pKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxOCwiTDFcbiIpOwotCWFzc2VydFRydWUoIjo3OiIsIHRleHQuZ2V0TGluZUJhY2tncm91bmQoMCkgPT0gbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6IiwgdGV4dC5nZXRMaW5lQmFja2dyb3VuZCgxKSA9PSBnZXRDb2xvcihHUkVFTikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWVudGF0aW9uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0T3JpZW50YXRpb25JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnRbXSBpbnZhbGlkID0gey0xLCAxMDAsIDEyfTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZC5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oaW52YWxpZFtpXSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRDYXJldE9mZnNldCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxMSk7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihpbnZhbGlkW2ldKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlQb2ludFtdIGludmFsaWRSYW5nZXMgPSB7bmV3IFBvaW50KC0xLCAwKSwgbmV3IFBvaW50KC0xLCAtMSksIG5ldyBQb2ludCgxMDAsIDEpLCAKLQkJbmV3IFBvaW50KDEwMCwgLTEpLCBuZXcgUG9pbnQoMTEsIDEyKSwgbmV3IFBvaW50KDEwLCAxMil9OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpbnZhbGlkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFNlbGVjdGlvbihpbnZhbGlkUmFuZ2VzW2ldKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoInNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9uIGZvciBvdXQgb2YgcmFuZ2UiKTsKLQkJfQotCX0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJdGV4dC5zZXRTZWxlY3Rpb24oaW52YWxpZFJhbmdlc1tpXSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3Igb3V0IG9mIHJhbmdlIik7Ci0JCX0KLQl9CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbklJKCl7Ci0JaW50W11bXSBpbnZhbGlkUmFuZ2VzID0ge3stMSwgMH0sIHstMSwgLTF9LCB7MTAwLCAxfSwgezEwMCwgLTF9LCB7MTEsIDEyfSwgezEwLCAxMn0sIHsyLCAtM30sIHs1MCwgLTF9fTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgNyk7Ci0JYXNzZXJ0RXF1YWxzKCIzNDU2IiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDApOwotCWFzc2VydEVxdWFscygiMDEyIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENhcmV0T2Zmc2V0KCkpOwkKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW52YWxpZFJhbmdlcy5sZW5ndGg7IGkrKykgewotCQlpbnQgc3RhcnQgPSBpbnZhbGlkUmFuZ2VzW2ldWzBdOwotCQlpbnQgZW5kID0gaW52YWxpZFJhbmdlc1tpXVsxXTsKLQkKLQkJdHJ5IHsKLQkJCXRleHQuc2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZmFpbCgic2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gZm9yIG91dCBvZiByYW5nZSIpOwotCQl9Ci0JfQkKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKXsKLQl0ZXh0LnNldFNlbGVjdGlvbkJhY2tncm91bmQoZ2V0Q29sb3IoWUVMTE9XKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIHRleHQuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpID09ICBnZXRDb2xvcihZRUxMT1cpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbkJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFiOiIsIHRleHQuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpLmVxdWFscyh0ZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pKSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCl7Ci0JdGV4dC5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKGdldENvbG9yKFJFRCkpOwotCWFzc2VydFRydWUoIjoxYToiLCB0ZXh0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKSA9PSAgZ2V0Q29sb3IoUkVEKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydFRydWUoIjoxYjoiLCB0ZXh0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKS5lcXVhbHModGV4dC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSgpewotCS8vIHNldFNlbGVjdGlvblJhbmdlIGFscmVhZHkgdGVzdGVkIGluIHRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTdHlsZVJhbmdlTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpewotCVN0eWxlUmFuZ2VbXSBzdHlsZXM7Ci0JU3RyaW5nIHRleHRTdHJpbmcgPSB0ZXh0U3RyaW5nKCk7Ci0KLQkvKiAKLQkJZGVmYXVsdFN0eWxlcwotCQkKLQkJCSgwLDQ4LFJFRCxZRUxMT1cpLCAKLQkJCSg1OCwxMCxCTFVFLENZQU4pLCAKLQkJCSg2OCwxMCxHUkVFTixQVVJQTEUpCi0JKi8KLQotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCQotCS8vIE5vIG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdHlsZXMKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDUsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gT3ZlcmxhcCBtaWRkbGUgb2Ygb25lIHN0eWxlIC0gcGFydGlhbAotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDUpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDIwLDI4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSg1OCwxMCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzRdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKG51bGwpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDApOwotCQotCS8vIE92ZXJsYXAgbWlkZGxlIG9mIG9uZSBzdHlsZSAtIGZ1bGwKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDU4LDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JLy8gT3ZlcmxhcCBlbmQgb2Ygb25lIHN0eWxlCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzOCwxNSxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDM4LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzOCwxNSxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCQotCS8vIE92ZXJsYXAgYmVnaW5uaW5nIG9mIG9uZSBzdHlsZQotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNTAsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXMubGVuZ3RoID09IDQpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTAsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDYwLDgsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1szXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JLy8gT3ZlcmxhcCBjb21wbGV0ZSBzdHlsZQotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNDgsMjAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQkJCQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDIwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2OCwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYmVmb3JlIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQ4LDEwLFJFRCxZRUxMT1cpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNTgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDEwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDE1LDEwLEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggc3R5bGUgYWZ0ZXIgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTEsNCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDExLDE0LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQkKLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGFmdGVyIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMTUsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMjAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMyxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDUsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxSRUQsWUVMTE9XKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDE1LFJFRCxZRUxMT1cpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxCTFVFLENZQU4pKTsKLQkvLyBzaG91bGQgYmUgbWVyZ2VkCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNyxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwxMCxCTFVFLENZQU4pKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjEyMyA0NTYgNzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMixCTFVFLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NzoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg4LDMsUkVELG51bGwpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIxMjMgNDU2IDc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0LDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg3LDQsQkxVRSxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg0LDcsQkxVRSxudWxsKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMTIzIDQ1NiA3ODkgQUJDIERFRiIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsNCxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDQsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTYsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwxNCxSRUQsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0LEJMVUUsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDQsMTUsUkVELG51bGwpKSk7Ci0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg0OCwyMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDIwLG51bGwsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwzOCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCWludCBsZW5ndGggPSB0ZXh0U3RyaW5nLmxlbmd0aCgpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLGxlbmd0aCxudWxsLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMyxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMyxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOSw4LEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLEdSRUVOLFBVUlBMRSkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxNyxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNSxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw5LFJFRCxZRUxMT1cpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDcsOSxSRUQsWUVMTE9XKSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNSxSRUQsWUVMTE9XKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDUsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMTAsR1JFRU4sUFVSUExFKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDMsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDMsMTAsR1JFRU4sUFVSUExFKSkpOwotCWFzc2VydFRydWUoIjo1OiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTMsMixCTFVFLENZQU4pKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJyZWRncmVlbmJsdWV5ZWxsb3djeWFucHVycGxlIik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMyxSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDQsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEyLDYsWUVMTE9XLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTgsNCxDWUFOLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjIsNixQVVJQTEUsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg4LDE0LG51bGwsUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlcy5sZW5ndGggPT0gNCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDMsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgzLDUsR1JFRU4sbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDgsMTQsbnVsbCxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoInJlZGdyZWVuYmx1ZXllbGxvd2N5YW5wdXJwbGUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNSxHUkVFTixudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDgsNCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNixZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxOCw0LENZQU4sbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyMiw2LFBVUlBMRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMjgsbnVsbCxudWxsKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo3OiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0KLQotLyoKLQl0ZXh0LnNldFRleHQoIlRoaXNcclxuYVx0QW5vdGhlciBsaW5lLiIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgzLDMsQkxVRSxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDcsOCxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNiwxLEJMVUUsbnVsbCkpOwotCVN0eWxlZFRleHRFdmVudCBldmVudCA9IG5ldyBTdHlsZWRUZXh0RXZlbnQoKTsKLQlldmVudC5kZXRhaWwgPSA2OwotCWV2ZW50LnRleHQgPSAiYVx0QW5vdGhlciBsaW5lLiI7Ci0JdGV4dC5ub3RpZnlMaXN0ZW5lcihTVC5MaW5lR2V0U3R5bGUsIGV2ZW50KTsKLQlhc3NlcnRUcnVlKCI6ODoiLCBldmVudC5zdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsNCxCTFVFLG51bGwpKSk7Ci0qLwotCi0KLQl0ZXh0LnNldFRleHQoIjEyMyA0NTYgNzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDQsMyxCTFVFLG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoOCwzLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNSxCTFVFLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDQsNixCTFVFLG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMCwxLFJFRCxudWxsKSkpOwotCi0KLQkvLyByZXNldCB0aGUgZW52aXJvbm1lbnQKLQl0ZXh0LmRpc3Bvc2UoKTsKLQl0ZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQodGV4dCk7Ci0KLQl0ZXh0U3RyaW5nID0gdGV4dFN0cmluZygpOwotCQkJCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDQ4LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMjAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBiZWZvcmUgaXQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNDgsMTAsUkVELFlFTExPVykpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMTAsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGV4dFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMjUsMTAsR1JFRU4sUFVSUExFKSk7Ci0JLy8gc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHN0eWxlIGFmdGVyIGl0Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDExLDQsQkxVRSxDWUFOKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgxMSwxNCxCTFVFLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSgyNSwxMCxHUkVFTixQVVJQTEUpKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KHRleHRTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDEwLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsMTAsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBzdHlsZSBhZnRlciBpdAotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDE1LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDMpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDIwLEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI1LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQotCi0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCwxMCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwzLFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTIsNSxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTAsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEwLDEwLEJMVUUsQ1lBTikpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDUiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw1LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEdSRUVOLFBVUlBMRSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LFJFRCxZRUxMT1cpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMTUsUkVELFlFTExPVykpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDUsUkVELFlFTExPVykpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw1LEJMVUUsQ1lBTikpOwotCS8vIHNob3VsZCBiZSBtZXJnZWQKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw3LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw1LFJFRCxZRUxMT1cpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg1LDEwLEJMVUUsQ1lBTikpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JdGV4dFN0cmluZyA9IHRleHRTdHJpbmcoKTsKLQotCi0JLyogCi0JCWRlZmF1bHRTdHlsZXMKLQkJCi0JCQkoMCw0OCxSRUQsWUVMTE9XKSwgCi0JCQkoNTgsMTAsQkxVRSxDWUFOKSwgCi0JCQkoNjgsMTAsR1JFRU4sUFVSUExFKQotCSovCi0KLQotCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkKLQkvLyBFbmQvQmVnaW5uaW5nIG92ZXJsYXAKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDM4LDI1LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMzgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDM4LDI1LFlFTExPVyxSRUQpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzJdLmVxdWFscyhnZXRTdHlsZSg2Myw1LEJMVUUsQ1lBTikpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDY4LDEwLEdSRUVOLFBVUlBMRSkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDYzLDEwLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzLmxlbmd0aCA9PSA0KTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNDgsUkVELFlFTExPVykpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDU4LDUsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoNjMsMTAsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZXNbM10uZXF1YWxzKGdldFN0eWxlKDczLDUsR1JFRU4sUFVSUExFKSkpOwotCi0KLQkvLyBDb21wbGV0ZSBvdmVybGFwCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhkZWZhdWx0U3R5bGVzKCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDc4LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsNzgsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKGRlZmF1bHRTdHlsZXMoKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsNjgsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw2OCxZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNjgsMTAsR1JFRU4sUFVSUExFKSkpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoZGVmYXVsdFN0eWxlcygpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNTgsMjAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCw0OCxSRUQsWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoNTgsMjAsWUVMTE9XLFJFRCkpKTsKLQotCi0JLy8gMS1OIGNvbXBsZXRlLCBiZWdpbm5pbmcKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCXRleHQuc2V0U3R5bGVSYW5nZXMoIAotCQluZXcgU3R5bGVSYW5nZVtdIHtnZXRTdHlsZSgwLDUsUkVELFJFRCksIGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSwKLQkJCWdldFN0eWxlKDEwLDUsQ1lBTixDWUFOKSwgZ2V0U3R5bGUoMTUsNSxCTFVFLEJMVUUpLAotCQkJZ2V0U3R5bGUoMjAsNSxHUkVFTixHUkVFTiksIGdldFN0eWxlKDI1LDUsUFVSUExFLFBVUlBMRSl9Ci0JKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyMyxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gMyk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsMjMsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDI4LDIsUFVSUExFLFBVUlBMRSkpKTsKLQkKLQkvLyBlbmQsIDEtTiBjb21wbGV0ZSwgYmVnaW5uaW5nCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyggCi0JCW5ldyBTdHlsZVJhbmdlW10ge2dldFN0eWxlKDAsNSxSRUQsUkVEKSwgZ2V0U3R5bGUoNSw1LFlFTExPVyxZRUxMT1cpLAotCQkJZ2V0U3R5bGUoMTAsNSxDWUFOLENZQU4pLCBnZXRTdHlsZSgxNSw1LEJMVUUsQkxVRSksCi0JCQlnZXRTdHlsZSgyMCw1LEdSRUVOLEdSRUVOKSwgZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKX0KLQkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMywxMixZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlcy5sZW5ndGggPT0gNSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDUsNSxZRUxMT1csWUVMTE9XKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1syXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMyxDWUFOLENZQU4pKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjM6Iiwgc3R5bGVzWzNdLmVxdWFscyhnZXRTdHlsZSgxMywxMixZRUxMT1csUkVEKSkpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1s0XS5lcXVhbHMoZ2V0U3R5bGUoMjUsNSxQVVJQTEUsUFVSUExFKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoIngvIik7CQotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDIsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwwLCIvIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMSxZRUxMT1csbnVsbCkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEsMixSRUQsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NDoiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFlFTExPVyxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMSwyLFJFRCxudWxsKSkpOwotCi0KLQl0ZXh0LnNldFRleHQoInh4eC8iKTsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCIvIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDIpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDAsMixSRUQsbnVsbCkpKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSgyLDIsWUVMTE9XLG51bGwpKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMixSRUQsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6NGE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDIsUkVELG51bGwpKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIHN0eWxlc1sxXS5lcXVhbHMoZ2V0U3R5bGUoMiwxLFlFTExPVyxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDMsMixSRUQsbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJ4eHgvIik7CQotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgwLDIsUkVELG51bGwpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwyLFlFTExPVyxudWxsKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDQsMCwiLyIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMiwxLFlFTExPVyxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMyxSRUQsbnVsbCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgwLDUsUkVELG51bGwpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgieHh4LyIpOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMCwyLFJFRCxudWxsKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMixZRUxMT1csbnVsbCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg0LDAsIi8iKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDIsMSxZRUxMT1csbnVsbCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxLDQsWUVMTE9XLG51bGwpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIHN0eWxlcy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMCwxLFJFRCxudWxsKSkpOwotCWFzc2VydFRydWUoIjo0YzoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDEsNCxZRUxMT1csbnVsbCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KCJOZXdcclxuIik7Ci0JU3R5bGVSYW5nZSBzdHlsZSA9IGdldFN0eWxlKDAsNSxudWxsLG51bGwpOwotCXN0eWxlLmZvbnRTdHlsZSA9IFNXVC5CT0xEOwkKLQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCS8vIHN0eWxlcyAoMCw1LEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsMCwiYSIpOyAvLyAiTmV3YVxyXG4iCi0JLy8gc3R5bGVzICgwLDMsQk9MRCksICg0LDIsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDQpOwotCXN0eWxlLnN0YXJ0ID0gMzsKLQlzdHlsZS5sZW5ndGggPSAxOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDYsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJhIik7IC8vICJhTmV3YVxyXG4iCi0JLy8gc3R5bGVzICgxLDYsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDEpOwotCXN0eWxlLnN0YXJ0ID0gMDsKLQlzdHlsZS5sZW5ndGggPSAxOwotCXRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JLy8gc3R5bGVzICgwLDcsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwxLCIiKTsgLy8gIk5ld2FcclxuIgotCS8vIHN0eWxlcyAoMCw2LEJPTEQpCi0JZm9yIChpbnQgaT0wOyBpPDY7IGkrKykgewotCQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KGkpOwotCQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZS5mb250U3R5bGUgPT0gU1dULkJPTEQpOwotCX0KLQotCi0JdGV4dC5zZXRUZXh0KCJOZXcgTCAxXHJcbk5ldyBMIDJcclxuIik7Ci0Jc3R5bGUgPSBnZXRTdHlsZSgwLDksbnVsbCxudWxsKTsKLQlzdHlsZS5mb250U3R5bGUgPSBTV1QuQk9MRDsJCi0JdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkvLyBzdHlsZXMgKDAsOSxCT0xEKQotCXRleHQucmVwbGFjZVRleHRSYW5nZSg3LDAsImEiKTsKLQkvLyBzdHlsZXMgKDAsNyxCT0xEKSwgKDgsMixCT0xEKQotCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoOCk7Ci0JaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJc3R5bGUuc3RhcnQgPSA3OwotCQlzdHlsZS5sZW5ndGggPSAxOwotCQl0ZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCX0KLQkvLyBzdHlsZXMgKDAsMTAsQk9MRCkKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNCwwLCJhIik7Ci0JLy8gc3R5bGVzICgwLDQsQk9MRCksICg1LDYsQk9MRCkKLQlzdHlsZSA9IHRleHQuZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0KDUpOwotCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCXN0eWxlLnN0YXJ0ID0gNDsKLQkJc3R5bGUubGVuZ3RoID0gMTsKLQkJdGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQl9Ci0JLy8gc3R5bGVzICgwLDExLEJPTEQpCi0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsMywiIik7Ci0JLy8gc3R5bGVzICgwLDgsQk9MRCkKLQlmb3IgKGludCBpPTA7IGk8ODsgaSsrKSB7Ci0JCXN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQoaSk7Ci0JCWFzc2VydFRydWUoIjo1YToiLCBzdHlsZS5mb250U3R5bGUgPT0gU1dULkJPTEQpOwotCX0KLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JCi0JLy8JCQkJCSIwMTIzNDU2Nzg5MDEyMyIKLQl0ZXh0U3RyaW5nID0gCQkiMTIzNCAxMjM0IDEyMzQiOwotCi0KLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsMixZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxYToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNywyLFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg2LDIsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6M2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsNCxZRUxMT1csUkVEKSk7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjo0YToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDMsNixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw0LFlFTExPVyxSRUQpKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjVhOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw2LFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0IDEyMzQgMTIzNCIpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NmE6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NmE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQoIjEyMzQgMTIzNCAxMjM0Iik7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDMsMTAsWUVMTE9XLFJFRCkpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6N2E6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6N2E6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDEwLFlFTExPVyxSRUQpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSwyLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MWI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjoxYjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNywyLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6MmI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDIsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNiwyLEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzLmxlbmd0aCA9PSAzKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDEsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6M2I6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg2LDIsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjozYjoiLCBzdHlsZXNbMl0uZXF1YWxzKGdldFN0eWxlKDgsMSxZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMyw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NGI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgzLDQsQkxVRSxDWUFOKSkpOwotCWFzc2VydFRydWUoIjo0YjoiLCBzdHlsZXNbMV0uZXF1YWxzKGdldFN0eWxlKDcsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNyw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAyKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpKTsKLQlhc3NlcnRUcnVlKCI6NWI6Iiwgc3R5bGVzWzFdLmVxdWFscyhnZXRTdHlsZSg3LDQsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6NmI6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6NmI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSkpOwotCXRleHQuc2V0VGV4dCgiMTIzNCAxMjM0IDEyMzQiKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMywxMCxCTFVFLENZQU4pKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjdiOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMywxMCxCTFVFLENZQU4pKSk7Ci0KLQotCS8vIHJlc2V0IHRoZSBlbnZpcm9ubWVudAotCXRleHQuZGlzcG9zZSgpOwotCXRleHQgPSBuZXcgU3R5bGVkVGV4dChzaGVsbCwgU1dULk5VTEwpOwotCXNldFdpZGdldCh0ZXh0KTsKLQotCS8vCQkJIAkJIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMyIKLQlTdHJpbmcgdGVzdFN0cmluZz0JIjEyMzQgMTIzNCAxMjM0IDEyMzQgMTIzNCI7Ci0JCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTIsMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFlFTExPVyxSRUQpKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMTAsMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoyOiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgxMCwyLFlFTExPVyxSRUQpKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEyLDQsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjozOiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoMTAsMixZRUxMT1csUkVEKSkpOwotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDgsNCwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg4LDIsWUVMTE9XLFJFRCkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoOCw2LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjU6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgxMCw2LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg4LDEyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVzLmxlbmd0aCA9PSAwKTsKLQkKLQkvLwkJCSAJCQkiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzIgotCS8vCVN0cmluZyB0ZXN0U3RyaW5nPQkiMTIzNCAxMjM0IDEyMzQgMTIzNCAxMjM0IjsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDUsNywiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo4OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsNywiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjo5OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjk6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSg1LDIsQkxVRSxDWUFOKSkpOwotCi0KLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsMTAsIiIpOwotCXN0eWxlcyA9IHRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzLmxlbmd0aCA9PSAxKTsKLQlhc3NlcnRUcnVlKCI6MTA6Iiwgc3R5bGVzWzBdLmVxdWFscyhnZXRTdHlsZSgyLDIsWUVMTE9XLFJFRCkpKTsKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDUsNCxCTFVFLENZQU4pKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTAsNCxZRUxMT1csUkVEKSk7Ci0JdGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsOSwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxMToiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0KLQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSw5LCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjEyOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSgzLDEzLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjExOiIsIHN0eWxlcy5sZW5ndGggPT0gMCk7Ci0KLQotCS8vCQkJIAkJCSIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMiCi0JLy8JU3RyaW5nIHRlc3RTdHJpbmc9CSIxMjM0IDEyMzQgMTIzNCAxMjM0IDEyMzQiOwotCQotCXRleHQuc2V0VGV4dCh0ZXN0U3RyaW5nKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxMCw0LFlFTExPVyxSRUQpKTsKLQl0ZXh0LnNldFN0eWxlUmFuZ2UoZ2V0U3R5bGUoMTUsNCxHUkVFTixQVVJQTEUpKTsKLQl0ZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNywxMiwiIik7Ci0Jc3R5bGVzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXMubGVuZ3RoID09IDEpOwotCWFzc2VydFRydWUoIjoxNDoiLCBzdHlsZXNbMF0uZXF1YWxzKGdldFN0eWxlKDUsMixCTFVFLENZQU4pKSk7Ci0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSw0LEdSRUVOLFBVUlBMRSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg1LDEyLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE1OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSwyLEdSRUVOLFBVUlBMRSkpKTsKLQotCi0JdGV4dC5zZXRUZXh0KHRlc3RTdHJpbmcpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSg1LDQsQkxVRSxDWUFOKSk7Ci0JdGV4dC5zZXRTdHlsZVJhbmdlKGdldFN0eWxlKDEwLDQsWUVMTE9XLFJFRCkpOwotCXRleHQuc2V0U3R5bGVSYW5nZShnZXRTdHlsZSgxNSw0LEdSRUVOLFBVUlBMRSkpOwotCXRleHQucmVwbGFjZVRleHRSYW5nZSg5LDEwLCIiKTsKLQlzdHlsZXMgPSB0ZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiIsIHN0eWxlcy5sZW5ndGggPT0gMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE2OiIsIHN0eWxlc1swXS5lcXVhbHMoZ2V0U3R5bGUoNSw0LEJMVUUsQ1lBTikpKTsKLQotCi0JLy8gcmVzZXQgdGhlIGVudmlyb25tZW50Ci0JdGV4dC5kaXNwb3NlKCk7Ci0JdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCi0JU3R5bGVSYW5nZSBzdHlsZTEgPSBnZXRTdHlsZSgwLDAsbnVsbCxudWxsKTsKLQotCi0JU3R5bGVSYW5nZSBzdHlsZTIgPSBnZXRTdHlsZSgwLDAsUkVELFlFTExPVyk7Ci0KLQotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTEuZXF1YWxzKHN0eWxlMikpOwotCWFzc2VydFRydWUoIjoxOiIsICFzdHlsZTEuc2ltaWxhclRvKHN0eWxlMikpOwotCi0KLQlhc3NlcnRUcnVlKCI6MToiLCAhc3R5bGUyLmVxdWFscyhzdHlsZTEpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjE6IiwgIXN0eWxlMi5zaW1pbGFyVG8oc3R5bGUxKSk7Ci0KLQotCi0Jc3R5bGUxID0gZ2V0U3R5bGUoMCwxMCxSRUQsWUVMTE9XKTsKLQlzdHlsZTIgPSBnZXRTdHlsZSgxMSw1LFJFRCxZRUxMT1cpOwotCi0KLQlhc3NlcnRUcnVlKCI6MjoiLCAhc3R5bGUxLmVxdWFscyhzdHlsZTIpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjI6IiwgIXN0eWxlMi5lcXVhbHMoc3R5bGUxKSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGUxLnNpbWlsYXJUbyhzdHlsZTIpKTsKLQotCi0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGUyLnNpbWlsYXJUbyhzdHlsZTEpKTsKLQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3R5bGVSYW5nZXMkTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVSYW5nZSgpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVN0eWxlUmFuZ2VbXSByYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVtdIHsKLQkJbmV3IFN0eWxlUmFuZ2UoMCwgMSwgZ2V0Q29sb3IoUkVEKSwgbnVsbCksIAotCQluZXcgU3R5bGVSYW5nZSgyLCAxLCBnZXRDb2xvcihSRUQpLCBudWxsKX07Ci0JCi0JdGV4dC5zZXRUZXh0KCJMaW5lMFxyXG4iKTsKLQl0cnkgewotCQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCi0JdGV4dC5zZXRTdHlsZVJhbmdlcyhyYW5nZXMpOwotCVN0eWxlUmFuZ2VbXSBjdXJyZW50UmFuZ2VzID0gdGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCWFzc2VydEVxdWFscyhyYW5nZXMubGVuZ3RoLCBjdXJyZW50UmFuZ2VzLmxlbmd0aCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50UmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhyYW5nZXNbaV0sIGN1cnJlbnRSYW5nZXNbaV0pOwotCX0KLQl0ZXh0LnNldFN0eWxlUmFuZ2VzKG5ldyBTdHlsZVJhbmdlW10ge30pOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFN0eWxlUmFuZ2VzKCkubGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUYWJzSSgpewotCXRleHQuc2V0VGFicygxKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRhYnMoKSA9PSAxKTsKLQkKLQl0ZXh0LnNldFRhYnMoOCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JdGV4dC5zZXRUZXh0KCJMaW5lXHQxXHJcbiIpOwotCXRleHQuc2V0VGFicyg3KTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRhYnMoKSA9PSA3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKXsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JdHJ5IHsKLQkJdGV4dC5zZXRUZXh0KG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9CQotCWFzc2VydFRydWUoZXhjZXB0aW9uVGhyb3duKTsKLQotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGltaXRJKCl7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci0KLQl0ZXh0LnNldFRleHRMaW1pdCgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAtMSk7Ci0KLQl0cnkgewotCQl0ZXh0LnNldFRleHRMaW1pdCgwKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGV4Y2VwdGlvblRocm93biA9PSB0cnVlKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BJbmRleEkoKXsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0KLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbkxpbmUwYVxyXG4iKTsKLQotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0VG9wSW5kZXgoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgyKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCB0ZXh0LmdldFRvcEluZGV4KCkgPT0gMik7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmk6IiwgdGV4dC5nZXRUb3BJbmRleCgpID09IDApOwotfQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BQaXhlbEkoKXsKLQlpbnQgbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCQotCXRleHQuc2V0VG9wUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JCi0JdGV4dC5zZXRUb3BQaXhlbCgtMik7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wUGl4ZWwoLTEpOwotCWFzc2VydFRydWUoIjpkOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDEpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAxKTsKLQl0ZXh0LnNldFRvcFBpeGVsKDIgKiBsaW5lSGVpZ2h0KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMiAqIGxpbmVIZWlnaHQpOwotCXRleHQuc2V0VG9wUGl4ZWwoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmc6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wUGl4ZWwoMyAqIGxpbmVIZWlnaHQpOwotCWFzc2VydFRydWUoIjpoOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAyICogbGluZUhlaWdodCk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQuc2V0VG9wUGl4ZWwoMiAqIGxpbmVIZWlnaHQpOwotCWFzc2VydFRydWUoIjppOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V29yZFdyYXBaKCl7Ci0JU3RyaW5nIHRlc3RTdHJpbmcgPSAiTGluZTFcbkxpbmUyIjsKLQkKLQl0ZXh0LnNldFdvcmRXcmFwKHRydWUpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0V29yZFdyYXAoKSk7Ci0JdGV4dC5zZXRXb3JkV3JhcChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRXb3JkV3JhcCgpID09IGZhbHNlKTsKLQl0ZXh0LnNldFdvcmRXcmFwKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFdvcmRXcmFwKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0V29yZFdyYXAodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRXb3JkV3JhcCgpKTsKLQkKLQl0ZXh0LnNldFRleHQodGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCB0ZXN0U3RyaW5nLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZjoiLCAyLCB0ZXh0LmdldExpbmVDb3VudCgpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuIik7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb25SYW5nZSg1LCAyKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQmlkaVNlZ21lbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0JpZGlTZWdtZW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJpZGlDb2xvcmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRPZmZzZXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoYXJDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RG91YmxlQ2xpY2tFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG9yaXpvbnRhbEluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3Jpem9udGFsUGl4ZWwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEtleUJpbmRpbmdJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQmFja2dyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVDb3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZURlbGltaXRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lUGl4ZWwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPZmZzZXRBdExpbmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPZmZzZXRBdExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0T3JpZW50YXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvblJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25UZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZUF0T2Zmc2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGVSYW5nZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlUmFuZ2VzSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dExpbWl0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0UmFuZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcFBpeGVsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXb3JkV3JhcCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZUFjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wcmludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZWRyYXdJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3UmFuZ2VJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGluZUJhY2tncm91bmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVCYWNrZ3JvdW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUxpbmVTdHlsZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZVN0eWxlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCaWRpQ29sb3JpbmdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FyZXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREb3VibGVDbGlja0VuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3Jpem9udGFsSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRLZXlCaW5kaW5nSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmllbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdHlsZVJhbmdlcyRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcFBpeGVsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V29yZFdyYXBaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciIpKSB0ZXN0X2FkZEJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZEV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpKSB0ZXN0X2FkZExpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIikpIHRlc3RfYWRkTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyIikpIHRlc3RfYWRkVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJhY2tncm91bmQiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCaWRpQ29sb3JpbmciKSkgdGVzdF9nZXRCaWRpQ29sb3JpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0T2Zmc2V0IikpIHRlc3RfZ2V0Q2FyZXRPZmZzZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoYXJDb3VudCIpKSB0ZXN0X2dldENoYXJDb3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGVudCIpKSB0ZXN0X2dldENvbnRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpKSB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdGFibGUiKSkgdGVzdF9nZXRFZGl0YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvcml6b250YWxJbmRleCIpKSB0ZXN0X2dldEhvcml6b250YWxJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsIikpIHRlc3RfZ2V0SG9yaXpvbnRhbFBpeGVsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRLZXlCaW5kaW5nSSIpKSB0ZXN0X2dldEtleUJpbmRpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQXRPZmZzZXRJIikpIHRlc3RfZ2V0TGluZUF0T2Zmc2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUJhY2tncm91bmRJIikpIHRlc3RfZ2V0TGluZUJhY2tncm91bmRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQ291bnQiKSkgdGVzdF9nZXRMaW5lQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKSkgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSGVpZ2h0IikpIHRlc3RfZ2V0TGluZUhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUluZGV4IikpIHRlc3RfZ2V0TGluZUluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lUGl4ZWwiKSkgdGVzdF9nZXRMaW5lUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uQXRPZmZzZXRJIikpIHRlc3RfZ2V0TG9jYXRpb25BdE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9mZnNldEF0TGluZUkiKSkgdGVzdF9nZXRPZmZzZXRBdExpbmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPZmZzZXRBdExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2dldE9mZnNldEF0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmllbnRhdGlvbiIpKSB0ZXN0X2dldE9yaWVudGF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkJhY2tncm91bmQiKSkgdGVzdF9nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kIikpIHRlc3RfZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uUmFuZ2UiKSkgdGVzdF9nZXRTZWxlY3Rpb25SYW5nZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uVGV4dCIpKSB0ZXN0X2dldFNlbGVjdGlvblRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlUmFuZ2VBdE9mZnNldEkiKSkgdGVzdF9nZXRTdHlsZVJhbmdlQXRPZmZzZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZVJhbmdlcyIpKSB0ZXN0X2dldFN0eWxlUmFuZ2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZVJhbmdlc0lJIikpIHRlc3RfZ2V0U3R5bGVSYW5nZXNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFicyIpKSB0ZXN0X2dldFRhYnMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SUkiKSkgdGVzdF9nZXRUZXh0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHRMaW1pdCIpKSB0ZXN0X2dldFRleHRMaW1pdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dFJhbmdlSUkiKSkgdGVzdF9nZXRUZXh0UmFuZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wUGl4ZWwiKSkgdGVzdF9nZXRUb3BQaXhlbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0V29yZFdyYXAiKSkgdGVzdF9nZXRXb3JkV3JhcCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW52b2tlQWN0aW9uSSIpKSB0ZXN0X2ludm9rZUFjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Bhc3RlIikpIHRlc3RfcGFzdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ByaW50IikpIHRlc3RfcHJpbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyIikpIHRlc3RfcHJpbnRMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucyIpKSB0ZXN0X3ByaW50TG9yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dFByaW50T3B0aW9ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3IikpIHRlc3RfcmVkcmF3KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXdJSUlJWiIpKSB0ZXN0X3JlZHJhd0lJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXdSYW5nZUlJWiIpKSB0ZXN0X3JlZHJhd1JhbmdlSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVCaWRpU2VnbWVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fQmlkaVNlZ21lbnRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUJpZGlTZWdtZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9CaWRpU2VnbWVudExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVFeHRlbmRlZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fRXh0ZW5kZWRNb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV4dGVuZGVkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9FeHRlbmRlZE1vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMaW5lQmFja2dyb3VuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fTGluZUJhY2tncm91bmRMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUxpbmVCYWNrZ3JvdW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lQmFja2dyb3VuZExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0xpbmVTdHlsZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGluZVN0eWxlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9MaW5lU3R5bGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlcGxhY2VTdHlsZVJhbmdlc0lJJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9yZXBsYWNlU3R5bGVSYW5nZXNJSSRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJpZGlDb2xvcmluZ1oiKSkgdGVzdF9zZXRCaWRpQ29sb3JpbmdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDYXJldExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCIpKSB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDYXJldE9mZnNldEkiKSkgdGVzdF9zZXRDYXJldE9mZnNldEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpKSB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IiKSkgdGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWiIpKSB0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVkaXRhYmxlWiIpKSB0ZXN0X3NldEVkaXRhYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhvcml6b250YWxJbmRleEkiKSkgdGVzdF9zZXRIb3Jpem9udGFsSW5kZXhJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRIb3Jpem9udGFsUGl4ZWxJIikpIHRlc3Rfc2V0SG9yaXpvbnRhbFBpeGVsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0S2V5QmluZGluZ0lJIikpIHRlc3Rfc2V0S2V5QmluZGluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lQmFja2dyb3VuZElJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldExpbmVCYWNrZ3JvdW5kSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRPcmllbnRhdGlvbkkiKSkgdGVzdF9zZXRPcmllbnRhdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0U2VsZWN0aW9uQmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0U2VsZWN0aW9uRm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JSSIpKSB0ZXN0X3NldFNlbGVjdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uUmFuZ2VJSSIpKSB0ZXN0X3NldFNlbGVjdGlvblJhbmdlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN0eWxlUmFuZ2VMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlIikpIHRlc3Rfc2V0U3R5bGVSYW5nZUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN0eWxlUmFuZ2VzJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlUmFuZ2UiKSkgdGVzdF9zZXRTdHlsZVJhbmdlcyRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZVJhbmdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUYWJzSSIpKSB0ZXN0X3NldFRhYnNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGltaXRJIikpIHRlc3Rfc2V0VGV4dExpbWl0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJbmRleEkiKSkgdGVzdF9zZXRUb3BJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcFBpeGVsSSIpKSB0ZXN0X3NldFRvcFBpeGVsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V29yZFdyYXBaIikpIHRlc3Rfc2V0V29yZFdyYXBaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93U2VsZWN0aW9uIikpIHRlc3Rfc2hvd1NlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5IikpIHRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLS8qKgotICogUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgMTk5ODUKLSAqLwotcHJvdGVjdGVkIHZvaWQgdGVzdFJ0ZkNvcHkoKSB7Ci0JU3RyaW5nIGxpbmVzID0gIkxpbmUwXG5MaW5lMVxuTGluZTJcbkxpbmUzXG5MaW5lNFxuTGluZTUiOwotCWZpbmFsIGludFtdIGxpbmVzQ2FsbGVkID0gbmV3IGludFtdIHswfTsKLQlMaW5lU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5lU3R5bGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSAoU3R5bGVkVGV4dCkgZXZlbnQud2lkZ2V0OwotCQkJaW50IGxpbmVJbmRleCA9IHN0eWxlZFRleHQuZ2V0TGluZUF0T2Zmc2V0KGV2ZW50LmxpbmVPZmZzZXQpOwotCQkJaW50IGxpbmVTdGFydCA9IGV2ZW50LmxpbmVPZmZzZXQ7Ci0JCQlpbnQgbGluZUVuZCA9IGxpbmVTdGFydCArIGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpOwotCQkJU3R5bGVSYW5nZSBnb29kUmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgwLCAxLCByZWQsIHJlZCk7Ci0JCQkKLQkJCWV2ZW50LnN0eWxlcyA9IG5ldyBTdHlsZVJhbmdlWzJdOwotCQkJc3dpdGNoIChsaW5lSW5kZXggJSA2KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQsIDEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQlldmVudC5zdHlsZXNbMF0gPSBnb29kUmFuZ2U7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gZ29vZFJhbmdlOwotCQkJCQlldmVudC5zdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZShsaW5lRW5kIC0gMSwgLTEsIHJlZCwgcmVkKTsKLQkJCQkJbGluZXNDYWxsZWRbMF0rKzsJCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJZXZlbnQuc3R5bGVzWzBdID0gZ29vZFJhbmdlOwotCQkJCQlldmVudC5zdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZShsaW5lU3RhcnQsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7CQotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVTdGFydCwgMSwgcmVkLCByZWQpOwotCQkJCQlldmVudC5zdHlsZXNbMV0gPSBuZXcgU3R5bGVSYW5nZShsaW5lU3RhcnQsIC0xLCByZWQsIHJlZCk7Ci0JCQkJCWxpbmVzQ2FsbGVkWzBdKys7CQotCQkJCQlicmVhazsKLQkJCQljYXNlIDU6Ci0JCQkJCWV2ZW50LnN0eWxlc1swXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQgLyAyLCAxLCByZWQsIHJlZCk7Ci0JCQkJCWV2ZW50LnN0eWxlc1sxXSA9IG5ldyBTdHlsZVJhbmdlKGxpbmVFbmQgLyAyLCAtMSwgcmVkLCByZWQpOwotCQkJCQlsaW5lc0NhbGxlZFswXSsrOwkKLQkJCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQl9OwotCXRleHQuc2V0VGV4dChsaW5lcyk7CQotCS8vIGNhdXNlIFN0eWxlZFRleHQgdG8gY2FsbCB0aGUgbGlzdGVuZXIuIAotCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCXRleHQuYWRkTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuY29weSgpOwotCWFzc2VydFRydWUoIm5vdCBhbGwgbGluZXMgdGVzdGVkIGZvciBSVEYgY29weSIsIGxpbmVzQ2FsbGVkWzBdID09IHRleHQuZ2V0TGluZUNvdW50KCkpOwotCQotCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKHRleHQuZ2V0RGlzcGxheSgpKTsKLQlSVEZUcmFuc2ZlciBydGZUcmFuZmVyID0gUlRGVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQlTdHJpbmcgY2xpcGJvYXJkVGV4dCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhydGZUcmFuZmVyKTsKLQlhc3NlcnRUcnVlKCJSVEYgY29weSBmYWlsZWQiLCBjbGlwYm9hcmRUZXh0Lmxlbmd0aCgpID4gMCk7Ci0KLQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCXRleHQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnYScsIDAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMTAsIDUwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODhlOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLkJpZGlVdGlsOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHRDb250ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHRDb250ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JaW50IFhJTlNFVCA9IDA7Ci0KLQljbGFzcyBDb250ZW50SW1wbGVtZW50YXRpb24gaW1wbGVtZW50cyBTdHlsZWRUZXh0Q29udGVudCB7Ci0JCVN0cmluZyB0ZXh0Q29udGVudCA9ICIiOwotCQkKLQkJcHVibGljIHZvaWQgYWRkVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcil7Ci0JCX0KLQkJcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuICJnZXRMaW5lIjsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGdldExpbmVDb3VudCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJCXJldHVybiAiZ2V0TGluZURlbGltaXRlciI7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gdGV4dENvbnRlbnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJCXRleHRDb250ZW50ID0gdGV4dDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCQl0ZXh0Q29udGVudCA9IHRleHQ7Ci0JCX0KLQl9Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IG5ldyBDb250ZW50SW1wbGVtZW50YXRpb24oKTsKLQlTaGVsbCBzaGVsbDsKLQlTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJpdmF0ZSBib29sZWFuIGlzQmlkaSgpIHsKLQlyZXR1cm4gQmlkaVV0aWwuaXNCaWRpUGxhdGZvcm0oKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWlmIChpc0JpZGkoKSkgWElOU0VUID0gMjsKLQllbHNlIFhJTlNFVCA9IDA7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLQlzdHlsZWRUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2hlbGwsIFNXVC5OVUxMKTsKLQlzdHlsZWRUZXh0LnNldENvbnRlbnQoY29udGVudCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkvLyBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHRlc3QsIG5vdCBjYWxsZWQgYnkgU3R5bGVkVGV4dAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoYXJDb3VudCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBzdHlsZWRUZXh0LmdldENoYXJDb3VudCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVBdE9mZnNldEkoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc3R5bGVkVGV4dC5nZXRMaW5lQXRPZmZzZXQoMCkgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUNvdW50KCkgewotCWFzc2VydFRydWUoIjpkOiIsIHN0eWxlZFRleHQuZ2V0TGluZUNvdW50KCkgPT0gMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZURlbGltaXRlcigpIHsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzdHlsZWRUZXh0LmdldExpbmVEZWxpbWl0ZXIoKS5lcXVhbHMoImdldExpbmVEZWxpbWl0ZXIiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZUkoKSB7Ci0JLy8gd2lsbCBpbmRpcmVjdGx5IGNhdXNlIGdldExpbmUgdG8gYmUgY2FsbGVkCi0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc3R5bGVkVGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KDApLmVxdWFscyhuZXcgUG9pbnQoWElOU0VULDApKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSgpIHsKLQkvLyB3aWxsIGluZGlyZWN0bHkgY2F1c2UgZ2V0T2Zmc2V0QXRMaW5lIHRvIGJlIGNhbGxlZAotCWFzc2VydFRydWUoIjpmOiIsIHN0eWxlZFRleHQuZ2V0TG9jYXRpb25BdE9mZnNldCgwKS5lcXVhbHMobmV3IFBvaW50KFhJTlNFVCwwKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRSYW5nZUlJKCkgewotCWFzc2VydFRydWUoIjpnOiIsIHN0eWxlZFRleHQuZ2V0VGV4dFJhbmdlKDAsMCkuZXF1YWxzKCIiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKCkgewotCS8vIGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdGVzdCwgbm90IGNhbGxlZCBieSBTdHlsZWRUZXh0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVwbGFjZVRleHRSYW5nZUlJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsMCwidGVzdDEiKTsKLQlhc3NlcnRUcnVlKCI6aDoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoInRlc3QxIikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwwLCJ0ZXN0MiIpOwotCWFzc2VydFRydWUoIjppOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygidGVzdDIiKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRleHRDaGFuZ2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hhckNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQXRPZmZzZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPZmZzZXRBdExpbmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0UmFuZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIikpIHRlc3RfYWRkVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGFyQ291bnQiKSkgdGVzdF9nZXRDaGFyQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVBdE9mZnNldEkiKSkgdGVzdF9nZXRMaW5lQXRPZmZzZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lQ291bnQiKSkgdGVzdF9nZXRMaW5lQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVEZWxpbWl0ZXIiKSkgdGVzdF9nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lSSIpKSB0ZXN0X2dldExpbmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPZmZzZXRBdExpbmVJIikpIHRlc3RfZ2V0T2Zmc2V0QXRMaW5lSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dFJhbmdlSUkiKSkgdGVzdF9nZXRUZXh0UmFuZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZXBsYWNlVGV4dFJhbmdlSUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlcGxhY2VUZXh0UmFuZ2VJSUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDg1Nzk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlQ3Vyc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVDdXJzb3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVDdXJzb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUN1cnNvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSb3coKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJvdyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25JSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVDdXJzb3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um93Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbiIpKSB0ZXN0X2dldENvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Um93IikpIHRlc3RfZ2V0Um93KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JSSIpKSB0ZXN0X3NldFNlbGVjdGlvbklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3MmZlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVFZGl0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVFZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbHVtbkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbHVtbkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZUVkaXRvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb2x1bW5JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW4iKSkgdGVzdF9nZXRDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW0iKSkgdGVzdF9nZXRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb2x1bW5JIikpIHRlc3Rfc2V0Q29sdW1uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtSSIpKSB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIikpIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTA3OTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdGFibGVUcmVlID0gbmV3IFRhYmxlVHJlZShzaGVsbCwgc3R5bGUgPSBTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0YWJsZVRyZWUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGVzZWxlY3RBbGwgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1IZWlnaHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1IZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JVGFibGVUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCBTV1QuTk9ORSk7Ci0JfQotCWFzc2VydEVxdWFscygiTVVMVEk6IEFmdGVyIGFkZGluZyBpdGVtcywgYnV0IGJlZm9yZSBzZWxlY3RpbmcgYW55IiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSwgdGFibGVUcmVlLmdldFNlbGVjdGlvbigpKTsKLQotCS8vIGdldFNlbGVjdGlvbigpIGlzIGZ1cnRoZXIgdGVzdGVkIGluIHRlc3Rfc2VsZWN0QWxsIGFuZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JVGFibGVUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCBTV1QuTk9ORSk7Ci0JfQotCWFzc2VydEVxdWFscygiTVVMVEk6IEFmdGVyIGFkZGluZyBpdGVtcywgYnV0IGJlZm9yZSBzZWxlY3RpbmcgYW55IiwgMCwgdGFibGVUcmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCS8vIGdldFNlbGVjdGlvbkNvdW50KCkgaXMgZnVydGhlciB0ZXN0ZWQgaW4gdGVzdF9zZWxlY3RBbGwgYW5kIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUYWJsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGFibGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUFsbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCS8qIE92ZXJyaWRpbmcgdGVzdF9nZXRDaGlsZHJlbiBmcm9tIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlCi0JICogdG8gZG8gbm90aGluZywgYmVjYXVzZSB0aGUgY2hpbGQgb2YgYSBUYWJsZVRyZWUgaXMgYWx3YXlzIGEgVGFibGUuCi0JICovCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0QWxsKCkgewotCS8qIEZVVFVSRTogU2hvdWxkIGFsc28gYWRkIHN1Yi1ub2RlcywgYW5kIHRlc3QgYm90aCBzaW5nbGUgYW5kIG11bHRpIHdpdGggdGhvc2UuCi0JICogaS5lLiBzdWJpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKGl0ZW1zW2ldLCBTV1QuTk9ORSk7ICovCi0KLQlzZWxlY3RBbGxfaGVscGVyKCJFbXB0eSB0YWJsZSB0cmVlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0KLQlpbnQgbnVtYmVyID0gODsKLQlUYWJsZVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0Jc2VsZWN0QWxsX2hlbHBlcigic2VsZWN0QWxsKCkiLCBpdGVtcyk7Ci0KLQkKLQkvKiBOb3cgcnVuIHRoZSBzYW1lIHRlc3RzIG9uIGEgc2luZ2xlLXNlbGVjdCBUYWJsZVRyZWUuICovCi0Jc2luZ2xlU2VsZWN0KCk7Ci0Jc2VsZWN0QWxsX2hlbHBlcigiRW1wdHkgdGFibGUgdHJlZSIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCi0JaXRlbXMgPSBuZXcgVGFibGVUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbSh0YWJsZVRyZWUsIFNXVC5OT05FKTsKLQl9Ci0Jc2VsZWN0QWxsX2hlbHBlcigic2VsZWN0QWxsKCkiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQkvKiBGVVRVUkU6IFNob3VsZCBhbHNvIGFkZCBzdWItbm9kZXMsIGFuZCB0ZXN0IGJvdGggc2luZ2xlIGFuZCBtdWx0aSB3aXRoIHRob3NlLgotCSAqIGkuZS4gc3ViaXRlbXNbaV0gPSBuZXcgVGFibGVUcmVlSXRlbShpdGVtc1tpXSwgU1dULk5PTkUpOyAqLwotCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIGVtcHR5IHRhYmxlIHRyZWUiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQl0cnkgewotCQl0YWJsZVRyZWUuc2V0U2VsZWN0aW9uKChUYWJsZVRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJNVUxUSTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gZW1wdHkgdGFibGUgdHJlZSIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludCBudW1iZXIgPSA4OwotCVRhYmxlVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgMCk7Ci0JfQotCQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBubyBpdGVtcyBpbiB0YWJsZSB0cmVlIHdpdGggaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQl0cnkgewotCQl0YWJsZVRyZWUuc2V0U2VsZWN0aW9uKChUYWJsZVRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJNVUxUSTogTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW5nIG51bGwgaW4gdGFibGUgdHJlZSB3aXRoIGl0ZW1zIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtICIgKyBpLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1tpXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zW2ldfSk7Ci0JfQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBpdGVtcyIsIGl0ZW1zLCBpdGVtcyk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHRhYmxlVHJlZS5nZXRJdGVtcygpIiwgdGFibGVUcmVlLmdldEl0ZW1zKCksIHRhYmxlVHJlZS5nZXRJdGVtcygpKTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMiBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDIgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1szXSwgaXRlbXNbNl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1szXSwgaXRlbXNbNl19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbNV0sIGl0ZW1zWzddfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgdW5vcmRlcmVkIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHVub3JkZXJlZCBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzVdLCBpdGVtc1syXSwgaXRlbXNbN119LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbNV0sIGl0ZW1zWzddfSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgcmV2ZXJzZS1vcmRlciBjb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF0sIGl0ZW1zWzNdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyByZXZlcnNlLW9yZGVyIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbN10sIGl0ZW1zWzVdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1s1XSwgaXRlbXNbN119KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3Qgc2FtZSBpdGVtIHR3aWNlIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzRdLCBpdGVtc1swXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzBdLCBpdGVtc1s0XX0pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBzYW1lIGl0ZW0gbXVsdGlwbGUgdGltZXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgbXVsdGlwbGUgaXRlbXMgbXVsdGlwbGUgdGltZXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzRdfSk7Ci0KLQkKLQkvKiBOb3cgcnVuIHRoZSBzYW1lIHRlc3RzIG9uIGEgc2luZ2xlLXNlbGVjdCBUYWJsZVRyZWUuICovCi0Jc2luZ2xlU2VsZWN0KCk7Ci0JCi0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IG5vIGl0ZW1zIGluIGVtcHR5IHRhYmxlIHRyZWUiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQl0cnkgewotCQl0YWJsZVRyZWUuc2V0U2VsZWN0aW9uKChUYWJsZVRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJTSU5HTEU6IE5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGluZyBudWxsIGluIGVtcHR5IHRhYmxlIHRyZWUiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlpdGVtcyA9IG5ldyBUYWJsZVRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgMCk7Ci0JfQotCQotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBubyBpdGVtcyBpbiB0YWJsZSB0cmVlIHdpdGggaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQl0cnkgewotCQl0YWJsZVRyZWUuc2V0U2VsZWN0aW9uKChUYWJsZVRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJTSU5HTEU6IE5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGluZyBudWxsIGluIHRhYmxlIHRyZWUgd2l0aCBpdGVtcyIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgaXRlbSAiICsgaSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbaV19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1tpXX0pOwotCX0KLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgaXRlbXMiLCBpdGVtcywgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHRhYmxlVHJlZS5nZXRJdGVtcygpIiwgdGFibGVUcmVlLmdldEl0ZW1zKCksIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAyIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbMV19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMiBub24tY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s2XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgbm9uLWNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbNV0sIGl0ZW1zWzddfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgdW5vcmRlcmVkIGNvbnRpZ3VvdXMgaXRlbXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IDMgdW5vcmRlcmVkIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzJdLCBpdGVtc1s3XX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCAzIHJldmVyc2Utb3JkZXIgY29udGlndW91cyBpdGVtcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1szXSwgaXRlbXNbMl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgMyByZXZlcnNlLW9yZGVyIG5vbi1jb250aWd1b3VzIGl0ZW1zIiwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7aXRlbXNbN10sIGl0ZW1zWzVdLCBpdGVtc1syXX0sIG5ldyBUYWJsZVRyZWVJdGVtW10ge30pOwotCXNldFNlbGVjdGlvbl9oZWxwZXIoIlNlbGVjdCBzYW1lIGl0ZW0gdHdpY2UiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSwgbmV3IFRhYmxlVHJlZUl0ZW1bXSB7fSk7Ci0Jc2V0U2VsZWN0aW9uX2hlbHBlcigiU2VsZWN0IHNhbWUgaXRlbSBtdWx0aXBsZSB0aW1lcyIsIG5ldyBUYWJsZVRyZWVJdGVtW10ge2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLQlzZXRTZWxlY3Rpb25faGVscGVyKCJTZWxlY3QgbXVsdGlwbGUgaXRlbXMgbXVsdGlwbGUgdGltZXMiLCBuZXcgVGFibGVUcmVlSXRlbVtdIHtpdGVtc1s0XSwgaXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMl19LCBuZXcgVGFibGVUcmVlSXRlbVtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3Nob3dTZWxlY3Rpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3Nob3dTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGFibGUiKSkgdGVzdF9nZXRUYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQWxsIikpIHRlc3RfcmVtb3ZlQWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIikpIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZUV4cGFuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcml2YXRlIFRhYmxlVHJlZSB0YWJsZVRyZWU7Ci1wcml2YXRlIGludCBzdHlsZTsKLQotLyoKLSAqIFNldHMgYSBzaW5nbGUtc2VsZWN0IFRhYmxlVHJlZSBhcyB0aGUgdGVzdCB3aWRnZXQuCi0gKiBOb3RlOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoYXQgdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQuCi0gKi8KLXByaXZhdGUgdm9pZCBzaW5nbGVTZWxlY3QoKSB7Ci0JdGFibGVUcmVlLmRpc3Bvc2UoKTsKLQl0YWJsZVRyZWUgPSBuZXcgVGFibGVUcmVlKHNoZWxsLCBzdHlsZSA9IFNXVC5TSU5HTEUpOwotCXNldFdpZGdldCh0YWJsZVRyZWUpOwotfQotCi0vKgotICogVXNlZCBpbiB0ZXN0X3NlbGVjdEFsbC4KLSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdC4KLSAqLwotcHJpdmF0ZSB2b2lkIHNlbGVjdEFsbF9oZWxwZXIoU3RyaW5nIG1lc3NhZ2UsIFRhYmxlVHJlZUl0ZW1bXSBleHBlY3RlZFNlbGVjdGlvbikgewotCXRhYmxlVHJlZS5zZWxlY3RBbGwoKTsKLQltZXNzYWdlID0gKHN0eWxlID09IFNXVC5NVUxUSSA/ICJNVUxUSSIgOiAiU0lOR0xFIikgKyAiOiAiICsgbWVzc2FnZTsKLQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRTZWxlY3Rpb24ubGVuZ3RoLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JYXNzZXJ0U2FtZShtZXNzYWdlLCBleHBlY3RlZFNlbGVjdGlvbiwgdGFibGVUcmVlLmdldFNlbGVjdGlvbigpKTsKLX0KLQotLyoKLSAqIFVzZWQgaW4gdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS4KLSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhhdCB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdC4KLSAqLwotcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbl9oZWxwZXIoU3RyaW5nIG1lc3NhZ2UsIFRhYmxlVHJlZUl0ZW1bXSBpdGVtc1RvU2VsZWN0LCBUYWJsZVRyZWVJdGVtW10gZXhwZWN0ZWRTZWxlY3Rpb24pIHsKLQl0YWJsZVRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zVG9TZWxlY3QpOwotCW1lc3NhZ2UgPSAoc3R5bGUgPT0gU1dULk1VTFRJID8gIk1VTFRJIiA6ICJTSU5HTEUiKSArICI6ICIgKyBtZXNzYWdlOwotCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFNlbGVjdGlvbi5sZW5ndGgsIHRhYmxlVHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlhc3NlcnRTYW1lKG1lc3NhZ2UsIGV4cGVjdGVkU2VsZWN0aW9uLCB0YWJsZVRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlVHJlZShWZWN0b3IgZXZlbnRzLCBib29sZWFuIHRyYXZlcnNlKSB7Ci0gICAgU3RyaW5nIHRlc3QgPSBnZXRUZXN0TmFtZSgpOwotICAgIHRhYmxlVHJlZSA9IG5ldyBUYWJsZVRyZWUoc2hlbGwsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGVUcmVlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJY29sdW1uLnNldFdpZHRoKDcwKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGNvbHVtbiwgdGVzdCwgZXZlbnRzKTsKLQl9Ci0JZm9yIChpbnQgbm9kZSA9IDA7IG5vZGUgPCA0OyBub2RlKyspIHsKLQkJVGFibGVUcmVlSXRlbSBpdGVtID0gbmV3IFRhYmxlVHJlZUl0ZW0odGFibGVUcmVlLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCQlpdGVtLnNldFRleHQoY29sLCAiVFRJdGVtIiArIG5vZGUgKyBjb2wpOwotCQl9Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCB0ZXN0LCBldmVudHMpOwotCQlUYWJsZVRyZWVJdGVtIHN1Yml0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbShpdGVtLCBTV1QuTk9ORSk7Ci0JCWZvciAoaW50IGNvbCA9IDA7IGNvbCA8IDM7IGNvbCsrKSB7Ci0JCQlzdWJpdGVtLnNldFRleHQoY29sLCAiVFRTdWIiICsgbm9kZSArIGNvbCk7Ci0JCX0KLQkJaG9va0V4cGVjdGVkRXZlbnRzKHN1Yml0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JfQotCVN0cmluZ1tdIHR5cGVzID0gKFN0cmluZ1tdKUNvbnNpc3RlbmN5VXRpbGl0eS5ldmVudE9yZGVyaW5nLmdldCgiVGFibGVUcmVlVGFibGUiKTsKLQlpZighdHJhdmVyc2UpIHsKLQkgICAgU3RyaW5nW10gdGVtcCA9IG5ldyBTdHJpbmdbdHlwZXMubGVuZ3RoIC0xXTsKLQkgICAgU3lzdGVtLmFycmF5Y29weSh0eXBlcywgMCwgdGVtcCwgMCwgdHlwZXMubGVuZ3RoLTEpOwotCSAgICB0eXBlcyA9IHRlbXA7Ci0JfQotCWhvb2tFeHBlY3RlZEV2ZW50cyh0YWJsZVRyZWUuZ2V0VGFibGUoKSwgdHlwZXMsIGV2ZW50cyk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDMwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCB0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDExLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIHRhYmxlVHJlZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlVHJlZUl0ZW1bXSB7IHRhYmxlVHJlZS5nZXRJdGVtcygpWzBdfSk7Ci0gICAgaW50IGNvZGU9U1dULkFSUk9XX1JJR0hUOwotICAgIGlmKFN3dEp1bml0LmlzR1RLKQotICAgICAgICBjb2RlID0gU1dULktFWVBBRF9BREQ7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBjb2RlLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdGFibGVUcmVlLmdldEl0ZW1IZWlnaHQoKSoyLCAxLCAwLCAKLSAgICAgICAgICAgIAkgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZVRyZWUoZXZlbnRzLCBmYWxzZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGVUcmVlKGV2ZW50cywgdHJ1ZSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgMjUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYmxlVHJlZShldmVudHMsIHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmY3ZWNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUVkaXRvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVFZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVFZGl0b3IgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fQ29udHJvbEVkaXRvciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sdW1uSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Q29sdW1uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlRWRpdG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9Db250cm9sRWRpdG9yLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbiIpKSB0ZXN0X2dldENvbHVtbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbSIpKSB0ZXN0X2dldEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbHVtbkkiKSkgdGVzdF9zZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIikpIHRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0iKSkgdGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJjN2YxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWVJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLQlUYWJsZVRyZWUgdGFibGVUcmVlOwotCVRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbTsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdGFibGVUcmVlID0gbmV3IFRhYmxlVHJlZShzaGVsbCwgMCk7Ci0JdGFibGVUcmVlSXRlbSA9IG5ldyBUYWJsZVRyZWVJdGVtKHRhYmxlVHJlZSwgMCk7Ci0Jc2V0V2lkZ2V0KHRhYmxlVHJlZUl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCYWNrZ3JvdW5kIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Qm91bmRzSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoZWNrZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENoZWNrZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFeHBhbmRlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RXhwYW5kZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGb3JlZ3JvdW5kIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JheWVkKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRHcmF5ZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEltYWdlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Db3VudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbUNvdW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1zIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYXJlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYXJlbnRJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VGV4dCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUZXh0SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENoZWNrZWRaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDaGVja2VkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEV4cGFuZGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RXhwYW5kZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0R3JheWVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0R3JheWVkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDaGVja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHBhbmRlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JheWVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENoZWNrZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRHcmF5ZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RhYmxlVHJlZUl0ZW1JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kc0kiKSkgdGVzdF9nZXRCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGVja2VkIikpIHRlc3RfZ2V0Q2hlY2tlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RXhwYW5kZWQiKSkgdGVzdF9nZXRFeHBhbmRlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyYXllZCIpKSB0ZXN0X2dldEdyYXllZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VJIikpIHRlc3RfZ2V0SW1hZ2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50SXRlbSIpKSB0ZXN0X2dldFBhcmVudEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SSIpKSB0ZXN0X2dldFRleHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGFibGVUcmVlSXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UYWJsZVRyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDaGVja2VkWiIpKSB0ZXN0X3NldENoZWNrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFeHBhbmRlZFoiKSkgdGVzdF9zZXRFeHBhbmRlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEdyYXllZFoiKSkgdGVzdF9zZXRHcmF5ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dElMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRiMDBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JU2hlbGwgc2hlbGw7Ci0JU3R5bGVkVGV4dCBzdHlsZWRUZXh0OwotCWludCB2ZXJpZnkgPSAtMTsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0Q2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKSB7Ci0JU3R5bGVkVGV4dENvbnRlbnQgY29udGVudCA9IHN0eWxlZFRleHQuZ2V0Q29udGVudCgpOwotCVRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAodmVyaWZ5KSB7Ci0JCQkJY2FzZSAxIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxudGVzdGluZyIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJhIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxuXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA1IDogewotCQkJCQlhc3NlcnRUcnVlKCI6NToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIlxyTGluZSAxXHJcbkxpbmUgMiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjY6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgMyIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNyA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjc6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJUaGlzXG5cciIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjg6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcbkwxXHJcbkwyIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA5IDogewotCQkJCQlhc3NlcnRUcnVlKCI6OToiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxdGVzdCIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTA6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTA6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMTogewotCQkJCQlhc3NlcnRUcnVlKCI6MTE6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMjogewotCQkJCQlhc3NlcnRUcnVlKCI6MTI6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMVxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEzOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMzoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoIkwxXHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTQ6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTU6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDF0ZXN0XG5cbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTY6ewotCQkJCQlhc3NlcnRUcnVlKCI6MTY6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxNzogewotCQkJCQlhc3NlcnRUcnVlKCI6MTc6IiwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxODogewotCQkJCQlhc3NlcnRUcnVlKCI6MTg6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJMMVxyXG50ZXN0XHJcbiIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTk6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE5OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiTDF0ZXN0XHJcclxyXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDIwOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoyMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0Q2hhbmdpbmcoVGV4dENoYW5naW5nRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQotCWJvb2xlYW4gZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0JdmVyaWZ5ID0gMTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5cbiIpOwotCXZlcmlmeSA9IDI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDIsICJhIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiYSIpOwotCXZlcmlmeSA9IDM7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gNDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAidGVzdFxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjo0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMaW5lIDFcclxuTGluZSAyIik7Ci0JdmVyaWZ5ID0gNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XG5saW5lIDNcbmxpbmUgNCIpOwotCXZlcmlmeSA9IDY7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQl2ZXJpZnkgPSA3OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg1LCA5LCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiXG5MMVxyXG5MMlxyXG4iKTsKLQl2ZXJpZnkgPSA4OwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSg3LCAyLCAiIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gOTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxMDsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAxLCAiIik7fSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbkwyXHJcbkwzXHJcbkw0XHJcbiIpOwotCXZlcmlmeSA9IDExOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDEsIDIsICIiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjExOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0JdmVyaWZ5ID0gMTI7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMDsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXG4iKTsKLQl2ZXJpZnkgPSAxMzsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMCwgIlxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTQ7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgInRlc3QiKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE0OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl2ZXJpZnkgPSAxNTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdmVyaWZ5ID0gMTY7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcclxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNjogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMTc7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgInRlc3RcblxuIik7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJZXhjZXB0aW9uSGFuZGxlZCA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIjoxNzogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSAwOwotIAlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQl2ZXJpZnkgPSAxODsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDA7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0JdmVyaWZ5ID0gMTk7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJ0ZXN0XHJcclxyIik7Ci0KLQl2ZXJpZnkgPSAwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdmVyaWZ5ID0gMjA7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MjA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCWNvbnRlbnQucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0Q2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gc3R5bGVkVGV4dC5nZXRDb250ZW50KCk7Ci0JVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdGV4dENoYW5naW5nKFRleHRDaGFuZ2luZ0V2ZW50IGV2ZW50KSB7Ci0JCQlzd2l0Y2godmVyaWZ5KSB7Ci0JCQkJY2FzZSAxIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjFiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjJhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMik7Ci0JCQkJCWFzc2VydFRydWUoIjoyYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDMgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjozYToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6M2I6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgNSA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjVhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWFzc2VydFRydWUoIjo1YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDYgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo2YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6NmI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSA3IDogewotCQkJCQlhc3NlcnRUcnVlKCI6N2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjdiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgOCA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjhhOiIsIGV2ZW50LnJlcGxhY2VMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWFzc2VydFRydWUoIjo4YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDkgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo5YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDEpOwotCQkJCQlhc3NlcnRUcnVlKCI6OWI6IiwgZXZlbnQubmV3TGluZUNvdW50ID09IDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxMDp7Ci0JCQkJCWFzc2VydFRydWUoIjoxMDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDExOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMToiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEyOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxMmE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEyYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDEzOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxM2E6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAwKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjEzYjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE0OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNDoiLCBmYWxzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE1OiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxNWE6IiwgZXZlbnQucmVwbGFjZUxpbmVDb3VudCA9PSAxKTsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE1YjoiLCBldmVudC5uZXdMaW5lQ291bnQgPT0gMik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDE2OnsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE2OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTc6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE3OiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTg6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE4YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MThiOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMTk6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjE5YToiLCBldmVudC5yZXBsYWNlTGluZUNvdW50ID09IDApOwotCQkJCQlhc3NlcnRUcnVlKCI6MTliOiIsIGV2ZW50Lm5ld0xpbmVDb3VudCA9PSAzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMjA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjIwOiIsIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCB0ZXh0U2V0KFRleHRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJfQotCX07Ci0JY29udGVudC5hZGRUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JYm9vbGVhbiBleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7CQotCXZlcmlmeSA9IDE7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJ0ZXN0aW5nIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMCwgMiwgImEiKTsKLQotCXZlcmlmeSA9IDM7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJhIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDAsIDEsICJcblxuIik7Ci0KLQl2ZXJpZnkgPSA0OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6NDogZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25IYW5kbGVkKTsKLQlleGNlcHRpb25IYW5kbGVkID0gZmFsc2U7Ci0KLQl2ZXJpZnkgPSA1OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTGluZSAxXHJcbkxpbmUgMiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgwLCAwLCAiXHIiKTsKLQotCXZlcmlmeSA9IDY7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJUaGlzXG5pcyBhIHRlc3RcbmxpbmUgM1xubGluZSA0Iik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIxLCA3LCAiIik7Ci0KLQl2ZXJpZnkgPSA3OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiVGhpc1xuaXMgYSB0ZXN0XHIiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoNSwgOSwgIiIpOwotCi0JdmVyaWZ5ID0gODsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuTDFcclxuTDJcclxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDcsIDIsICIiKTsKLQotCXZlcmlmeSA9IDk7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3QiKTsKLQotCXZlcmlmeSA9IDEwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgIiIpO30gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjEwOiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDExOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMSwgMiwgIiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTE6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTI7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDAsICJcbiIpOwotCi0JdmVyaWZ5ID0gMTM7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxuIik7Ci0Jc3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDIsIDAsICJcciIpOwotCi0JdmVyaWZ5ID0gMTQ7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgzLCAwLCAidGVzdCIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTQ6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTU7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG4iKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMiwgMiwgInRlc3RcblxuIik7Ci0KLQl2ZXJpZnkgPSAxNjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHJcbiIpOwotCXRyeSB7c3R5bGVkVGV4dC5yZXBsYWNlVGV4dFJhbmdlKDMsIDEsICJ0ZXN0XHJcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MTY6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCi0JdmVyaWZ5ID0gMTc7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJMMVxyXG5MMlxyXG5MM1xyXG5MNFxyXG4iKTsKLQl0cnkge3N0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgxLCAyLCAidGVzdFxuXG4iKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQlleGNlcHRpb25IYW5kbGVkID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiOjE3OiBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvbkhhbmRsZWQpOwotCWV4Y2VwdGlvbkhhbmRsZWQgPSBmYWxzZTsKLQotCXZlcmlmeSA9IDE4OwotIAlzdHlsZWRUZXh0LnNldFRleHQoIkwxXHIiKTsKLQlzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMCwgIlxudGVzdFxyXG4iKTsKLQotCXZlcmlmeSA9IDE5OwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcbiIpOwotCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZSgyLCAwLCAidGVzdFxyXHJcciIpOwotCXZlcmlmeSA9IDIwOwotCXN0eWxlZFRleHQuc2V0VGV4dCgiTDFcclxuTDJcclxuTDNcclxuTDRcclxuIik7Ci0JdHJ5IHtzdHlsZWRUZXh0LnJlcGxhY2VUZXh0UmFuZ2UoMywgMSwgInRlc3RcbiIpO30KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCWV4Y2VwdGlvbkhhbmRsZWQgPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6MjA6IGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uSGFuZGxlZCk7Ci0JZXhjZXB0aW9uSGFuZGxlZCA9IGZhbHNlOwotCWNvbnRlbnQucmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90ZXh0U2V0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCgpIHsKLQlTdHlsZWRUZXh0Q29udGVudCBjb250ZW50ID0gc3R5bGVkVGV4dC5nZXRDb250ZW50KCk7Ci0JVGV4dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRleHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdGV4dENoYW5naW5nKFRleHRDaGFuZ2luZ0V2ZW50IGV2ZW50KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHRleHRTZXQoVGV4dENoYW5nZWRFdmVudCBldmVudCkgewotCQkJc3dpdGNoICh2ZXJpZnkpIHsKLQkJCQljYXNlIDEgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjoxOiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygidGVzdGluZyIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJcblxuIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAzIDogewotCQkJCQlhc3NlcnRUcnVlKCI6MzoiLCBzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHMoImEiKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIDQgOiB7Ci0JCQkJCWFzc2VydFRydWUoIjo0OiIsIHN0eWxlZFRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCWNvbnRlbnQuYWRkVGV4dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkKLQl2ZXJpZnkgPSAxOwotCXN0eWxlZFRleHQuc2V0VGV4dCgidGVzdGluZyIpOwotCi0JdmVyaWZ5ID0gMjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIlxuXG4iKTsKLQotCXZlcmlmeSA9IDM7Ci0Jc3R5bGVkVGV4dC5zZXRUZXh0KCJhIik7Ci0JCi0JdmVyaWZ5ID0gNDsKLQl0cnkge3N0eWxlZFRleHQuc2V0VGV4dChudWxsKTt9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge2Fzc2VydFRydWUoIjo0OiIsIHRydWUpO30JCi0JY29udGVudC5yZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dENoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90ZXh0Q2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dFNldExvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dENoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50IikpIHRlc3RfdGV4dENoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0Q2hhbmdpbmdMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCIpKSB0ZXN0X3RleHRDaGFuZ2luZ0xvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2luZ0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90ZXh0U2V0TG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCIpKSB0ZXN0X3RleHRTZXRMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U1YjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5nZWRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlZEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5nZWRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdlZEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCkgewotCS8vIHRoaXMgbWV0aG9kIHRlc3RlZCBieSBvdGhlciB0ZXN0IGNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RleHRDaGFuZ2VkRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVGV4dENoYW5naW5nRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5YTM0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5naW5nRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5naW5nRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCgpIHsKLQkvLyB0aGlzIG1ldGhvZCB0ZXN0ZWQgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UZXh0Q2hhbmdpbmdFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1N0eWxlZFRleHRDb250ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9TdHlsZWRUZXh0Q29udGVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9jdXN0b21fU3R5bGVkVGV4dENvbnRlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwNzY3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UcmVlRWRpdG9yCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRyZWVFZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9UcmVlRWRpdG9yIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1RyZWVFZGl0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX0NvbnRyb2xFZGl0b3IubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW0iKSkgdGVzdF9nZXRJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFZGl0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3NldEVkaXRvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2V0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmVhMmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfY3VzdG9tX1ZlcmlmeUtleUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCVN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlpbnQgdmVyaWZ5ID0gLTE7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmVyaWZ5S2V5TGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci0Jc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2hlbGwub3BlbigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF92ZXJpZnlLZXlMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCgpIHsKLQlWZXJpZnlLZXlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWZXJpZnlLZXlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgdmVyaWZ5S2V5KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAodmVyaWZ5ICE9IDEpIHtldmVudC5kb2l0ID0gZmFsc2U7fQotCQl9Ci0JfTsKLQlzdHlsZWRUZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl2ZXJpZnkgPSAxOwotCUV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLQllLmNoYXJhY3RlciA9ICdhJzsKLQlzdHlsZWRUZXh0Lm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCJhIikpOwotCi0JdmVyaWZ5ID0gMjsKLQlzdHlsZWRUZXh0LnNldFRleHQoIiIpOwotCWUgPSBuZXcgRXZlbnQoKTsKLQllLmNoYXJhY3RlciA9ICdhJzsKLQlzdHlsZWRUZXh0Lm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjI6Iiwgc3R5bGVkVGV4dC5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0Jc3R5bGVkVGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WZXJpZnlLZXlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF92ZXJpZnlLZXlMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF92ZXJpZnlLZXlMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCIpKSB0ZXN0X3ZlcmlmeUtleUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0NGUxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2N1c3RvbV9WaWV3Rm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udGVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Q29udGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcENlbnRlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wQ2VudGVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wTGVmdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VG9wTGVmdCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcFJpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BSaWdodCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2xheW91dFogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3JkZXJWaXNpYmxlWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Qm9yZGVyVmlzaWJsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wQ2VudGVyU2VwYXJhdGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUb3BMZWZ0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9jdXN0b21fVmlld0Zvcm0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbnRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcENlbnRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wTGVmdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wUmlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJvcmRlclZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcENlbnRlckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BDZW50ZXJTZXBhcmF0ZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcExlZnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wUmlnaHRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q29udGVudCIpKSB0ZXN0X2dldENvbnRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcENlbnRlciIpKSB0ZXN0X2dldFRvcENlbnRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wTGVmdCIpKSB0ZXN0X2dldFRvcExlZnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcFJpZ2h0IikpIHRlc3RfZ2V0VG9wUmlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xheW91dFoiKSkgdGVzdF9sYXlvdXRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3JkZXJWaXNpYmxlWiIpKSB0ZXN0X3NldEJvcmRlclZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMYXlvdXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IikpIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wQ2VudGVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BDZW50ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VG9wQ2VudGVyU2VwYXJhdGVaIikpIHRlc3Rfc2V0VG9wQ2VudGVyU2VwYXJhdGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BMZWZ0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BMZWZ0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcFJpZ2h0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUb3BSaWdodExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkYTIzNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLkJ5dGVBcnJheVRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2Zlci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIikpIHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhNTA4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQ2xpcGJvYXJkKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVUeXBlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNEaXNwb3NlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRlbnRzJExqYXZhX2xhbmdfT2JqZWN0JExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9DbGlwYm9hcmQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXZhaWxhYmxlVHlwZU5hbWVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBdmFpbGFibGVUeXBlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udGVudHNMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMiKSkgdGVzdF9nZXRBdmFpbGFibGVUeXBlTmFtZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEF2YWlsYWJsZVR5cGVzIikpIHRlc3RfZ2V0QXZhaWxhYmxlVHlwZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRlbnRzTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9nZXRDb250ZW50c0xvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q29udGVudHMkTGphdmFfbGFuZ19PYmplY3QkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKSkgdGVzdF9zZXRDb250ZW50cyRMamF2YV9sYW5nX09iamVjdCRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5ELmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5MDVlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5EKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXJyb3JJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXJyb3JJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXJyb3JJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRE5EKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcnJvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJIikpIHRlc3RfZXJyb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvcklJIikpIHRlc3RfZXJyb3JJSSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA2YmM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNmZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRyYW5zZmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRHJhZ0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2UoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZERyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZURyYWdMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIiKSkgdGVzdF9hZGREcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc2ZlciIpKSB0ZXN0X2dldFRyYW5zZmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVEcmFnTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIikpIHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQwZTg1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnRmluaXNoZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdTdGFydExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyMzc4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDNlNWNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdTZXREYXRhTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnU3RhcnRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0ZpbmlzaGVkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCIpKSB0ZXN0X2RyYWdGaW5pc2hlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1NldERhdGFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9EcmFnU291cmNlRXZlbnQiKSkgdGVzdF9kcmFnU2V0RGF0YUxvcmdfZWNsaXBzZV9zd3RfZG5kX0RyYWdTb3VyY2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50IikpIHRlc3RfZHJhZ1N0YXJ0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJhZ1NvdXJjZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MmI2ZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENvbnRyb2wgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVEcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZERyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZURyb3BMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VHJhbnNmZXIkTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIiKSkgdGVzdF9hZGREcm9wTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc2ZlciIpKSB0ZXN0X2dldFRyYW5zZmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9ub3RpZnlMaXN0ZW5lcnNJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRHJvcExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUcmFuc2ZlciRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlciIpKSB0ZXN0X3NldFRyYW5zZmVyJExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwOTZiOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Ryb3BBY2NlcHRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKSkgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5YjNhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2RuZF9ETkRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9kbmRfRE5ERXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZG5kX0ROREV2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUwNzZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ0VudGVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcmFnTGVhdmVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJhZ092ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmFnRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdMZWF2ZUxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhZ09wZXJhdGlvbkNoYW5nZWRMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcm9wTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdFbnRlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJhZ0xlYXZlTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnT3BlcmF0aW9uQ2hhbmdlZExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdPcGVyYXRpb25DaGFuZ2VkTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmFnT3ZlckxvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2RyYWdPdmVyTG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcm9wQWNjZXB0TG9yZ19lY2xpcHNlX3N3dF9kbmRfRHJvcFRhcmdldEV2ZW50IikpIHRlc3RfZHJvcEFjY2VwdExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJvcExvcmdfZWNsaXBzZV9zd3RfZG5kX0Ryb3BUYXJnZXRFdmVudCIpKSB0ZXN0X2Ryb3BMb3JnX2VjbGlwc2Vfc3d0X2RuZF9Ecm9wVGFyZ2V0RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDgyYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfRmlsZVRyYW5zZmVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9GaWxlVHJhbnNmZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEluc3RhbmNlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbnN0YW5jZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0ZpbGVUcmFuc2ZlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbnN0YW5jZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfQnl0ZUFycmF5VHJhbnNmZXIubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbnN0YW5jZSIpKSB0ZXN0X2dldEluc3RhbmNlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY2NGUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5SVEZUcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5SVEZUcmFuc2ZlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX0J5dGVBcnJheVRyYW5zZmVyIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9SVEZUcmFuc2ZlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5zdGFuY2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluc3RhbmNlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1JURlRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluc3RhbmNlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5zdGFuY2UiKSkgdGVzdF9nZXRJbnN0YW5jZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKSkgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UZXh0VHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWRhYmIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RleHRUcmFuc2ZlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbnN0YW5jZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW5zdGFuY2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9uYXRpdmVUb0phdmFMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVGV4dFRyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluc3RhbmNlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9qYXZhVG9OYXRpdmVMamF2YV9sYW5nX09iamVjdExvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbmF0aXZlVG9KYXZhTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9CeXRlQXJyYXlUcmFuc2Zlci5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluc3RhbmNlIikpIHRlc3RfZ2V0SW5zdGFuY2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2phdmFUb05hdGl2ZUxqYXZhX2xhbmdfT2JqZWN0TG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIikpIHRlc3RfamF2YVRvTmF0aXZlTGphdmFfbGFuZ19PYmplY3RMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X25hdGl2ZVRvSmF2YUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzQwZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN1cHBvcnRlZFR5cGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTdXBwb3J0ZWRUeXBlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNTdXBwb3J0ZWRUeXBlTG9yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1N1cHBvcnRlZFR5cGVMb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZ2lzdGVyVHlwZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN1cHBvcnRlZFR5cGVzIikpIHRlc3RfZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSIpKSB0ZXN0X2lzU3VwcG9ydGVkVHlwZUxvcmdfZWNsaXBzZV9zd3RfZG5kX1RyYW5zZmVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVnaXN0ZXJUeXBlTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9yZWdpc3RlclR5cGVMamF2YV9sYW5nX1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA3MWJlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2RuZF9UcmFuc2ZlckRhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9kbmRfVHJhbnNmZXJEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjczZTZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Bcm1FdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Bcm1FdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IEFybUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjRiZWU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQXJtTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQXJtTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0QXJtZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXRBcm1lZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUV2ZW50IikpIHRlc3Rfd2lkZ2V0QXJtZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTMwMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpKSB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM5OTAxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IENvbnRyb2xFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE0NWZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRyb2xNb3ZlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udHJvbFJlc2l6ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50IikpIHRlc3RfY29udHJvbE1vdmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250cm9sUmVzaXplZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xFdmVudCIpKSB0ZXN0X2NvbnRyb2xSZXNpemVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2QyMDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IERpc3Bvc2VFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjhkOGIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXREaXNwb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXREaXNwb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXREaXNwb3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VFdmVudCIpKSB0ZXN0X3dpZGdldERpc3Bvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZiYTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNBZGFwdGVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0FkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpKSB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpKSB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyNjYwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBGb2N1c0V2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2YmU2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9jdXNHYWluZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mb2N1c0xvc3RMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0V2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpKSB0ZXN0X2ZvY3VzR2FpbmVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9jdXNMb3N0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNFdmVudCIpKSB0ZXN0X2ZvY3VzTG9zdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTc3OGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgSGVscEV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzkxODAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaGVscFJlcXVlc3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hlbHBSZXF1ZXN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwRXZlbnQiKSkgdGVzdF9oZWxwUmVxdWVzdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTNkNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5QWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IikpIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYzBmMGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgS2V5RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjNiNTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5UHJlc3NlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVByZXNzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfa2V5UmVsZWFzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKSkgdGVzdF9rZXlQcmVzc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2tleVJlbGVhc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5RXZlbnQiKSkgdGVzdF9rZXlSZWxlYXNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2ODc3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUFkYXB0ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IikpIHRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50IikpIHRlc3RfbWVudVNob3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzZjMWYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IE1lbnVFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQyYmUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tZW51SGlkZGVuTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tZW51U2hvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWVudUhpZGRlbkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpKSB0ZXN0X21lbnVIaWRkZW5Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51RXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCIpKSB0ZXN0X21lbnVTaG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTkzMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTVkNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW9kaWZ5VGV4dExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCIpKSB0ZXN0X21vZGlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhZTk5Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VEb3VibGVDbGlja0xvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlVXBMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmMDM1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBNb3VzZUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5M2ExNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRG93bkxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvdWJsZUNsaWNrTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlRG91YmxlQ2xpY2tMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZURvd25Mb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VEb3duTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbW91c2VVcExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZVVwTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NDc1OWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlTW92ZUxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZU1vdmVMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjNGYzZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrQWRhcHRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzU0OWVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9tb3VzZUVudGVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfbW91c2VIb3ZlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRW50ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50IikpIHRlc3RfbW91c2VFbnRlckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X21vdXNlRXhpdExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlRXZlbnQiKSkgdGVzdF9tb3VzZUV4aXRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3VzZUhvdmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VFdmVudCIpKSB0ZXN0X21vdXNlSG92ZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Y2U5ODguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgUGFpbnRFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTNhZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9wYWludENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9wYWludENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWludENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3BhaW50Q29udHJvbExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50RXZlbnQiKSkgdGVzdF9wYWludENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTc0MDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25BZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IikpIHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpZGdldFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQiKSkgdGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2NmM5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBTZWxlY3Rpb25FdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNDRjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0RGVmYXVsdFNlbGVjdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXREZWZhdWx0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCIpKSB0ZXN0X3dpZGdldERlZmF1bHRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aWRnZXRTZWxlY3RlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IikpIHRlc3Rfd2lkZ2V0U2VsZWN0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjMmVjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxBZGFwdGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTk5NWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgU2hlbGxFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTM4YmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsRGVhY3RpdmF0ZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NoZWxsRGVpY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaGVsbEljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsQWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxDbG9zZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NoZWxsSWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbEFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCIpKSB0ZXN0X3NoZWxsQ2xvc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxEZWFjdGl2YXRlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbERlYWN0aXZhdGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxEZWljb25pZmllZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsRXZlbnQiKSkgdGVzdF9zaGVsbERlaWNvbmlmaWVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxFdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50IikpIHRlc3Rfc2hlbGxJY29uaWZpZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbEV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDFhMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBUcmF2ZXJzZUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZDFkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfa2V5VHJhdmVyc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VFdmVudCIpKSB0ZXN0X2tleVRyYXZlcnNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE3Mzg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUFkYXB0ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlQWRhcHRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUFkYXB0ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKSkgdGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKSkgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDFjMTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUV2ZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkV2ZW50IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25FdmVudC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVHlwZWRFdmVudCBuZXdUeXBlZEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JcmV0dXJuIG5ldyBUcmVlRXZlbnQoZXZlbnQpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5OTM3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmVlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJlZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJlZUNvbGxhcHNlZExvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVFdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJlZUV4cGFuZGVkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RyZWVDb2xsYXBzZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKSkgdGVzdF90cmVlQ29sbGFwc2VkTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQiKSkgdGVzdF90cmVlRXhwYW5kZWRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiZWNjZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlR5cGVkRXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHlwZWRFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1R5cGVkRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHlwZWRFdmVudChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXNoZWxsID0gbmV3IFNoZWxsKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQlldmVudC53aWRnZXQgPSBzaGVsbDsKLQlUeXBlZEV2ZW50IHR5cGVkRXZlbnQgPSBuZXdUeXBlZEV2ZW50KGV2ZW50KTsKLQlhc3NlcnROb3ROdWxsKHR5cGVkRXZlbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JZXZlbnQud2lkZ2V0ID0gc2hlbGw7Ci0JVHlwZWRFdmVudCB0eXBlZEV2ZW50ID0gbmV3VHlwZWRFdmVudChldmVudCk7Ci0JYXNzZXJ0Tm90TnVsbCh0eXBlZEV2ZW50LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUodHlwZWRFdmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UeXBlZEV2ZW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLQotcHJvdGVjdGVkIFR5cGVkRXZlbnQgbmV3VHlwZWRFdmVudChFdmVudCBldmVudCkgewotCXJldHVybiBuZXcgVHlwZWRFdmVudChldmVudCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3MjQ2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlFdmVudCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUV2ZW50Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUeXBlZEV2ZW50IG5ld1R5cGVkRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQlyZXR1cm4gbmV3IFZlcmlmeUV2ZW50KGV2ZW50KTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmM1MzFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3ZlcmlmeVRleHRMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQiKSkgdGVzdF92ZXJpZnlUZXh0TG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5RXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4Y2E2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUlJKCkgewotCS8vIFRlc3QgbmV3IENvbG9yKERldmljZSBkZXZpY2UsIGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpCi0JLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZWQsIGdyZWVuIG9yIGJsdWUgYXJndW1lbnQgaXMgbm90IGJldHdlZW4gMCBhbmQgMjU1Ci0KLQkvLyB2YWxpZCBjb2xvciAoYmxhY2spCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yICh3aGl0ZSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSBncmV5KQotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDIwLCAyMCwgMjApOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGNvbG9yIChyYW5kb20pCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMTAyLCAyNTUsIDApOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyBkZXZpY2UgPT0gbnVsbCAodmFsaWQpCi0JY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMCwgMCwgMCk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA8IDAKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAtMTAsIC0xMCwgLTEwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCByZ2IgPiAyNTUKLQl0cnkgewotCQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMDAwLCAyMDAwLCAzMDAwKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZ2IgPiAyNTUiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBibHVlID4gMjU1Ci0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMTAsIDEwLCAyNTYpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPiAyNTUiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKSB7Ci0JLy8gVGVzdCBuZXcgQ29sb3IoRGV2aWNlIGRldmljZSwgUkdCIHJnYikKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlZCwgZ3JlZW4gb3IgYmx1ZSBhcmd1bWVudCBpcyBub3QgYmV0d2VlbiAwIGFuZCAyNTU7IG9yIHJnYiBpcyBudWxsCi0JCi0JLy8gdmFsaWQgY29sb3IgKGJsYWNrKQotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMCwgMCwgMCkpOwotCWNvbG9yLmRpc3Bvc2UoKTsKLQkKLQkvLyB2YWxpZCBjb2xvciAod2hpdGUpCi0JY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIHZhbGlkIGNvbG9yIChyYW5kb20gZ3JleSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDEwLCAxMCwgMTApKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gdmFsaWQgY29sb3IgKHJhbmRvbSkKLQljb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCBuZXcgUkdCKDEwMiwgMjU1LCAwKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCQotCS8vIGRldmljZSA9PSBudWxsICh2YWxpZCkKLQljb2xvciA9IG5ldyBDb2xvcihudWxsLCBuZXcgUkdCKDAsIDAsIDApKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgcmdiIDwgMAotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoLTEwLCAtMTAsIC0xMCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA+IDI1NQotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAwMCwgMjAwMCwgMzAwMCkpOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJnYiA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgYmx1ZSA+IDI1NQotCXRyeSB7Ci0JCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMTAsIDEwLCAyNTYpKTsKLQkJY29sb3IuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBibHVlID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIHJnYiA9PSBudWxsCi0JdHJ5IHsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgbnVsbCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaXNEaXNwb3NlZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEsIDIsIDMpOwotCUNvbG9yIHNhbWVDb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxLCAyLCAzKTsKLQlDb2xvciBzYW1lQ29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIG5ldyBSR0IoMSwgMiwgMykpOwotCUNvbG9yIG90aGVyQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgNSwgNiwgNyk7Ci0JdHJ5IHsKLQkJLy8gVGVzdCBDb2xvci5lcXVhbHMoT2JqZWN0KQotCQlhc3NlcnRUcnVlKCIhY29sb3IuZXF1YWxzKChPYmplY3QpbnVsbCkiLCAhY29sb3IuZXF1YWxzKChPYmplY3QpbnVsbCkpOwotCi0JCS8vIFRlc3QgQ29sb3IuZXF1YWxzKENvbG9yKQotCQlhc3NlcnRUcnVlKCIhY29sb3IuZXF1YWxzKChDb2xvciludWxsKSIsICFjb2xvci5lcXVhbHMoKENvbG9yKW51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSgiY29sb3IuZXF1YWxzKGNvbG9yKSIsIGNvbG9yLmVxdWFscyhjb2xvcikpOwotCQlhc3NlcnRUcnVlKCJjb2xvci5lcXVhbHMoc2FtZUNvbG9yKSIsIGNvbG9yLmVxdWFscyhzYW1lQ29sb3IpKTsKLQkJYXNzZXJ0VHJ1ZSgiY29sb3IuZXF1YWxzKHNhbWVDb2xvcjIpIiwgY29sb3IuZXF1YWxzKHNhbWVDb2xvcjIpKTsKLQkJYXNzZXJ0VHJ1ZSgiIWNvbG9yLmVxdWFscyhvdGhlckNvbG9yKSIsICFjb2xvci5lcXVhbHMob3RoZXJDb2xvcikpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJc2FtZUNvbG9yLmRpc3Bvc2UoKTsKLQkJc2FtZUNvbG9yMi5kaXNwb3NlKCk7Ci0JCW90aGVyQ29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCbHVlKCkgewotCS8vIFRlc3QgQ29sb3IuZ2V0Qmx1ZSgpCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMjU1KTsKLQl0cnkgewotCQlhc3NlcnRFcXVhbHMoImNvbG9yLmdldEJsdWUoKSIsIGNvbG9yLmdldEJsdWUoKSwgMjU1KTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyZWVuKCkgewotCS8vIFRlc3QgQ29sb3IuZ2V0R3JlZW4oKQotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDI1NSwgMCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0RXF1YWxzKCJjb2xvci5nZXRHcmVlbigpIiwgY29sb3IuZ2V0R3JlZW4oKSwgMjU1KTsKLQl9IGZpbmFsbHkgewotCQljb2xvci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQlhc3NlcnROb3ROdWxsKGNvbG9yLmdldFJHQigpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJHQigyNTUsIDI1NSwgMjU1KSwgY29sb3IuZ2V0UkdCKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlZCgpIHsKLQkvLyBUZXN0IENvbG9yLmdldFJlZCgpCi0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAwLCAwKTsKLQl0cnkgewotCQlhc3NlcnRFcXVhbHMoImNvbG9yLmdldFJlZCgpIiwgY29sb3IuZ2V0UmVkKCksIDI1NSk7Ci0JfSBmaW5hbGx5IHsKLQkJY29sb3IuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAxMiwgMzQsIDU2KTsKLQlDb2xvciBvdGhlckNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDEyLCAzNCwgNTYpOwotCWlmIChjb2xvci5lcXVhbHMob3RoZXJDb2xvcikpIHsKLQkJYXNzZXJ0RXF1YWxzKCJIYXNoIGNvZGVzIG9mIGVxdWFsIG9iamVjdHMgc2hvdWxkIGJlIGVxdWFsIiwgY29sb3IuaGFzaENvZGUoKSwgb3RoZXJDb2xvci5oYXNoQ29kZSgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQkvLyBUZXN0IENvbG9yLmlzRGlzcG9zZWQoKSBmYWxzZQotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDM0LCA2NywgOTgpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoIkNvbG9yIHNob3VsZCBub3QgYmUgZGlzcG9zZWQiLCAhY29sb3IuaXNEaXNwb3NlZCgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBUZXN0IENvbG9yLmlzRGlzcG9zZWQoKSB0cnVlCi0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiQ29sb3Igc2hvdWxkIGJlIGRpc3Bvc2VkIiwgY29sb3IuaXNEaXNwb3NlZCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMjU1KTsKLQl0cnkgewotCQlhc3NlcnROb3ROdWxsKGNvbG9yLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKGNvbG9yLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJDb2xvciB7MCwgMCwgMjU1fSIsIGNvbG9yLnRvU3RyaW5nKCkpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBwbGF0Zm9ybSBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJsdWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyZWVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJsdWUiKSkgdGVzdF9nZXRCbHVlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRHcmVlbiIpKSB0ZXN0X2dldEdyZWVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0IiKSkgdGVzdF9nZXRSR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlZCIpKSB0ZXN0X2dldFJlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGFlZmFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JLy8gVGVzdCBuZXcgQ3Vyc29yKERldmljZSBkZXZpY2UsIGludCBzdHlsZSkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBhbiB1bmtub3duIHN0eWxlIGlzIHNwZWNpZmllZAotCi0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9BUlJPVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0NST1NTKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0FQUFNUQVJUSU5HKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0hFTFApOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRUFMTCk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTkVTVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFTlMpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRU5XU0UpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVdFKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVTKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVFKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVXKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVORSk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9TSVpFU0UpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQljdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfU0laRVNXKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1NJWkVOVyk7Ci0JY3Vyc29yLmRpc3Bvc2UoKTsKLQotCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9VUEFSUk9XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0lCRUFNKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX05PKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0hBTkQpOwotCWN1cnNvci5kaXNwb3NlKCk7Ci0KLQkvLyBkZXZpY2UgPT0gbnVsbCAodmFsaWQpCi0JY3Vyc29yID0gbmV3IEN1cnNvcihudWxsLCBTV1QuQ1VSU09SX0FSUk9XKTsKLQljdXJzb3IuZGlzcG9zZSgpOwotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgc3R5bGUgPiBTV1QuQ1VSU09SX0hBTkQgKDIxKQotCXRyeSB7Ci0JCWN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgMTAwKTsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3R5bGUgPiBTV1QuQ1VSU09SX0hBTkQgKDIxKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgc3R5bGUgPCAwCi0JdHJ5IHsKLQkJY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCAtMTAwKTsKLQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3R5bGUgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpIHsKLQkvLyBUZXN0IG5ldyBDdXJzb3IoRGV2aWNlIGRldmljZSwgSW1hZ2VEYXRhIHNvdXJjZSwgSW1hZ2VEYXRhIG1hc2ssIGludCBob3RzcG90WCwgaW50IGhvdHNwb3RZKQotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXTsKLQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJSW1hZ2VEYXRhIHNvdXJjZSA9IGxvYWRlci5sb2FkKHN0cmVhbSlbMF07Ci0JCUltYWdlRGF0YSBtYXNrID0gc291cmNlLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQkJaWYgKG1hc2sgIT0gbnVsbCAmJiAoc291cmNlLmRlcHRoID09IDEpKSB7Ci0JCQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBzb3VyY2UsIG1hc2ssIDAsIDApOwotCQkJY3Vyc29yLmRpc3Bvc2UoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvbnRpbnVlOwotCQl9Ci0JfQotfQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2lzRGlzcG9zZWQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQkvKiBOb3RlOiBUd28gY3Vyc29ycyBhcmUgb25seSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZWlyIGhhbmRsZXMgYXJlIGVxdWFsLgotCSAqIFNvIHNpbmNlIFdpbmRvd3MgcmV1c2VzIGN1cnNvciBoYW5kbGVzLCBhbmQgb3RoZXIgcGxhdGZvcm1zIGRvIG5vdCwKLQkgKiBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHRlc3Qgd2hldGhlciBjdXJzb3IuZXF1YWxzKHNhbWVDdXJzb3IpLgotCSAqLwotCUN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKGRpc3BsYXksIFNXVC5DVVJTT1JfV0FJVCk7Ci0JQ3Vyc29yIG90aGVyQ3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0NST1NTKTsKLQl0cnkgewotCQkvLyBUZXN0IEN1cnNvci5lcXVhbHMoT2JqZWN0KQotCQlhc3NlcnRUcnVlKCIhY3Vyc29yLmVxdWFscygoT2JqZWN0KW51bGwpIiwgIWN1cnNvci5lcXVhbHMoKE9iamVjdCludWxsKSk7Ci0KLQkJLy8gVGVzdCBDdXJzb3IuZXF1YWxzKEN1cnNvcikKLQkJYXNzZXJ0VHJ1ZSgiIWN1cnNvci5lcXVhbHMoKEN1cnNvciludWxsKSIsICFjdXJzb3IuZXF1YWxzKChDdXJzb3IpbnVsbCkpOwotCQlhc3NlcnRUcnVlKCJjdXJzb3IuZXF1YWxzKGN1cnNvcikiLCBjdXJzb3IuZXF1YWxzKGN1cnNvcikpOwotCQlhc3NlcnRUcnVlKCIhY3Vyc29yLmVxdWFscyhvdGhlckN1cnNvcikiLCAhY3Vyc29yLmVxdWFscyhvdGhlckN1cnNvcikpOwotCX0gZmluYWxseSB7Ci0JCWN1cnNvci5kaXNwb3NlKCk7Ci0JCW90aGVyQ3Vyc29yLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2hhc2hDb2RlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQkvLyBUZXN0IEN1cnNvci5pc0Rpc3Bvc2VkKCkgZmFsc2UKLQlDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX1dBSVQpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoIkN1cnNvciBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIiwgIWN1cnNvci5pc0Rpc3Bvc2VkKCkpOwotCX0gZmluYWxseSB7Ci0JCS8vIFRlc3QgQ3Vyc29yLmlzRGlzcG9zZWQoKSB0cnVlCi0JCWN1cnNvci5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIkN1cnNvciBzaG91bGQgYmUgZGlzcG9zZWQiLCBjdXJzb3IuaXNEaXNwb3NlZCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JQ3Vyc29yIGN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9XQUlUKTsKLQlhc3NlcnROb3ROdWxsKGN1cnNvci50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGN1cnNvci50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCkgewotCS8vIGRvIG5vdCB0ZXN0IC0gV2luZG93cyBvbmx5Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MWQ4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaWVudEFyZWEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREUEkoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERQSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERlcHRoKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREZXB0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERldmljZURhdGEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldERldmljZURhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWigpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9udExpc3RMamF2YV9sYW5nX1N0cmluZ1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTeXN0ZW1Db2xvckkoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN5c3RlbUNvbG9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUZvbnQoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN5c3RlbUZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRXYXJuaW5ncygpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0V2FybmluZ3Mgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIERldmljZSBpcyBhYnN0cmFjdCAtIHRlc3QgaW4gc3ViY2xhc3NlcwotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gRGV2aWNlIGlzIGFic3RyYWN0IC0gdGVzdCBpbiBzdWJjbGFzc2VzCi0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNEaXNwb3NlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdhcm5pbmdzWigpIHsKLQkvLyBEZXZpY2UgaXMgYWJzdHJhY3QgLSB0ZXN0IGluIHN1YmNsYXNzZXMKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2FybmluZ3NaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERQSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVwdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERldmljZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTeXN0ZW1Db2xvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN5c3RlbUZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdhcm5pbmdzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2FybmluZ3NaIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREUEkiKSkgdGVzdF9nZXREUEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlcHRoIikpIHRlc3RfZ2V0RGVwdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERldmljZURhdGEiKSkgdGVzdF9nZXREZXZpY2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250TGlzdExqYXZhX2xhbmdfU3RyaW5nWiIpKSB0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Db2xvckkiKSkgdGVzdF9nZXRTeXN0ZW1Db2xvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN5c3RlbUZvbnQiKSkgdGVzdF9nZXRTeXN0ZW1Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXYXJuaW5ncyIpKSB0ZXN0X2dldFdhcm5pbmdzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdhcm5pbmdzWiIpKSB0ZXN0X3NldFdhcm5pbmdzWigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwODQ2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRGV2aWNlRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRldmljZURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCURldmljZURhdGEgZGF0YSA9IG5ldyBEZXZpY2VEYXRhKCk7Ci0JZGF0YS5kZWJ1ZyA9IHRydWU7Ci0JZGF0YS50cmFja2luZyA9IHRydWU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU5ZmZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkRyYXdhYmxlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRHJhd2FibGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM4NjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotRGlzcGxheSBkaXNwbGF5OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCkgewotCQotCS8vIG51bGwgIGRldmljZSBhcmd1bWVudAotCQotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBkYXRhID0gbmV3IEZvbnREYXRhWzFdOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChudWxsLGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCQotCS8vIG51bGwgZGF0YSBhcmd1bWVudAotCQotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCUZvbnREYXRhW10gZGF0YSA9IG51bGw7Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKGV4Y2VwdGlvblRocm93bik7Ci0KLQkvLyB6ZXJvIGxlbmd0aCBkYXRhIGFycmF5Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBkYXRhID0gbmV3IEZvbnREYXRhWzBdOwotCQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LGRhdGEpOwotCQlmb250LmRpc3Bvc2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0gCi0JYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCQotCS8vIG51bGwgZGF0YSBlbGVtZW50Ci0JCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBkYXRhID0gewotCQkJbnVsbCwKLQkJCW5ldyBGb250RGF0YSgpCi0JCX07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKCJudWxsIGRhdGEgZWxlbWVudCAwIixleGNlcHRpb25UaHJvd24pOwotCi0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBkYXRhID0gewotCQkJbmV3IEZvbnREYXRhKCksCi0JCQludWxsCi0JCX07Ci0JCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksZGF0YSk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfSAKLQlhc3NlcnRUcnVlKCJudWxsIGRhdGEgZWxlbWVudCAxIixleGNlcHRpb25UaHJvd24pOwotCQotCS8vIHRlc3QgdGhhdCBGb250RGF0YSBpcyBzZXQgY29ycmVjdGx5Ci0JCi0JRm9udERhdGEgZGF0YSA9IG5ldyBGb250RGF0YSgpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksZGF0YSk7Ci0JRm9udERhdGFbXSByZXR1cm5lZERhdGEgPSBmb250LmdldEZvbnREYXRhKCk7Ci0JYXNzZXJ0RXF1YWxzKGRhdGEscmV0dXJuZWREYXRhWzBdKTsKLQlmb250LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQkvLyBUZXN0IG5ldyBGb250KERldmljZSBkZXZpY2UsIEZvbnREYXRhIGZkKQotCS8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmQgYXJndW1lbnQgaXMgbnVsbAotCS8vIFNXVEVycm9yOiBFUlJPUl9OT19IQU5ETEVTLCBpZiBhIGZvbnQgY291bGQgbm90IGJlIGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gZm9udCBkYXRhCi0KLQkvLyB2YWxpZCBmb250IHdpdGggbm8gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKCIiLCAxMCwgU1dULk5PUk1BTCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIHVua25vd24gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YSgiYmFkLWZvbnQiLCAxMCwgU1dULk5PUk1BTCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIDAgaGVpZ2h0IChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMCwgU1dULk5PUk1BTCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgbm9ybWFsIDEwMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwMCwgU1dULk5PUk1BTCkpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgbm9ybWFsIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGJvbGQgMTAtcG9pbnQgZm9udAotCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGl0YWxpYyAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuSVRBTElDKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBib2xkIGl0YWxpYyAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIGlsbGVnYWwgYXJndW1lbnQsIGZvbnREYXRhID09IG51bGwKLQl0cnkgewotCQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgKEZvbnREYXRhKW51bGwpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZm9udERhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgbmFtZSA9PSBudWxsCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShudWxsLCAxMCwgU1dULk5PUk1BTCkpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBoZWlnaHQgPCAwCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIC0xMCwgU1dULk5PUk1BTCkpOwotCQlmb250LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCS8vIFRlc3QgbmV3IEZvbnQoRGV2aWNlIGRldmljZSwgU3RyaW5nIG5hbWUsIGludCBoZWlnaHQsIGludCBzdHlsZSkKLQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgYXJndW1lbnQgaXMgbnVsbCBvciB0aGUgaGVpZ2h0IGlzIG5lZ2F0aXZlCi0JLy8gU1dURXJyb3I6IEVSUk9SX05PX0hBTkRMRVMsIGlmIGEgZm9udCBjb3VsZCBub3QgYmUgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudHMKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCBubyBuYW1lIChzdHJhbmdlLCBidXQgYXBwYXJlbnRseSB2YWxpZCkKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCAiIiwgMTAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgZm9udCB3aXRoIHVua25vd24gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksICJiYWQtZm9udCIsIDEwLCBTV1QuTk9STUFMKTsKLQlmb250LmRpc3Bvc2UoKTsKLQotCS8vIHZhbGlkIGZvbnQgd2l0aCAwIGhlaWdodCAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBub3JtYWwgMTAwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMDAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgbm9ybWFsIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBib2xkIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gdmFsaWQgaXRhbGljIDEwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULklUQUxJQyk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyB2YWxpZCBib2xkIGl0YWxpYyAxMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0KLQkvLyBkZXZpY2UgPT0gbnVsbCAodmFsaWQpCi0JZm9udCA9IG5ldyBGb250KG51bGwsIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWZvbnQuZGlzcG9zZSgpOwotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgbmFtZSA9PSBudWxsCi0JdHJ5IHsKLQkJZm9udCA9IG5ldyBGb250KGRpc3BsYXksIG51bGwsIDEwLCBTV1QuTk9STUFMKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgaGVpZ2h0IDwgMAotCXRyeSB7Ci0JCWZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIC0xMCwgU1dULk5PUk1BTCk7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRGYWxzZShmb250LmlzRGlzcG9zZWQoKSk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmlzRGlzcG9zZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JLy8gRm9udHMgYXJlIG9ubHkgZXF1YWwgaWYgdGhlaXIgaGFuZGxlcyBhcmUgdGhlIHNhbWUgKD8hKQotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnQgb3RoZXJGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAyMCwgU1dULk5PUk1BTCk7Ci0JdHJ5IHsKLQkJLy8gVGVzdCBGb250LmVxdWFscyhPYmplY3QpCi0JCWFzc2VydFRydWUoIiFmb250LmVxdWFscygoT2JqZWN0KW51bGwpIiwgIWZvbnQuZXF1YWxzKChPYmplY3QpbnVsbCkpOwotCi0JCS8vIFRlc3QgRm9udC5lcXVhbHMoRm9udCkKLQkJYXNzZXJ0VHJ1ZSgiIWZvbnQuZXF1YWxzKChGb250KW51bGwpIiwgIWZvbnQuZXF1YWxzKChGb250KW51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSgiZm9udC5lcXVhbHMoZm9udCkiLCBmb250LmVxdWFscyhmb250KSk7Ci0JCWFzc2VydFRydWUoIiFmb250LmVxdWFscyhvdGhlckZvbnQpIiwgIWZvbnQuZXF1YWxzKG90aGVyRm9udCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCQlvdGhlckZvbnQuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250RGF0YSgpIHsKLQkvLyBUZXN0IEZvbnQuZ2V0Rm9udERhdGEoKQotCS8vIHZhbGlkIG5vcm1hbCAxMC1wb2ludCBmb250Ci0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm8gZm9udCBkYXRhIiwgZm9udERhdGEgIT0gbnVsbCAmJiBmb250RGF0YS5sZW5ndGggPiAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IG5hbWUiLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCAxMCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuTk9STUFMLCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvLyB2YWxpZCBib2xkIDIwLXBvaW50IGZvbnQKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAyMCwgU1dULkJPTEQpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZvbnQgZGF0YSIsIGZvbnREYXRhICE9IG51bGwgJiYgZm9udERhdGEubGVuZ3RoID4gMCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBuYW1lIiwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgMjAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULkJPTEQsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLQotCS8vIHZhbGlkIGl0YWxpYyAzMC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMzAsIFNXVC5JVEFMSUMpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZvbnQgZGF0YSIsIGZvbnREYXRhICE9IG51bGwgJiYgZm9udERhdGEubGVuZ3RoID4gMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IG5hbWUiLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCAzMCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuSVRBTElDLCBmb250RGF0YVswXS5nZXRTdHlsZSgpKTsKLQl9IGZpbmFsbHkgewotCQlmb250LmRpc3Bvc2UoKTsKLQl9Ci0KLQkvLyB2YWxpZCBib2xkIGl0YWxpYyA0MC1wb2ludCBmb250Ci0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgNDAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0JdHJ5IHsKLQkJRm9udERhdGEgZm9udERhdGFbXSA9IGZvbnQuZ2V0Rm9udERhdGEoKTsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZvbnQgZGF0YSIsIGZvbnREYXRhICE9IG51bGwgJiYgZm9udERhdGEubGVuZ3RoID4gMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IG5hbWUiLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIGZvbnREYXRhWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgZm9udCBoZWlnaHQiLCA0MCwgZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgc3R5bGUiLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMsIGZvbnREYXRhWzBdLmdldFN0eWxlKCkpOwotCX0gZmluYWxseSB7Ci0JCWZvbnQuZGlzcG9zZSgpOwotCX0KLQotCS8vIHZhbGlkIDEwLXBvaW50IGZvbnQgd2l0aCB1bmtub3duIG5hbWUKLQlmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgImJhZC1mb250IiwgMTAsIFNXVC5OT1JNQUwpOwotCXRyeSB7Ci0JCUZvbnREYXRhIGZvbnREYXRhW10gPSBmb250LmdldEZvbnREYXRhKCk7Ci0JCWFzc2VydFRydWUoIk5vIGZvbnQgZGF0YSIsIGZvbnREYXRhICE9IG51bGwgJiYgZm9udERhdGEubGVuZ3RoID4gMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IG5hbWUiLCAiYmFkLWZvbnQiLCBmb250RGF0YVswXS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGZvbnQgaGVpZ2h0IiwgMTAsIGZvbnREYXRhWzBdLmdldEhlaWdodCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBmb250IHN0eWxlIiwgU1dULk5PUk1BTCwgZm9udERhdGFbMF0uZ2V0U3R5bGUoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZm9udC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWFzc2VydEVxdWFscyhmb250LGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250Lmhhc2hDb2RlKCksZm9udC5oYXNoQ29kZSgpKTsKLQlGb250IGJvbGRGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpOwotCWFzc2VydEZhbHNlKGZvbnQuaGFzaENvZGUoKSA9PSBib2xkRm9udC5oYXNoQ29kZSgpKTsKLQlib2xkRm9udC5kaXNwb3NlKCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQkvLyBUZXN0IEZvbnQuaXNEaXNwb3NlZCgpIGZhbHNlCi0JRm9udCBmb250ID0gbmV3IEZvbnQoZGlzcGxheSwgU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0VHJ1ZSgiRm9udCBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIiwgIWZvbnQuaXNEaXNwb3NlZCgpKTsKLQl9IGZpbmFsbHkgewotCQkvLyBUZXN0IEZvbnQuaXNEaXNwb3NlZCgpIHRydWUKLQkJZm9udC5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIkZvbnQgc2hvdWxkIGJlIGRpc3Bvc2VkIiwgZm9udC5pc0Rpc3Bvc2VkKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnROb3ROdWxsKGZvbnQudG9TdHJpbmcoKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JYXNzZXJ0Tm90TnVsbChmb250LnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0Rpc3Bvc2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTGphdmFfbGFuZ19TdHJpbmdJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnREYXRhIikpIHRlc3RfZ2V0Rm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlzcG9zZWQiKSkgdGVzdF9pc0Rpc3Bvc2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MjYzZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyBUZXN0IG5ldyBGb250RGF0YSgpCi0JbmV3IEZvbnREYXRhKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQkvLyBUZXN0IG5ldyBGb250RGF0YShTdHJpbmcgc3RyaW5nKQotCUZvbnREYXRhIGZkID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIHJlY29uc3RydWN0ZWRGb250RGF0YSA9IG5ldyBGb250RGF0YShmZC50b1N0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoZmQsIHJlY29uc3RydWN0ZWRGb250RGF0YSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJKCkgewotCS8vIFRlc3QgbmV3IEZvbnREYXRhKFN0cmluZyBuYW1lLCBpbnQgaGVpZ2h0LCBpbnQgc3R5bGUpCi0JLy8gdmFsaWQgZm9udCBkYXRhIHdpdGggbm8gbmFtZSAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JbmV3IEZvbnREYXRhKCIiLCAxMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCB1bmtub3duIG5hbWUgKHN0cmFuZ2UsIGJ1dCBhcHBhcmVudGx5IHZhbGlkKQotCW5ldyBGb250RGF0YSgiYmFkLWZvbnQiLCAxMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCAwIGhlaWdodCAoc3RyYW5nZSwgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMCwgU1dULk5PUk1BTCk7Ci0KLQkvLyB2YWxpZCBmb250IGRhdGEgd2l0aCAxMDAwIGhlaWdodCAocHJldHR5IGJpZywgYnV0IGFwcGFyZW50bHkgdmFsaWQpCi0JCi0KLQkvLyB2YWxpZCBub3JtYWwgMTAtcG9pbnQgZm9udCBkYXRhCi0JbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCi0JLy8gdmFsaWQgYm9sZCAxMC1wb2ludCBmb250IGRhdGEKLQluZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpOwotCi0JLy8gdmFsaWQgaXRhbGljIDEwLXBvaW50IGZvbnQgZGF0YQotCW5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuSVRBTElDKTsKLQotCS8vIHZhbGlkIGJvbGQgaXRhbGljIDEwLXBvaW50IGZvbnQgZGF0YQotCW5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgbmFtZSA9PSBudWxsCi0JdHJ5IHsKLQkJbmV3IEZvbnREYXRhKG51bGwsIDEwLCBTV1QuTk9STUFMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyBpbGxlZ2FsIGFyZ3VtZW50LCBoZWlnaHQgPCAwCi0JdHJ5IHsKLQkJbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgLTEwLCBTV1QuTk9STUFMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUZvbnREYXRhIGZkMSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlGb250RGF0YSBmZDIgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7Ci0JYXNzZXJ0RXF1YWxzKGZkMSxmZDEpOwotCWFzc2VydEVxdWFscyhmZDEsZmQyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWlnaHQoKSB7Ci0JLy8gRm9udC5nZXRIZWlnaHQoKSB0ZXN0ZWQgaW4gdGVzdF9zZXRIZWlnaHRJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxlKCkgewotCS8vIEZvbnREYXRhLmdldExvY2FsZSgpIHRlc3RlZCBpbiB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQkvLyBGb250LmdldE5hbWUoKSB0ZXN0ZWQgaW4gdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyBGb250LmdldFN0eWxlKCkgdGVzdGVkIGluIHRlc3Rfc2V0U3R5bGVJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JRm9udERhdGEgZmQxID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCUZvbnREYXRhIGZkMiA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoZmQxLGZkMik7Ci0JYXNzZXJ0RXF1YWxzKGZkMS5oYXNoQ29kZSgpLGZkMi5oYXNoQ29kZSgpKTsKLQlGb250RGF0YSBmZDMgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULkJPTEQpOwotCWFzc2VydEZhbHNlKGZkMS5oYXNoQ29kZSgpID09IGZkMy5oYXNoQ29kZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWlnaHRJKCkgewotCS8vIFRlc3QgRm9udC5zZXRIZWlnaHQoaW50ICBoZWlnaHQpCi0JLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YSBmb3IgdmFyaW91cyBoZWlnaHRzCi0JRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCAxMCwgU1dULk5PUk1BTCk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGJvbGQgZm9udCBkYXRhIGZvciB2YXJpb3VzIGhlaWdodHMKLQlmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuQk9MRCk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLQotCS8vIHZhbGlkIGl0YWxpYyBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5JVEFMSUMpOwkKLQlmb3IgKGludCBoZWlnaHQgPSAwOyBoZWlnaHQgPCAxMDAwOyBoZWlnaHQrKykgewotCQlmb250RGF0YS5zZXRIZWlnaHQoaGVpZ2h0KTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBoZWlnaHQiLCBmb250RGF0YS5nZXRIZWlnaHQoKSwgaGVpZ2h0KTsKLQl9Ci0KLQkvLyB2YWxpZCBib2xkIGl0YWxpYyBmb250IGRhdGEgZm9yIHZhcmlvdXMgaGVpZ2h0cwotCWZvbnREYXRhID0gbmV3IEZvbnREYXRhKFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7CQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCWZvbnREYXRhLnNldEhlaWdodChoZWlnaHQpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGhlaWdodCIsIGZvbnREYXRhLmdldEhlaWdodCgpLCBoZWlnaHQpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlGb250RGF0YSBmZCA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLkVOR0xJU0g7Ci0JZmQuc2V0TG9jYWxlKGxvY2FsZS50b1N0cmluZygpKTsKLQlhc3NlcnRFcXVhbHMoTG9jYWxlLkVOR0xJU0gudG9TdHJpbmcoKSxmZC5nZXRMb2NhbGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIFRlc3QgRm9udC5zZXROYW1lKFN0cmluZyBuYW1lKQotCS8vIHZhbGlkIG5hbWUKLQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCBmb250RGF0YS5nZXROYW1lKCksIFN3dEp1bml0LnRlc3RGb250TmFtZSk7Ci0KLQkvLyB2YWxpZCBuYW1lICh1bmtub3duIG5hbWUsIGJ1dCB2YWxpZCkKLQlmb250RGF0YS5zZXROYW1lKCJiYWQtZm9udCIpOwotCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsIGZvbnREYXRhLmdldE5hbWUoKSwgImJhZC1mb250Iik7Ci0KLQkvLyB2YWxpZCBuYW1lIChlbXB0eSBzdHJpbmcsIGJ1dCB2YWxpZCkKLQkvLyBvbmx5IG9uIHdpbmRvd3Mgc2luY2UgbW90aWYgc3VwcG9ydHMgc2VwYXJhdGUgZm9udCBmb3VuZHJpZXMKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCWZvbnREYXRhLnNldE5hbWUoIiIpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCBmb250RGF0YS5nZXROYW1lKCksICIiKTsKLQl9Ci0KLQkvLyB2YWxpZCBuYW1lCi0JZm9udERhdGEuc2V0TmFtZShTd3RKdW5pdC50ZXN0Rm9udE5hbWUpOwkKLQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCBmb250RGF0YS5nZXROYW1lKCksIFN3dEp1bml0LnRlc3RGb250TmFtZSk7Ci0JLy8gaWxsZWdhbCBhcmd1bWVudCwgbmFtZSA9PSBudWxsCi0JdHJ5IHsKLQkJZm9udERhdGEuc2V0TmFtZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3R5bGVJKCkgewotCS8vIFRlc3QgRm9udC5zZXRTdHlsZShpbnQgIHN0eWxlKQotCWZvciAoaW50IGhlaWdodCA9IDA7IGhlaWdodCA8IDEwMDA7IGhlaWdodCsrKSB7Ci0JCS8vIHZhbGlkIG5vcm1hbCBmb250IGRhdGEKLQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoU3d0SnVuaXQudGVzdEZvbnROYW1lLCBoZWlnaHQsIFNXVC5OT1JNQUwpOwkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5OT1JNQUwpOwotCi0JCS8vIHZhbGlkIGJvbGQgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5CT0xEKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5CT0xEKTsKLQotCQkvLyB2YWxpZCBpdGFsaWMgZm9udCBkYXRhCi0JCWZvbnREYXRhLnNldFN0eWxlKFNXVC5JVEFMSUMpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIHN0eWxlIiwgZm9udERhdGEuZ2V0U3R5bGUoKSwgU1dULklUQUxJQyk7Ci0JCQotCQkvLyB2YWxpZCBib2xkIGl0YWxpYyBmb250IGRhdGEKLQkJZm9udERhdGEuc2V0U3R5bGUoU1dULklUQUxJQyB8IFNXVC5CT0xEKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5CT0xEIHwgU1dULklUQUxJQyk7Ci0KLQkJLy8gdmFsaWQgbm9ybWFsIGZvbnQgZGF0YQotCQlmb250RGF0YS5zZXRTdHlsZShTV1QuTk9STUFMKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzdHlsZSIsIGZvbnREYXRhLmdldFN0eWxlKCksIFNXVC5OT1JNQUwpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlGb250RGF0YSBkYXRhID0gbmV3IEZvbnREYXRhKCk7Ci0JYXNzZXJ0Tm90TnVsbChkYXRhLnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUoZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0eWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SGVpZ2h0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9jYWxlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE5hbWVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3R5bGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWlnaHQiKSkgdGVzdF9nZXRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2FsZSIpKSB0ZXN0X2dldExvY2FsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TmFtZSIpKSB0ZXN0X2dldE5hbWUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFN0eWxlIikpIHRlc3RfZ2V0U3R5bGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhlaWdodEkiKSkgdGVzdF9zZXRIZWlnaHRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhbGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldExvY2FsZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXROYW1lTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN0eWxlSSIpKSB0ZXN0X3NldFN0eWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9MT0dGT05USSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfd2luMzJfTE9HRk9OVEkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2MDYwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnRNZXRyaWNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3MKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnRNZXRyaWNzIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JZ2MgPSBuZXcgR0Moc2hlbGwpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlnYy5kaXNwb3NlKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCUZvbnRNZXRyaWNzIGZtMSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JRm9udE1ldHJpY3MgZm0yID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlhc3NlcnRUcnVlKGZtMS5lcXVhbHMoZm0yKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXNjZW50KCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRBc2NlbnQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRBdmVyYWdlQ2hhcldpZHRoKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlmbS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY2VudCgpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0RGVzY2VudCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlaWdodCgpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0SGVpZ2h0KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGVhZGluZygpIHsKLQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JZm0uZ2V0TGVhZGluZygpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCUZvbnRNZXRyaWNzIGZtMSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JRm9udE1ldHJpY3MgZm0yID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlpZiAoZm0xLmVxdWFscyhmbTIpKSB7Ci0JCWFzc2VydEVxdWFscyhmbTEuaGFzaENvZGUoKSwgZm0yLmhhc2hDb2RlKCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udE1ldHJpY3MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFzY2VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVzY2VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMZWFkaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF93aW4zMl9URVhUTUVUUklDIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFzY2VudCIpKSB0ZXN0X2dldEFzY2VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QXZlcmFnZUNoYXJXaWR0aCIpKSB0ZXN0X2dldEF2ZXJhZ2VDaGFyV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlc2NlbnQiKSkgdGVzdF9nZXREZXNjZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWlnaHQiKSkgdGVzdF9nZXRIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExlYWRpbmciKSkgdGVzdF9nZXRMZWFkaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX3dpbjMyX1RFWFRNRVRSSUMoKTsKLX0KLQotLyogY3VzdG9tICovCi0JRGlzcGxheSBkaXNwbGF5OwotCVNoZWxsIHNoZWxsOwotCUdDIGdjOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2IxODdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQlzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQlzaGVsbC5zZXRCb3VuZHMoMCwzMCwyNDAsMjkwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAyMDAsIDIwMCk7Ci0JZ2MgPSBuZXcgR0MoaW1hZ2UpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlnYy5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCXNoZWxsLmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlKCkgewotCXRyeSB7Ci0JCUdDIGdjID0gbmV3IEdDKG51bGwpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBkcmF3YWJsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQotCXRyeSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCUdDIGdjMSA9IG5ldyBHQyhpbWFnZSk7Ci0JCUdDIGdjMiA9IG5ldyBHQyhpbWFnZSk7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBpbWFnZSIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0KLQlpZiAoUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKSA9PSBudWxsKSB7Ci0JCS8vIE5vIHByaW50ZXIgaW5zdGFsbGVkLiBTa2lwIHRlc3QuCi0JCXJldHVybjsKLQl9Ci0JQ2xhc3MgcHJpbnRlckNsYXNzID0gbnVsbDsKLQl0cnkgewotCQlwcmludGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlciIpOwotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkvLyBQcmludGVyIGNsYXNzIG5vdCBwcmVzZW50IChlU1dUKS4gU2tpcCB0ZXN0LgotCQlyZXR1cm47Ci0JfQotCXRyeSB7Ci0JCS8vIERpcmVjdCBpbnN0YW50aWF0aW9uIHJlc3VsdHMgaW4gYSBOb0NsYXNzRGVmRm91bmRFcnJvciBkdXJpbmcgY2xhc3MgCi0JCS8vIGxvYWRpbmcvaW5pdGlhbGl6YXRpb24uIENhc3Rpbmcgc2VlbXMgdG8gYmUgb2suCi0JCU9iamVjdCBwcmludGVyID0gcHJpbnRlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCUdDIGdjMSA9IG5ldyBHQygoUHJpbnRlcikgcHJpbnRlcik7Ci0JCUdDIGdjMiA9IG5ldyBHQygoUHJpbnRlcikgcHJpbnRlcik7Ci0JCWdjMS5kaXNwb3NlKCk7Ci0JCWdjMi5kaXNwb3NlKCk7Ci0JCSgoUHJpbnRlcikgcHJpbnRlcikuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtb3JlIHRoYW4gb25lIEdDIG9uIG9uZSBwcmludGVyIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgcHJpbnRlciIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSgpIHsKLQl0cnkgewotCQlHQyBnYyA9IG5ldyBHQyhudWxsLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZHJhd2FibGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRyYXdhYmxlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQkJR0MgZ2MxID0gbmV3IEdDKGltYWdlLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JCUdDIGdjMiA9IG5ldyBHQyhpbWFnZSwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlnYzEuZGlzcG9zZSgpOwotCQlnYzIuZGlzcG9zZSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIGltYWdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgaW1hZ2UiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIFNXVC5OVUxMKTsKLQlHQyB0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQl0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQljYW52YXMuZGlzcG9zZSgpOwotCi0JaWYgKFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCkgPT0gbnVsbCkgewotCQkvLyBObyBwcmludGVyIGluc3RhbGxlZC4gU2tpcCB0ZXN0LgotCQlyZXR1cm47Ci0JfQotCUNsYXNzIHByaW50ZXJDbGFzcyA9IG51bGw7Ci0JdHJ5IHsKLQkJcHJpbnRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXIiKTsKLQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJLy8gUHJpbnRlciBjbGFzcyBub3QgcHJlc2VudCAoZVNXVCkuIFNraXAgdGVzdC4KLQkJcmV0dXJuOwotCX0KLQl0cnkgewotCQkvLyBEaXJlY3QgaW5zdGFudGlhdGlvbiByZXN1bHRzIGluIGEgTm9DbGFzc0RlZkZvdW5kRXJyb3IgZHVyaW5nIGNsYXNzIAotCQkvLyBsb2FkaW5nL2luaXRpYWxpemF0aW9uLiBDYXN0aW5nIHNlZW1zIHRvIGJlIG9rLgotCQlPYmplY3QgcHJpbnRlciA9IHByaW50ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQlHQyBnYzEgPSBuZXcgR0MoKFByaW50ZXIpcHJpbnRlciwgU1dULlJJR0hUX1RPX0xFRlQpOwotCQlHQyBnYzIgPSBuZXcgR0MoKFByaW50ZXIpcHJpbnRlciwgU1dULkxFRlRfVE9fUklHSFQpOwotCQlnYzEuZGlzcG9zZSgpOwotCQlnYzIuZGlzcG9zZSgpOwotCQkoKFByaW50ZXIpIHByaW50ZXIpLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbW9yZSB0aGFuIG9uZSBHQyBvbiBvbmUgcHJpbnRlciIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1vcmUgdGhhbiBvbmUgR0Mgb24gb25lIHByaW50ZXIiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHlBcmVhSUlJSUlJKCkgewotCUNvbG9yIHdoaXRlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQlSR0Igd2hpdGVSR0IgPSBnZXRSZWFsUkdCKHdoaXRlKTsKLQlSR0IgYmx1ZVJHQiA9IGdldFJlYWxSR0IoYmx1ZSk7Ci0JaW50IHdpZHRoID0gMjA7Ci0JaW50IGhlaWdodCA9IDIwOwotCWludCBkZXN0WCA9IDEwOwotCWludCBkZXN0WSA9IDUwOwotCi0JZ2Muc2V0QmFja2dyb3VuZCh3aGl0ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZShpbWFnZS5nZXRCb3VuZHMoKSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChibHVlKTsKLQlnYy5maWxsUmVjdGFuZ2xlKDUsIDAsIDYsIDEpOwotCWdjLmNvcHlBcmVhKDAsIDAsIHdpZHRoLCBoZWlnaHQsIGRlc3RYLCBkZXN0WSk7Ci0KLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOyAKLQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoZGVzdFggKyA0LCBkZXN0WSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDUsIGRlc3RZKTsKLSAJYXNzZXJ0RXF1YWxzKCI6YjoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwkKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDEwLCBkZXN0WSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBibHVlUkdCLCBwYWxldHRlLmdldFJHQihwaXhlbCkpOwkKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbChkZXN0WCArIDExLCBkZXN0WSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZDoiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5QXJlYUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpIHsKLQlDb2xvciB3aGl0ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKTsKLQlDb2xvciBibHVlID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7Ci0JUkdCIHdoaXRlUkdCID0gZ2V0UmVhbFJHQih3aGl0ZSk7Ci0JUkdCIGJsdWVSR0IgPSBnZXRSZWFsUkdCKGJsdWUpOwotCQotCWdjLnNldEJhY2tncm91bmQod2hpdGUpOwotCWdjLmZpbGxSZWN0YW5nbGUoaW1hZ2UuZ2V0Qm91bmRzKCkpOwotCWdjLnNldEJhY2tncm91bmQoYmx1ZSk7Ci0JZ2MuZmlsbFJlY3RhbmdsZSg1LCAwLCA2LCAxKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMiwgMTIpOwotCWdjLmNvcHlBcmVhKGltYWdlLCAwLCAwKTsKLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOyAKLQlpbnQgcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoNCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB3aGl0ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCg1LCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIGJsdWVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMTAsIDApOwotCWFzc2VydEVxdWFscygiOmM6IiwgYmx1ZVJHQiwgcGFsZXR0ZS5nZXRSR0IocGl4ZWwpKTsJCi0JcGl4ZWwgPSBpbWFnZURhdGEuZ2V0UGl4ZWwoMTEsIDApOwotCWFzc2VydEVxdWFscygiOmQ6Iiwgd2hpdGVSR0IsIHBhbGV0dGUuZ2V0UkdCKHBpeGVsKSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JZ2MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdBcmNJSUlJSUkoKSB7Ci0JZ2MuZHJhd0FyYygxMCwgMjAsIDUwLCAyNSwgOTAsIDkwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0ZvY3VzSUlJSSgpIHsKLQlnYy5kcmF3Rm9jdXMoMSwgMSwgNTAsIDI1KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJKCkgewotCUNvbG9yIGMxID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JQ29sb3IgYzIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMCwgMCk7Ci0JQ29sb3IgYzMgPSBuZXcgQ29sb3IoZGlzcGxheSwgMjU1LCAyNTUsIDApOwotCQotCVBhbGV0dGVEYXRhIHBhbGV0dGVEYXRhID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7YzEuZ2V0UkdCKCksIGMyLmdldFJHQigpLCBjMy5nZXRSR0IoKX0pOwotCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YSgzMCwzMCwgOCwgcGFsZXR0ZURhdGEpOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJaWYgKHggPiB5KSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKSk7Ci0JCQllbHNlIGlmICh4IDwgeSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMi5nZXRSR0IoKSkpOwotCQkJZWxzZSBkYXRhLnNldFBpeGVsKHgsIHksIHBhbGV0dGVEYXRhLmdldFBpeGVsKGMzLmdldFJHQigpKSk7Ci0JCX0KLQl9Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JZGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IHBhbGV0dGVEYXRhLmdldFBpeGVsKGMxLmdldFJHQigpKTsKLQlJbWFnZSBpbWFnZVRyYW5zcGFyZW50ID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEudHJhbnNwYXJlbnRQaXhlbCA9IC0xOwotCWZvciAoaW50IHkgPSAwOyB5IDwgZGF0YS5oZWlnaHQ7IHkrKykgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGRhdGEud2lkdGg7IHgrKykgewotCQkJZGF0YS5zZXRBbHBoYSh4LCB5LCAxMjcpOwotCQl9Ci0JfQkJCi0JSW1hZ2UgaW1hZ2VBbHBoYSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJCQkJCQkKLQlnYy5kcmF3SW1hZ2UoaW1hZ2UsIDEwMCwgMTAwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VUcmFuc3BhcmVudCwgMTMwLCAxMDApOwotCWdjLmRyYXdJbWFnZShpbWFnZUFscGhhLCAxNjAsIDEwMCk7Ci0JdHJ5IHsKLQkJZ2MuZHJhd0ltYWdlKG51bGwsIDEwMCwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlVHJhbnNwYXJlbnQuZGlzcG9zZSgpOwotCWltYWdlQWxwaGEuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSUlJSUlJSSgpIHsKLQlDb2xvciBjMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCUNvbG9yIGMyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDAsIDApOwotCUNvbG9yIGMzID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAwKTsKLQkKLQlQYWxldHRlRGF0YSBwYWxldHRlRGF0YSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge2MxLmdldFJHQigpLCBjMi5nZXRSR0IoKSwgYzMuZ2V0UkdCKCl9KTsKLQlJbWFnZURhdGEgZGF0YSA9IG5ldyBJbWFnZURhdGEoMzAsMzAsIDgsIHBhbGV0dGVEYXRhKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCWlmICh4ID4geSkgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMS5nZXRSR0IoKSkpOwotCQkJZWxzZSBpZiAoeCA8IHkpIGRhdGEuc2V0UGl4ZWwoeCwgeSwgcGFsZXR0ZURhdGEuZ2V0UGl4ZWwoYzIuZ2V0UkdCKCkpKTsKLQkJCWVsc2UgZGF0YS5zZXRQaXhlbCh4LCB5LCBwYWxldHRlRGF0YS5nZXRQaXhlbChjMy5nZXRSR0IoKSkpOwotCQl9Ci0JfQotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWRhdGEgPSBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSBwYWxldHRlRGF0YS5nZXRQaXhlbChjMS5nZXRSR0IoKSk7Ci0JSW1hZ2UgaW1hZ2VUcmFuc3BhcmVudCA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQlkYXRhLnRyYW5zcGFyZW50UGl4ZWwgPSAtMTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGRhdGEuaGVpZ2h0OyB5KyspIHsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkYXRhLndpZHRoOyB4KyspIHsKLQkJCWRhdGEuc2V0QWxwaGEoeCwgeSwgMTI3KTsKLQkJfQotCX0JCQotCUltYWdlIGltYWdlQWxwaGEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JCQkJCQkJCi0JZ2MuZHJhd0ltYWdlKGltYWdlLCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgNTAsIDYwKTsKLQlnYy5kcmF3SW1hZ2UoaW1hZ2VUcmFuc3BhcmVudCwgMTAsIDUsIDIwLCAxNSwgMTAwLCAxMjAsIDEwLCAxMCk7Ci0JZ2MuZHJhd0ltYWdlKGltYWdlQWxwaGEsIDEwLCA1LCAyMCwgMTUsIDEwMCwgMTIwLCAyMCwgMTUpOwotCXRyeSB7Ci0JCWdjLmRyYXdJbWFnZShudWxsLCAxMCwgNSwgMjAsIDE1LCAxMDAsIDEyMCwgNTAsIDYwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlQWxwaGEuZGlzcG9zZSgpOwotCWltYWdlVHJhbnNwYXJlbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdMaW5lSUlJSSgpIHsKLQlnYy5kcmF3TGluZSgwLDAsMCwyMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd092YWxJSUlJKCkgewotCWdjLmRyYXdPdmFsKDEwLCAwLCAyMCwgMzApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UG9pbnRJSSgpIHsKLQlnYy5kcmF3UG9pbnQoMTAsIDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3UG9seWdvbiRJKCkgewotCWdjLmRyYXdQb2x5Z29uKG5ldyBpbnRbXSB7MCwwLCA1LDEwLCAwLDIwfSk7CQkJCQotCWdjLmRyYXdQb2x5Z29uKG5ldyBpbnRbXSB7MCwwfSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdQb2x5bGluZSRJKCkgewotCWdjLmRyYXdQb2x5bGluZShuZXcgaW50W10gezAsMCwgNSwxMCwgMCwyMH0pOwkJCQkKLQlnYy5kcmF3UG9seWxpbmUobmV3IGludFtdIHswLDB9KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1JlY3RhbmdsZUlJSUkoKSB7Ci0JZ2MuZHJhd1JlY3RhbmdsZSgxMCwgMCwgMjAsIDMwKTsJCQkJCi0JZ2MuZHJhd1JlY3RhbmdsZSgwLCAwLCAwLCAwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWdjLmRyYXdSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwKSk7CQkJCQotCWdjLmRyYXdSZWN0YW5nbGUobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RyYXdSb3VuZFJlY3RhbmdsZUlJSUlJSSgpIHsKLQlnYy5kcmF3Um91bmRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgMywgMyk7CQkJCQotCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSgwLCAwLCAwLCAwLCAwLCAwKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JZ2MuZHJhd1N0cmluZygidGVzdCIsIDUsIDUpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVooKSB7Ci0JZ2MuZHJhd1N0cmluZygidGVzdCIsIDUsIDUsIHRydWUpOwkJCQkKLQlnYy5kcmF3U3RyaW5nKCJ0ZXN0IiwgNSwgNSwgZmFsc2UpOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUkoKSB7Ci0JZ2MuZHJhd1RleHQoInRlc3QiLCA1LCA1KTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlJKCkgewkJCQotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCAwKTsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBTV1QuRFJBV19NTkVNT05JQyk7Ci0JZ2MuZHJhd1RleHQoImFiYyIsIDUsIDUsIFNXVC5EUkFXX1RBQik7Ci0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIDApOwotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCBTV1QuRFJBV19ERUxJTUlURVIpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgU1dULkRSQVdfTU5FTU9OSUMpOwkJCQkKLQlnYy5kcmF3VGV4dCgiIiwgMCwgMCwgU1dULkRSQVdfVEFCKTsJCQkJCi0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgMCk7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIFNXVC5EUkFXX0RFTElNSVRFUik7Ci0JZ2MuZHJhd1RleHQoIlx0XHJcbmEmYmMmIiwgNSwgNSwgU1dULkRSQVdfTU5FTU9OSUMpOwotCWdjLmRyYXdUZXh0KCJcdFxyXG5hJmJjJiIsIDUsIDUsIFNXVC5EUkFXX1RBQik7Ci0JZ2MuZHJhd1RleHQoIlxyIiwgNSwgNSwgU1dULkRSQVdfREVMSU1JVEVSKTsKLQlnYy5kcmF3VGV4dCgiXG4iLCA1LCA1LCBTV1QuRFJBV19ERUxJTUlURVIpOwotCWdjLmRyYXdUZXh0KCImIiwgNSwgNSwgU1dULkRSQVdfTU5FTU9OSUMpOwotCWdjLmRyYXdUZXh0KCJcdCIsIDUsIDUsIFNXVC5EUkFXX1RBQik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWigpIHsKLQlnYy5kcmF3VGV4dCgiYWJjIiwgNSwgNSwgdHJ1ZSk7CQkJCQotCWdjLmRyYXdUZXh0KCJhYmMiLCA1LCA1LCBmYWxzZSk7CQkJCQotCWdjLmRyYXdUZXh0KCIiLCAwLCAwLCB0cnVlKTsJCQkJCi0JZ2MuZHJhd1RleHQoIiIsIDAsIDAsIGZhbHNlKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JYXNzZXJ0VHJ1ZShnYy5lcXVhbHMoZ2MpKTsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCUdDIHRlc3RHQyA9IG5ldyBHQyhjYW52YXMpOwotCWFzc2VydEZhbHNlKHRlc3RHQy5lcXVhbHMoZ2MpKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxBcmNJSUlJSUkoKSB7Ci0JZ2MuZmlsbEFyYygxMCwgMjAsIDUwLCAyNSwgOTAsIDkwKTsJCQkJCi0JZ2MuZmlsbEFyYygxMCwgMjAsIDUwLCAyNSwgLTEwLCAtMTApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWigpIHsKLQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMTAsIDAsIDIwLCAzMCwgdHJ1ZSk7CQkJCQotCWdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSgwLCAwLCAwLCAwLCB0cnVlKTsJCQkJCi0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIGZhbHNlKTsJCQkJCi0JZ2MuZmlsbEdyYWRpZW50UmVjdGFuZ2xlKDAsIDAsIDAsIDAsIGZhbHNlKTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbE92YWxJSUlJKCkgewotCWdjLmZpbGxPdmFsKDEwLCAwLCAyMCwgMzApOwkJCQkKLQlnYy5maWxsT3ZhbCgtMSwgLTEsIC0xLCAtMSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxQb2x5Z29uJEkoKSB7Ci0JZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHswLDAsIDUsMTAsIDAsMjB9KTsJCQkJCi0JZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHswLDB9KTsJCQkJCi0JZ2MuZmlsbFBvbHlnb24obmV3IGludFtdIHstMSwgLTF9KTsJCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmlsbFJlY3RhbmdsZUlJSUkoKSB7Ci0JZ2MuZmlsbFJlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApKTsJCQkJCi0JZ2MuZmlsbFJlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKTsJCQkJCi0JZ2MuZmlsbFJlY3RhbmdsZShuZXcgUmVjdGFuZ2xlKC0xLCAtMSwgLTEsIC0xKSk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbGxSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlnYy5maWxsUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzApOwkJCQkKLQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIDAsIDApOwkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkoKSB7Ci0JZ2MuZmlsbFJvdW5kUmVjdGFuZ2xlKDEwLCAwLCAyMCwgMzAsIDMsIDMpOwkJCQkKLQlnYy5maWxsUm91bmRSZWN0YW5nbGUoMCwgMCwgMCwgMCwgMCwgMCk7CQkJCQotCWdjLmZpbGxSb3VuZFJlY3RhbmdsZSgxMCwgMCwgMjAsIDMwLCAtMTAsIC0xMCk7CQkJCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFkdmFuY2VXaWR0aEMoKSB7Ci0JaW50IHcgPSBnYy5nZXRBZHZhbmNlV2lkdGgoJ2EnKTsKLQlhc3NlcnRUcnVlKHcgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiBzZXRCYWNrZ3JvdW5kIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoYXJXaWR0aEMoKSB7Ci0JaW50IHcgPSBnYy5nZXRDaGFyV2lkdGgoJ2EnKTsKLQlhc3NlcnRUcnVlKHcgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGlwcGluZygpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0Q2xpcHBpbmcgbWV0aG9kcwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb250KCkgewotCS8vIHRlc3RlZCBpbiBzZXRGb250IG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRNZXRyaWNzKCkgewotCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQlhc3NlcnRUcnVlKGZtLmdldEhlaWdodCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0Rm9yZWdyb3VuZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lU3R5bGUoKSB7Ci0JLy8gdGVzdGVkIGluIHNldExpbmVTdHlsZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lV2lkdGgoKSB7Ci0JLy8gdGVzdGVkIGluIHNldExpbmVXaWR0aCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCUdDIHRlc3RHQyA9IG5ldyBHQyhjYW52YXMsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQlpbnQgc3R5bGUgPSB0ZXN0R0MuZ2V0U3R5bGUoKTsKLQlhc3NlcnRUcnVlKChzdHlsZSAmIFNXVC5MRUZUX1RPX1JJR0hUKSAhPSAwKTsKLQl0ZXN0R0MuZGlzcG9zZSgpOwotCXRlc3RHQyA9IG5ldyBHQyhjYW52YXMpOwotCXN0eWxlID0gdGVzdEdDLmdldFN0eWxlKCk7Ci0JYXNzZXJ0VHJ1ZSgoc3R5bGUgJiBTV1QuTEVGVF9UT19SSUdIVCkgIT0gMCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLQl0ZXN0R0MgPSBuZXcgR0MoY2FudmFzLCBTV1QuUklHSFRfVE9fTEVGVCk7Ci0Jc3R5bGUgPSB0ZXN0R0MuZ2V0U3R5bGUoKTsKLQlhc3NlcnRUcnVlKChzdHlsZSAmICBTV1QuUklHSFRfVE9fTEVGVCkgIT0gMCk7Ci0JdGVzdEdDLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRYT1JNb2RlKCkgewotCS8vIHRlc3RlZCBpbiBzZXRYT1JNb2RlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCWFzc2VydFRydWUoZ2MuaGFzaENvZGUoKSA9PSBnYy5oYXNoQ29kZSgpKTsKLQlHQyBnYzIgPSBuZXcgR0Moc2hlbGwpOwotCWFzc2VydEZhbHNlKGdjLmhhc2hDb2RlKCkgPT0gZ2MyLmhhc2hDb2RlKCkpOwotCWdjMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNDbGlwcGVkKCkgewotCWFzc2VydEZhbHNlKGdjLmlzQ2xpcHBlZCgpKTsKLQlnYy5zZXRDbGlwcGluZyg1LDEwLDE1LDIwKTsKLQlhc3NlcnRUcnVlKGdjLmlzQ2xpcHBlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCWFzc2VydEZhbHNlKGdjLmlzRGlzcG9zZWQoKSk7Ci0JZ2MuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZ2MuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihzaGVsbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCBnYy5nZXRCYWNrZ3JvdW5kKCkpOwotCXRyeSB7IAotCQlnYy5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGNvbG9yIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoZ2MuZ2V0QmFja2dyb3VuZCgpLGdjLmdldEJhY2tncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQlnYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENsaXBwaW5nSUlJSSgpIHsKLQkvLyBpbnRlcm1pdHRlbnRseSBmYWlscyBvbiBYUCBmb3IgcmVhc29ucyB1bmtub3duLCBjb21tZW50IG91dCB0aGUgdGVzdCBjYXNlCi0JLy8gdW50aWwgdGhlIHByb2JsZW0gaXMgZmlndXJlZCBvdXQKLS8vCUNhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuQk9SREVSKTsKLS8vCXNoZWxsLnNldFNpemUoMTEwLDExMCk7Ci0vLwljYW52YXMuc2V0U2l6ZSgxMDAsMTAwKTsKLS8vCXNoZWxsLm9wZW4oKTsKLS8vCUdDIHRlc3RHYyA9IG5ldyBHQyhjYW52YXMpOwotLy8JdGVzdEdjLnNldENsaXBwaW5nKDAsNSwxMCwyMCk7Ci0vLwlSZWN0YW5nbGUgcmVjdCA9IHRlc3RHYy5nZXRDbGlwcGluZygpOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnggPT0gMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QueSA9PSA1KTsKLS8vCWFzc2VydFRydWUocmVjdC53aWR0aCA9PSAxMCk7Ci0vLwlhc3NlcnRUcnVlKHJlY3QuaGVpZ2h0ID09IDIwKTsKLS8vCXRlc3RHYy5kaXNwb3NlKCk7Ci0vLwljYW52YXMuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JLy8gaW50ZXJtaXR0ZW50bHkgZmFpbHMgb24gWFAgZm9yIHJlYXNvbnMgdW5rbm93biwgY29tbWVudCBvdXQgdGhlIHRlc3QgY2FzZQotCS8vIHVudGlsIHRoZSBwcm9ibGVtIGlzIGZpZ3VyZWQgb3V0Ci0vLwlDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULkJPUkRFUik7Ci0vLwlzaGVsbC5zZXRTaXplKDExMCwxMTApOwotLy8JY2FudmFzLnNldFNpemUoMTAwLDEwMCk7Ci0vLwlzaGVsbC5vcGVuKCk7Ci0vLwlHQyB0ZXN0R2MgPSBuZXcgR0MoY2FudmFzKTsKLS8vCXRlc3RHYy5zZXRDbGlwcGluZyhuZXcgUmVjdGFuZ2xlKDAsNSwxMCwyMCkpOwotLy8JUmVjdGFuZ2xlIHJlY3QgPSB0ZXN0R2MuZ2V0Q2xpcHBpbmcoKTsKLS8vCWFzc2VydFRydWUocmVjdC54ID09IDApOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LnkgPT0gNSk7Ci0vLwlhc3NlcnRUcnVlKHJlY3Qud2lkdGggPT0gMTApOwotLy8JYXNzZXJ0VHJ1ZShyZWN0LmhlaWdodCA9PSAyMCk7Ci0vLwl0ZXN0R2MuZGlzcG9zZSgpOwotLy8JY2FudmFzLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlnYy5zZXRGb250KHNoZWxsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Gb250KCkpOwotCUZvbnQgZm9udCA9IGdjLmdldEZvbnQoKTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHNoZWxsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Gb250KCkpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihzaGVsbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCBnYy5nZXRGb3JlZ3JvdW5kKCkpOwotCXRyeSB7IAotCQlnYy5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGNvbG9yIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoZ2MuZ2V0Rm9yZWdyb3VuZCgpLGdjLmdldEZvcmVncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVTdHlsZUkoKSB7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX1NPTElEKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX1NPTElEKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfREFTSCk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRMaW5lU3R5bGUoKSA9PSBTV1QuTElORV9EQVNIKTsKLQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfRE9UKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVTdHlsZSgpID09IFNXVC5MSU5FX0RPVCk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1QpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfREFTSERPVCk7Ci0JZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1RET1QpOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVN0eWxlKCkgPT0gU1dULkxJTkVfREFTSERPVERPVCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZVdpZHRoSSgpIHsKLQlnYy5zZXRMaW5lV2lkdGgoMTApOwotCWFzc2VydFRydWUoZ2MuZ2V0TGluZVdpZHRoKCkgPT0gMTApOwotCWdjLnNldExpbmVXaWR0aCgwKTsKLQlhc3NlcnRUcnVlKGdjLmdldExpbmVXaWR0aCgpID09IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFhPUk1vZGVaKCkgewotCWdjLnNldFhPUk1vZGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShnYy5nZXRYT1JNb2RlKCkpOwotCWdjLnNldFhPUk1vZGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKGdjLmdldFhPUk1vZGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JUG9pbnQgcHQgPSBnYy5zdHJpbmdFeHRlbnQoImFiYyIpOwotCWFzc2VydFRydWUocHQueCA+IDApOwotCWFzc2VydFRydWUocHQueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlQb2ludCBwdCA9IGdjLnRleHRFeHRlbnQoImFiYyIpOwotCWFzc2VydFRydWUocHQueCA+IDApOwotCWFzc2VydFRydWUocHQueSA+IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JUG9pbnQgcHQgPSBnYy50ZXh0RXh0ZW50KCJhYmMiLCAwKTsKLQlhc3NlcnRUcnVlKHB0LnggPiAwKTsKLQlhc3NlcnRUcnVlKHB0LnkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlTdHJpbmcgcyA9IGdjLnRvU3RyaW5nKCk7Ci0JYXNzZXJ0Tm90TnVsbChzKTsKLQlhc3NlcnRUcnVlKHMubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gZG8gbm90IHRlc3QgLSBXaW5kb3dzIG9ubHkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0MoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRHJhd2FibGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5QXJlYUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdBcmNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdGb2N1c0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3TGluZUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdPdmFsSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1BvaW50SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdQb2x5Z29uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdQb2x5bGluZSRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3UmVjdGFuZ2xlSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1JlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3Um91bmRSZWN0YW5nbGVJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxBcmNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxHcmFkaWVudFJlY3RhbmdsZUlJSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsT3ZhbElJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxQb2x5Z29uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxSZWN0YW5nbGVJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maWxsUmVjdGFuZ2xlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZpbGxSb3VuZFJlY3RhbmdsZUlJSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWR2YW5jZVdpZHRoQyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hhcldpZHRoQyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpcHBpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRNZXRyaWNzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lU3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFhPUk1vZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0NsaXBwZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDbGlwcGluZ0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lU3R5bGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lV2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRYT1JNb2RlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RyYXdhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHlBcmVhSUlJSUlJIikpIHRlc3RfY29weUFyZWFJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHlBcmVhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJIikpIHRlc3RfY29weUFyZWFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3QXJjSUlJSUlJIikpIHRlc3RfZHJhd0FyY0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0ZvY3VzSUlJSSIpKSB0ZXN0X2RyYXdGb2N1c0lJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSIpKSB0ZXN0X2RyYXdJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJIikpIHRlc3RfZHJhd0ltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUlJSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3TGluZUlJSUkiKSkgdGVzdF9kcmF3TGluZUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdPdmFsSUlJSSIpKSB0ZXN0X2RyYXdPdmFsSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1BvaW50SUkiKSkgdGVzdF9kcmF3UG9pbnRJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1BvbHlnb24kSSIpKSB0ZXN0X2RyYXdQb2x5Z29uJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdQb2x5bGluZSRJIikpIHRlc3RfZHJhd1BvbHlsaW5lJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdSZWN0YW5nbGVJSUlJIikpIHRlc3RfZHJhd1JlY3RhbmdsZUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2RyYXdSZWN0YW5nbGVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJIikpIHRlc3RfZHJhd1JvdW5kUmVjdGFuZ2xlSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSSIpKSB0ZXN0X2RyYXdTdHJpbmdMamF2YV9sYW5nX1N0cmluZ0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVoiKSkgdGVzdF9kcmF3U3RyaW5nTGphdmFfbGFuZ19TdHJpbmdJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSIpKSB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZHJhd1RleHRMamF2YV9sYW5nX1N0cmluZ0lJSSIpKSB0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2RyYXdUZXh0TGphdmFfbGFuZ19TdHJpbmdJSVoiKSkgdGVzdF9kcmF3VGV4dExqYXZhX2xhbmdfU3RyaW5nSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsQXJjSUlJSUlJIikpIHRlc3RfZmlsbEFyY0lJSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbEdyYWRpZW50UmVjdGFuZ2xlSUlJSVoiKSkgdGVzdF9maWxsR3JhZGllbnRSZWN0YW5nbGVJSUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbE92YWxJSUlJIikpIHRlc3RfZmlsbE92YWxJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUG9seWdvbiRJIikpIHRlc3RfZmlsbFBvbHlnb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbFJlY3RhbmdsZUlJSUkiKSkgdGVzdF9maWxsUmVjdGFuZ2xlSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfZmlsbFJlY3RhbmdsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkiKSkgdGVzdF9maWxsUm91bmRSZWN0YW5nbGVJSUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFkdmFuY2VXaWR0aEMiKSkgdGVzdF9nZXRBZHZhbmNlV2lkdGhDKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hhcldpZHRoQyIpKSB0ZXN0X2dldENoYXJXaWR0aEMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaXBwaW5nIikpIHRlc3RfZ2V0Q2xpcHBpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9nZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udE1ldHJpY3MiKSkgdGVzdF9nZXRGb250TWV0cmljcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVTdHlsZSIpKSB0ZXN0X2dldExpbmVTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZVdpZHRoIikpIHRlc3RfZ2V0TGluZVdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRYT1JNb2RlIikpIHRlc3RfZ2V0WE9STW9kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNDbGlwcGVkIikpIHRlc3RfaXNDbGlwcGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2xpcHBpbmdJSUlJIikpIHRlc3Rfc2V0Q2xpcHBpbmdJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDbGlwcGluZ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q2xpcHBpbmdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X3NldENsaXBwaW5nTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMaW5lU3R5bGVJIikpIHRlc3Rfc2V0TGluZVN0eWxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGluZVdpZHRoSSIpKSB0ZXN0X3NldExpbmVXaWR0aEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFhPUk1vZGVaIikpIHRlc3Rfc2V0WE9STW9kZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0cmluZ0V4dGVudExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc3RyaW5nRXh0ZW50TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdGV4dEV4dGVudExqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X3RleHRFeHRlbnRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X3dpbjMyX25ld0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EcmF3YWJsZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGlzcGxheSBkaXNwbGF5OwotU2hlbGwgc2hlbGw7Ci1JbWFnZSBpbWFnZTsKLUdDIGdjOwotCi0vKioKLSAqIFJldHVybiB0aGUgYWN0dWFsIFJHQiB2YWx1ZSB1c2VkIGZvciByZW5kZXJpbmcgZm9yIHRoZSBnaXZlbiBDb2xvci4KLSAqIFRoaXMgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBDb2xvcidzIFJHQiB2YWx1ZSBvbiBsb3dlci1jb2xvciBkaXNwbGF5cyAKLSAqICgxNmJwcCBvciBsZXNzKS4KLSAqLwotUkdCIGdldFJlYWxSR0IoQ29sb3IgY29sb3IpIHsKLQlJbWFnZSBjb2xvckltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JR0MgaW1hZ2VHYyA9IG5ldyBHQyhjb2xvckltYWdlKTsKLQlJbWFnZURhdGEgaW1hZ2VEYXRhOwotCVBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0JaW50IHBpeGVsOwotCQotCWltYWdlR2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JaW1hZ2VHYy5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLmZpbGxSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQlpbWFnZURhdGEgPSBjb2xvckltYWdlLmdldEltYWdlRGF0YSgpOwotCXBhbGV0dGUgPSBpbWFnZURhdGEucGFsZXR0ZTsKLQlpbWFnZUdjLmRpc3Bvc2UoKTsKLQljb2xvckltYWdlLmRpc3Bvc2UoKTsKLQlwaXhlbCA9IGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKTsKLQlyZXR1cm4gcGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTJjOGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0NEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0NEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDgzNGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCkgewotCUltYWdlIGltYWdlOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIC0xLCAxMCk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPD0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMCwgMTApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoIDw9IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB3aWR0aCA8PSAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAtMjApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDApOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8PSAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDw9IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JSW1hZ2UgaW1hZ2U7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IG51bGw7Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgMTApOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMTApOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHdpZHRoID09IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgLTEpOwotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcyk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaGVpZ2h0IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAxMCwgMCk7Ci0JdHJ5IHsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGhlaWdodCA9PSAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCS8vIHZhbGlkIGltYWdlcwotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoLTEsIC0xMCwgMTAsIDEwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShudWxsLCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBib3VuZHMpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKSB7Ci0JSW1hZ2VEYXRhIGRhdGEgPSBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQkKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQotLy8JUGxhdGZvcm0tc3BlY2lmaWMgdGVzdC4gIAotLy8JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEoMHhmZjAwMDAsIDB4MDBmZjAwLCAweDAwMDBmZikpOwotLy8JdHJ5IHsKLS8vCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhKTsKLS8vCQlpbWFnZS5kaXNwb3NlKCk7Ci0vLwkJZmFpbCgiVW5zdXBwb3J0ZWQgY29sb3IgZGVwdGgiKTsKLS8vCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwl9Ci0KLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UobnVsbCwgZGF0YSk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQkKLQlkYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDgsIG5ldyBQYWxldHRlRGF0YSgweDMwLCAweDBDLCAweDAzKSk7Ci0JLy8gc2V0IHJlZCBwaXhlbCBhdCB4PTksIHk9OQotCWRhdGEuc2V0UGl4ZWwoOSwgOSwgMHgzMCk7Ci0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgZGF0YSk7Ci0JSW1hZ2UgZ2NJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGdjID0gbmV3IEdDKGdjSW1hZ2UpOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGdjSW1hZ2VEYXRhID0gZ2NJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbnQgcmVkUGl4ZWwgPSBnY0ltYWdlRGF0YS5nZXRQaXhlbCg5LCA5KTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGdldFJlYWxSR0IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHJlZFBpeGVsKSk7Ci0JZ2MuZGlzcG9zZSgpOwotCWdjSW1hZ2UuZGlzcG9zZSgpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgpIHsKLQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JSW1hZ2VEYXRhIGRhdGExID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBJbWFnZURhdGEgc291cmNlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbnVsbDsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIG1hc2sgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBtYXNrID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWRhdGExID0gbmV3IEltYWdlRGF0YSgxLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSB3aWR0aCAhPSBJbWFnZURhdGEgbWFzayB3aWR0aCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlRGF0YSBzb3VyY2Ugd2lkdGggIT0gSW1hZ2VEYXRhIG1hc2sgd2lkdGgiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCi0JZGF0YSA9IG5ldyBJbWFnZURhdGEoMTAsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSBoZWlnaHQgIT0gSW1hZ2VEYXRhIG1hc2sgaGVpZ2h0Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgSW1hZ2VEYXRhIHNvdXJjZSBoZWlnaHQgIT0gSW1hZ2VEYXRhIG1hc2sgaGVpZ2h0IiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQlkYXRhMSA9IG5ldyBJbWFnZURhdGEoMTAsIDEwLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGRhdGEsIGRhdGExKTsgLy8gSW1hZ2Ugbm93IGFjY2VwdHMgbWFza3Mgd2hlcmUgZGVwdGggIT0gMQotCWltYWdlLmRpc3Bvc2UoKTsKLQotCWRhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgOCwgbmV3IFBhbGV0dGVEYXRhKDB4MzAsIDB4MEMsIDB4MDMpKTsKLQkvLyBzZXQgb3BhcXVlIHJlZCBwaXhlbCBhdCB4PTksIHk9OQotCWRhdGEuc2V0UGl4ZWwoOSwgOSwgMHgzMCk7Ci0JZGF0YTEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlkYXRhMS5zZXRQaXhlbCg5LCA5LCAxKTsKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhLCBkYXRhMSk7Ci0JSW1hZ2UgZ2NJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCUdDIGdjID0gbmV3IEdDKGdjSW1hZ2UpOwotCUNvbG9yIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOyAKLQlnYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWdjLmRyYXdJbWFnZShpbWFnZSwgMCwgMCk7Ci0JSW1hZ2VEYXRhIGdjSW1hZ2VEYXRhID0gZ2NJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQlpbnQgcmVkUGl4ZWwgPSBnY0ltYWdlRGF0YS5nZXRQaXhlbCg5LCA5KTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGdldFJlYWxSR0IoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKSksIGdjSW1hZ2VEYXRhLnBhbGV0dGUuZ2V0UkdCKHJlZFBpeGVsKSk7Ci0JaW50IGJsdWVQaXhlbCA9IGdjSW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCWFzc2VydEVxdWFscygiOmI6IiwgZ2V0UmVhbFJHQihiYWNrZ3JvdW5kQ29sb3IpLCBnY0ltYWdlRGF0YS5wYWxldHRlLmdldFJHQihibHVlUGl4ZWwpKTsKLQlnYy5kaXNwb3NlKCk7Ci0JZ2NJbWFnZS5kaXNwb3NlKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSgpIHsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIElucHV0U3RyZWFtID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImVtcHR5LnR4dCIpOwotCQl0cnkgewotCQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgc3RyZWFtKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBJbnB1dFN0cmVhbSIsIFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGUpOwotCQl9Ci0KLQkJaW50IG51bUZvcm1hdHMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHMubGVuZ3RoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMF07Ci0JCURpc3BsYXlbXSBkaXNwbGF5cyA9IHtkaXNwbGF5LCBudWxsfTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotLy8JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQotCQkJCXRyeSB7Ci0JCQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIElucHV0U3RyZWFtIik7Ci0JCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vIEJ1ZyA3MDE2NyAtIEltYWdlKERldmljZSwgSW5wdXRTdHJlYW0pIHRocm93cyBpbmNvcnJlY3QgZXhjZXB0aW9uIGZvciBiYWQgUE5HCi0vLyByZW1vdmUgY29tbWVudCB3aGVuIGJ1ZyBpcyBmaXhlZC4KLS8vCQkJCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGltYWdlIElucHV0U3RyZWFtIiwgU1dULkVSUk9SX0lOVkFMSURfSU1BR0UsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oU3d0VGVzdENhc2UuaW52YWxpZEltYWdlRmlsZW5hbWVzWzFdKTsKLQkJdHJ5IHsKLQkJCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHN0cmVhbSk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgaW1hZ2UgSW5wdXRTdHJlYW0iLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCX0JCQotCi0JCS8vIGNyZWF0ZSB2YWxpZCBpbWFnZXMKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJaW50IG51bUZpbGVOYW1lcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGs9MDsgazxudW1GaWxlTmFtZXM7IGsrKykgewotCQkJCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNba107CQkKLQkJCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQkJCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUgKyAiLiIgKyBmb3JtYXQpOwotCQkJCQlpbWFnZSA9IG5ldyBJbWFnZSh0ZW1wRGlzcGxheSwgc3RyZWFtKTsKLQkJCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGZpbGVOYW1lKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlIG5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGZpbGUgbmFtZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSAibm9uZXhpc3RlbnQudHh0IjsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5vbi1leGlzdGVudCBmaWxlIG5hbWUiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBub24tZXhpc3RlbnQgZmlsZSBuYW1lIiwgU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlIG5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLQlpZiAoIWlzSjJNRSgpKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKCJlbXB0eS50eHQiKTsKLQkJCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIHBhdGhOYW1lKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIsIFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQsIGUpOwotCQl9Ci0JCi0JCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQkJZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbnZhbGlkSW1hZ2VGaWxlbmFtZXNbMF07Ci0JCURpc3BsYXlbXSBkaXNwbGF5cyA9IHtkaXNwbGF5LCBudWxsfTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBkaXNwbGF5cy5sZW5ndGg7IGorKykgewotLy8JCQlEaXNwbGF5IHRlbXBEaXNwbGF5ID0gZGlzcGxheXNbal07Ci0JCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZmlsZSBuYW1lIik7Ci0JCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkgQnVnIDcwMTY3IC0gSW1hZ2UoRGV2aWNlLCBJbnB1dFN0cmVhbSkgdGhyb3dzIGluY29ycmVjdCBleGNlcHRpb24gZm9yIGJhZCBQTkcKLS8vCQkJCQkgcmVtb3ZlIGNvbW1lbnQgd2hlbiBidWcgaXMgZml4ZWQuCi0vLwkJCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBpbWFnZSBmaWxlIG5hbWUiLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKFN3dFRlc3RDYXNlLmludmFsaWRJbWFnZUZpbGVuYW1lc1sxXSk7Ci0JCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBwYXRoTmFtZSk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGZpbGUgbmFtZSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBpbWFnZSBmaWxlIG5hbWUiLCBTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSwgZSk7Ci0JCX0JCQotCQotCQkvLyBjcmVhdGUgdmFsaWQgaW1hZ2VzCi0JCWZvciAoaW50IGogPSAwOyBqIDwgZGlzcGxheXMubGVuZ3RoOyBqKyspIHsKLS8vCQkJRGlzcGxheSB0ZW1wRGlzcGxheSA9IGRpc3BsYXlzW2pdOwotCQkJaW50IG51bUZpbGVOYW1lcyA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzLmxlbmd0aDsKLQkJCWZvciAoaW50IGs9MDsgazxudW1GaWxlTmFtZXM7IGsrKykgewotCQkJCWZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNba107Ci0JCQkJZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQkJCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJCQlTdHJpbmcgcGF0aE5hbWUgPSBnZXRQYXRoKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgcGF0aE5hbWUpOwotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIGlzRGlzcG9zZWQoKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JSW1hZ2UgaW1hZ2UxID0gbnVsbDsKLQotCXRyeSB7Ci0JCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JCWltYWdlMSA9IGltYWdlOwotCQotCQlhc3NlcnRGYWxzZSgiOmE6IiwgaW1hZ2UuZXF1YWxzKG51bGwpKTsKLQkJCi0JCWFzc2VydFRydWUoIjpiOiIsIGltYWdlLmVxdWFscyhpbWFnZTEpKTsKLQkJCi0JCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKDEwLCAxMCwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQlpbWFnZTEgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJYXNzZXJ0RmFsc2UoIjpjOiIsIGltYWdlLmVxdWFscyhpbWFnZTEpKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlMS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIiwgU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQsIGUpOwotCX0KLQkvLyByZW1haW5kZXIgdGVzdGVkIGluIHNldEJhY2tncm91bmQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVJlY3RhbmdsZSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDEwLCAyMCk7Ci0JSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiLCBTV1QuRVJST1JfR1JBUEhJQ19ESVNQT1NFRCwgZSk7Ci0JfQotCQkKLQkvLyBjcmVhdGVzIGJpdG1hcCBpbWFnZQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JUmVjdGFuZ2xlIGJvdW5kczEgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBib3VuZHMsIGJvdW5kczEpOwotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgYm91bmRzKTsKLQlib3VuZHMxID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmI6IiwgYm91bmRzLCBib3VuZHMxKTsKLQotCS8vIGNyZWF0ZSBpY29uIGltYWdlCi0JSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JYm91bmRzMSA9IGltYWdlLmdldEJvdW5kcygpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIGJvdW5kcywgYm91bmRzMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VEYXRhKCkgewkKLQlnZXRJbWFnZURhdGExKCk7Ci0JZ2V0SW1hZ2VEYXRhMigyNCwgbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYpKTsJCQotCWdldEltYWdlRGF0YTIoMzIsIG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHhmZjAwLCAweGZmKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFzaENvZGUoKSB7Ci0JSW1hZ2UgaW1hZ2UgPSBudWxsOwotCUltYWdlIGltYWdlMSA9IG51bGw7Ci0KLQl0cnkgewotCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCQlpbWFnZTEgPSBpbWFnZTsKLQkKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCBpbWFnZTEuaGFzaENvZGUoKSwgaW1hZ2UuaGFzaENvZGUoKSk7Ci0JCQotCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQkJaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2VEYXRhKTsKLQkJaW1hZ2UxID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JCWJvb2xlYW4gZXF1YWxzID0gKGltYWdlMS5oYXNoQ29kZSgpID09IGltYWdlLmhhc2hDb2RlKCkpOwotCQlhc3NlcnRGYWxzZSgiOmI6IiwgZXF1YWxzKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWltYWdlMS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhKCkgewotCS8vIGphdmFkb2Mgc3RhdGVzOgotCS8vIDxiPklNUE9SVEFOVDo8L2I+IFRoaXMgbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiBwYXJ0IG9mIHRoZSBwdWJsaWMKLQkvLyBBUEkgZm9yIDxjb2RlPkltYWdlPC9jb2RlPgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2U8L2NvZGU+Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWFzc2VydEZhbHNlKCI6YToiLCBpbWFnZS5pc0Rpc3Bvc2VkKCkpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBpbWFnZS5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUltYWdlIGltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0KLQl0cnkgewotCQlpbWFnZS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2xvciA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9IGZpbmFsbHkgewotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JfQotCi0JaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDI1NSwgMjU1KTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGNvbG9yIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgY29sb3IiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfSBmaW5hbGx5IHsKLQkJaW1hZ2UuZGlzcG9zZSgpOwotCX0KLQotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIDEwLCAxMCk7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCWNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMjU1LCAyNTUpOwotCXRyeSB7Ci0JCWltYWdlLnNldEJhY2tncm91bmQoY29sb3IpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBpbWFnZSIpOwotCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIiwgU1dULkVSUk9SX0dSQVBISUNfRElTUE9TRUQsIGUpOwotCX0gZmluYWxseSB7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLy8gdGhpcyBpbWFnZSBkb2VzIG5vdCBoYXZlIGEgdHJhbnNwYXJlbnQgcGl4ZWwgYnkgZGVmYXVsdCBzbyBzZXRCYWNrZ3JvdW5kIGhhcyBubyBlZmZlY3QKLQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCWltYWdlLnNldEJhY2tncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsKLQljb2xvciA9IGltYWdlLmdldEJhY2tncm91bmQoKTsKLQlhc3NlcnROdWxsKCJiYWNrZ3JvdW5kIGNvbG9yIHNob3VsZCBiZSBudWxsIGZvciBub24tdHJhbnNwYXJlbnQgaW1hZ2UiLCBjb2xvcik7Ci0JaW1hZ2UuZGlzcG9zZSgpOwotCQotCS8vIGNyZWF0ZSBhbiBpbWFnZSB3aXRoIHRyYW5zcGFyZW5jeSBhbmQgdGhlbiBzZXQgdGhlIGJhY2tncm91bmQgY29sb3IKLQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSgxMCwgMTAsIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSksIG5ldyBSR0IoNTAsIDEwMCwgMTUwKX0pKTsKLQlpbWFnZURhdGEudHJhbnNwYXJlbnRQaXhlbCA9IDA7IC8vIHRyYW5zcGFyZW50IHBpeGVsIGlzIGN1cnJlbnRseSBibGFjawotCWltYWdlID0gbmV3IEltYWdlKGRpc3BsYXksIGltYWdlRGF0YSk7Ci0JaW1hZ2Uuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9HUkVFTikpOwotCWNvbG9yID0gaW1hZ2UuZ2V0QmFja2dyb3VuZCgpOwotCWFzc2VydEVxdWFscygiYmFja2dyb3VuZCBjb2xvciBzaG91bGQgaGF2ZSBiZWVuIHNldCB0byBncmVlbiIsIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSwgY29sb3IpOwotCWltYWdlLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCAxMCwgMTApOwotCXRyeSB7Ci0JCWFzc2VydE5vdE51bGwoaW1hZ2UudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoaW1hZ2UudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotCX0gZmluYWxseSB7Ci0JCWltYWdlLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSgpIHsKLQkvLyBkbyBub3QgdGVzdCAtIFdpbmRvd3Mgb25seQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRGlzcG9zZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMamF2YV9pb19JbnB1dFN0cmVhbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VEYXRhIikpIHRlc3RfZ2V0SW1hZ2VEYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNEaXNwb3NlZCIpKSB0ZXN0X2lzRGlzcG9zZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUlJKCk7Ci19Ci0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLQotLyoqIFRlc3QgaW1wbGVtZW50YXRpb24gKiovCi0KLXZvaWQgZ2V0SW1hZ2VEYXRhMSgpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF07Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJSW1hZ2VEYXRhIGRhdGExID0gbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBkYXRhMSk7Ci0JCUltYWdlRGF0YSBkYXRhMiA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiSW1hZ2Ugd2lkdGggc2hvdWxkIGJlIHRoZSBzYW1lIiwgZGF0YTEud2lkdGgsIGRhdGEyLndpZHRoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbWFnZSBoZWlnaHQgc2hvdWxkIGJlIHRoZSBzYW1lIiwgZGF0YTEuaGVpZ2h0LCBkYXRhMi5oZWlnaHQpOwotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvbnRpbnVlOwotCQl9Ci0JfQotfQotCi0vKgotICogVmVyaWZ5IEltYWdlLmdldEltYWdlRGF0YSByZXR1cm5zIHBpeGVscyB3aXRoIHRoZSBzYW1lIFJHQiB2YWx1ZSBhcyB0aGUKLSAqIHNvdXJjZSBpbWFnZS4gVGhpcyB0ZXN0IG9ubHkgbWFrZXMgc2Vuc2Ugd2l0aCBkZXB0aCBvZiAyNCBhbmQgMzIgYml0cy4KLSAqLwotdm9pZCBnZXRJbWFnZURhdGEyKGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSkgewotCWludCB3aWR0aCA9IDEwOwotCWludCBoZWlnaHQgPSAxMDsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAwLCAweGZmLCAwKTsKLQlSR0IgY29sb3JSR0IgPSBjb2xvci5nZXRSR0IoKTsKLQotCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZURhdGEpOwotCQkKLQlHQyBnYyA9IG5ldyBHQyhpbWFnZSk7Ci0JZ2Muc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCQkKLQlJbWFnZURhdGEgbmV3RGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCVBhbGV0dGVEYXRhIG5ld1BhbGV0dGUgPSBuZXdEYXRhLnBhbGV0dGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKLQkJCWludCBwaXhlbCA9IG5ld0RhdGEuZ2V0UGl4ZWwoaSwgaik7Ci0JCQlSR0IgcmdiID0gbmV3UGFsZXR0ZS5nZXRSR0IocGl4ZWwpOwotCQkJYXNzZXJ0VHJ1ZSgicmdiLmVxdWFscyhjb2xvclJHQikiLCByZ2IuZXF1YWxzKGNvbG9yUkdCKSk7Ci0JCX0KLQl9Ci0JY29sb3IuZGlzcG9zZSgpOwotCWdjLmRpc3Bvc2UoKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci19Ci1TdHJpbmcgZ2V0UGF0aChTdHJpbmcgZmlsZU5hbWUpIHsKLQlTdHJpbmcgdXJsUGF0aDsKLQkKLQlTdHJpbmcgcGx1Z2luUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiUExVR0lOX1BBVEgiKTsKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQl9Ci0JaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgewotCQlVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKGZpbGVOYW1lKTsKLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQlmYWlsKCJVUkwgPT0gbnVsbCBmb3IgZmlsZSAiICsgZmlsZU5hbWUpOwotCQl9Ci0JCXVybFBhdGggPSB1cmwuZ2V0RmlsZSgpOwotCX0gZWxzZSB7Ci0JCXVybFBhdGggPSBwbHVnaW5QYXRoICsgIi9kYXRhLyIgKyBmaWxlTmFtZTsKLQl9Ci0JCi0JaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHVybFBhdGggPSB1cmxQYXRoLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwkKLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzICYmIHVybFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpID09IDApIHVybFBhdGggPSB1cmxQYXRoLnN1YnN0cmluZygxKTsKLQl1cmxQYXRoID0gdXJsUGF0aC5yZXBsYWNlQWxsKCIlMjAiLCAiICIpOwkKLQkKLQlpZiAodmVyYm9zZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc29sdmVkIGZpbGUgbmFtZSBmb3IgIiArIGZpbGVOYW1lICsgIiA9ICIgKyB1cmxQYXRoKTsKLQl9Ci0JcmV0dXJuIHVybFBhdGg7Ci19Ci1SR0IgZ2V0UmVhbFJHQihDb2xvciBjb2xvcikgewotCUltYWdlIGNvbG9ySW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgMTAsIDEwKTsKLQlHQyBpbWFnZUdjID0gbmV3IEdDKGNvbG9ySW1hZ2UpOwotCUltYWdlRGF0YSBpbWFnZURhdGE7Ci0JUGFsZXR0ZURhdGEgcGFsZXR0ZTsKLQlpbnQgcGl4ZWw7Ci0JCi0JaW1hZ2VHYy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQlpbWFnZUdjLnNldEZvcmVncm91bmQoY29sb3IpOwotCWltYWdlR2MuZmlsbFJlY3RhbmdsZSgwLCAwLCAxMCwgMTApOwotCWltYWdlRGF0YSA9IGNvbG9ySW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JcGFsZXR0ZSA9IGltYWdlRGF0YS5wYWxldHRlOwotCWltYWdlR2MuZGlzcG9zZSgpOwotCWNvbG9ySW1hZ2UuZGlzcG9zZSgpOwotCXBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApOwotCXJldHVybiBwYWxldHRlLmdldFJHQihwaXhlbCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiZjg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGEKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDMyLCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAsIDB4RkYwMCwgMHhGRikpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoKSB7Ci0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgtMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIC0xLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYWxldHRlRGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDMsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHVuc3VwcG9ydGVkIGRlcHRoIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JaW50W10gdmFsaWREZXB0aHMgPSB7MSwgMiwgNCwgOCwgMTYsIDI0LCAzMn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZERlcHRocy5sZW5ndGg7IGkrKykgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIHZhbGlkRGVwdGhzW2ldLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEIoKSB7Ci0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgtMSwgMSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHt9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIC0xLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBoZWlnaHQgPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG51bGwsIDAsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYWxldHRlRGF0YSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgSW1hZ2VEYXRhKDEsIDEsIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCl9KSwgMSwgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRhdGEgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCAzLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDEsIG5ldyBieXRlW10ge30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB1bnN1cHBvcnRlZCBkZXB0aCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludFtdIHZhbGlkRGVwdGhzID0gezEsIDIsIDQsIDgsIDE2LCAyNCwgMzJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWREZXB0aHMubGVuZ3RoOyBpKyspIHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCB2YWxpZERlcHRoc1tpXSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAxLCBuZXcgYnl0ZVtdIHt9KTsKLQl9Ci0JCi0JLy8gaWxsZWdhbCBhcmd1bWVudCwgZGF0YSBpcyBudWxsCi0JdHJ5IHsKLQkJbmV3IEltYWdlRGF0YSgxLCAxLCA4LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApfSksIDQsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGRhdGEiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQkvLyBkaXZpZGUgYnkgemVybyBleGNlcHRpb24gaWYgc2NhbmxpbmVQYWQgPT0gMAotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoMSwgMSwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKX0pLCAwLCBuZXcgYnl0ZVtdIHt9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2NhbmxpbmVQYWQgPT0gMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKSB7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQl0cnkgewotCQl0cnkgewotCQkJbmV3IEltYWdlRGF0YShzdHJlYW0pOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgSW5wdXRTdHJlYW0gPT0gbnVsbCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlbXB0eS50eHQiKTsKLQkJdHJ5IHsKLQkJCW5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgSW5wdXRTdHJlYW0iKTsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQotCQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFN3dFRlc3RDYXNlLmltYWdlRmlsZW5hbWVzWzBdOwotCQlmb3IgKGludCBpPTA7IGk8bnVtRm9ybWF0czsgaSsrKSB7Ci0JCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQluZXcgSW1hZ2VEYXRhKHN0cmVhbSk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCW5ldyBJbWFnZURhdGEoZmlsZW5hbWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBmaWxlbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Nsb25lKCkgewotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1swXSArICIuIiArIFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1swXSk7Ci0JCUltYWdlRGF0YSBkYXRhMSA9IG5ldyBJbWFnZURhdGEoc3RyZWFtKTsKLQkJSW1hZ2VEYXRhIGRhdGEyID0gKEltYWdlRGF0YSkgZGF0YTEuY2xvbmUoKTsKLQkJLy8gaW1hZ2VEYXRhIGRvZXMgbm90IGltcGxlbWVudCBhbiBlcXVhbHMoT2JqZWN0KSBtZXRob2QKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCBkYXRhMS5hbHBoYSwgZGF0YTIuYWxwaGEpOwotCQlhc3NlcnRFcXVhbHMoIjpiOiIsIGRhdGExLmFscGhhRGF0YSwgZGF0YTIuYWxwaGFEYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCBkYXRhMS5ieXRlc1BlckxpbmUsIGRhdGEyLmJ5dGVzUGVyTGluZSk7Ci0JCWFzc2VydEVxdWFscygiOmQ6IiwgZGF0YTEuZGF0YSwgZGF0YTIuZGF0YSk7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgZGF0YTEuZGVsYXlUaW1lLCBkYXRhMi5kZWxheVRpbWUpOwotCQlhc3NlcnRFcXVhbHMoIjpmOiIsIGRhdGExLmRlcHRoLCBkYXRhMi5kZXB0aCk7Ci0JCWFzc2VydEVxdWFscygiOmc6IiwgZGF0YTEuZGlzcG9zYWxNZXRob2QsIGRhdGEyLmRpc3Bvc2FsTWV0aG9kKTsKLQkJYXNzZXJ0RXF1YWxzKCI6aDoiLCBkYXRhMS5oZWlnaHQsIGRhdGEyLmhlaWdodCk7Ci0JCWFzc2VydEVxdWFscygiOmk6IiwgZGF0YTEubWFza0RhdGEsIGRhdGEyLm1hc2tEYXRhKTsKLQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCBkYXRhMS5tYXNrUGFkLCBkYXRhMi5tYXNrUGFkKTsKLQkJYXNzZXJ0RXF1YWxzKCI6azoiLCBkYXRhMS5wYWxldHRlLCBkYXRhMi5wYWxldHRlKTsKLQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCBkYXRhMS5zY2FubGluZVBhZCwgZGF0YTIuc2NhbmxpbmVQYWQpOwotCQlhc3NlcnRFcXVhbHMoIjptOiIsIGRhdGExLnRyYW5zcGFyZW50UGl4ZWwsIGRhdGEyLnRyYW5zcGFyZW50UGl4ZWwpOwotCQlhc3NlcnRFcXVhbHMoIjpuOiIsIGRhdGExLnR5cGUsIGRhdGEyLnR5cGUpOwotCQlhc3NlcnRFcXVhbHMoIjpvOiIsIGRhdGExLndpZHRoLCBkYXRhMi53aWR0aCk7Ci0JCWFzc2VydEVxdWFscygiOnA6IiwgZGF0YTEueCwgZGF0YTIueCk7Ci0JCWFzc2VydEVxdWFscygiOnE6IiwgZGF0YTEueSwgZGF0YTIueSk7Ci0JfSBmaW5hbGx5IHsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFscGhhSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCWFzc2VydEVxdWFscygiOmE6IiwgMjU1LCBpbWFnZURhdGEuZ2V0QWxwaGEoMCwgMCkpOwotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGEoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYShJTUFHRV9ESU1FTlNJT04sIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYSgwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhKDAsIElNQUdFX0RJTUVOU0lPTik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxwaGFzSUlJJEJJKCkgewotCWJ5dGUgdmFsdWU7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlieXRlW10gYWxwaGFEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0JCi0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmE6IiwgMCwgYWxwaGFEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgKGJ5dGUpIDI1NSwgYWxwaGFEYXRhW2ldKTsKLQkJfQotCX0KLQotCXZhbHVlID0gKGJ5dGUpIDB4QUE7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW10ge3ZhbHVlLCAoYnl0ZSkgKHZhbHVlKzEpLCAoYnl0ZSkgKHZhbHVlKzIpLCAoYnl0ZSkgKHZhbHVlKzMpLCAoYnl0ZSkgKHZhbHVlKzQpfTsKLQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGFscGhhRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIChieXRlKSB2YWx1ZXNbaS1PRkZTRVRdLCBhbHBoYURhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCAwLCBhbHBoYURhdGFbaV0pOwotCQl9Ci0JfQotCQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRIKkdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBnZXRXaWR0aCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgR0VUX1dJRFRILCAoYnl0ZVtdKSBudWxsLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhbHBoYXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKC0xLCAxLCBHRVRfV0lEVEgsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0QWxwaGFzKElNQUdFX0RJTUVOU0lPTiwgMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCAtMSwgR0VUX1dJRFRILCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldEFscGhhcygwLCBJTUFHRV9ESU1FTlNJT04sIEdFVF9XSURUSCwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRBbHBoYXMoMCwgMSwgLTEsIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggPCAwIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBpbWFnZURhdGEuZ2V0UGl4ZWwoMCwgMCkpOwotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRQaXhlbCgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWwoLTEsIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbChJTUFHRV9ESU1FTlNJT04sIDEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbCgwLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVsKDAsIElNQUdFX0RJTUVOU0lPTik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW50IHdpZHRoID0gMzsKLQlpbnQgaGVpZ2h0ID0gMzsKLQlpbnQgZGVwdGggPSA0OwotCWJ5dGUgcGl4ZWxWYWx1ZSA9IDE7Ci0JYnl0ZVtdIGRhdGEgPSB7KGJ5dGUpICgocGl4ZWxWYWx1ZSA8PCA0KSArIHBpeGVsVmFsdWUpLCAoYnl0ZSkgKHBpeGVsVmFsdWUgPDwgNCksIChieXRlKSAoKHBpeGVsVmFsdWUgPDwgNCkgKyBwaXhlbFZhbHVlKSwgKGJ5dGUpIChwaXhlbFZhbHVlIDw8IDQpLCAoYnl0ZSkgKChwaXhlbFZhbHVlIDw8IDQpICsgcGl4ZWxWYWx1ZSksIChieXRlKSAocGl4ZWxWYWx1ZSA8PCA0KX07IAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgZGVwdGgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMjU1KSwgbmV3IFJHQigxMTEsIDExMSwgMTExKX0pLCAxLCBkYXRhKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotCQkJaW50IHBpeGVsID0gaW1hZ2VEYXRhLmdldFBpeGVsKHgsIHkpOwotCQkJYXNzZXJ0RXF1YWxzKCJCYWQgcGl4ZWwgZGF0YSIsIHBpeGVsVmFsdWUsIHBpeGVsKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbHNJSUkkQkkoKSB7Ci0JZmluYWwgaW50IFNJWkUgPSAyMDsgCi0JZmluYWwgaW50IEdFVF9XSURUSCA9IDEwOwotCWZpbmFsIGludCBPRkZTRVQgPSAxMDsKLQlieXRlW10gcGl4ZWxEYXRhID0gbmV3IGJ5dGVbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmE6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQlieXRlW10gdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjplOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDIsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmY6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpqOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOms6IiwgKGJ5dGUpIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpsOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOm06IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4RiwgKGJ5dGUpMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCAoYnl0ZSkgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnA6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCpHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZ2V0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygtMSwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgLTEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7CQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRlcHRoIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRILCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGl4ZWxzSUlJJElJKCkgewotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBHRVRfV0lEVEggPSAxMDsKLQlmaW5hbCBpbnQgT0ZGU0VUID0gMTA7Ci0JaW50W10gcGl4ZWxEYXRhID0gbmV3IGludFtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpkOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMiwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpICsrKSB7Ci0JCWFzc2VydEVxdWFscygiOmU6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQl9Ci0KLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHgyLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6aToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOmo6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6azoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA4IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjptOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4RiwgMHhGRn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoLCB2YWx1ZXMsIDApOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgPCBPRkZTRVQpIHsKLQkJCWFzc2VydEVxdWFscygiOm46IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUICsgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6bzoiLCB2YWx1ZXNbaS1PRkZTRVRdLCBwaXhlbERhdGFbaV0pOwkKLQkJfSBlbHNlIGlmIChpIDwgT0ZGU0VUK0dFVF9XSURUSCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6cDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAxNiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxNiwgbmV3IFBhbGV0dGVEYXRhKDB4RjgwMCwgMHg3RTAsIDB4MUYpKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSArKykgewotCQlhc3NlcnRFcXVhbHMoIjpxOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JfQotCi0JdmFsdWVzID0gbmV3IGludFtdezAsIDB4MiwgMHhGLCAweEZGLCAweEZGQUF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpyOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOnM6IiwgdmFsdWVzW2ktT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsJCi0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCtHRVRfV0lEVEgpIHsKLQkJCWFzc2VydEVxdWFscygiOnQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMjQgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMjQsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6dToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGgsIHZhbHVlcywgMCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSA8IE9GRlNFVCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6djoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQgKyB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp3OiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp4OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDMyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDMyLCBuZXcgUGFsZXR0ZURhdGEoMHhGRjAwMDAwMCwgMHhGRjAwLCAweEZGKSk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkgKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCI6eToiLCAwLCBwaXhlbERhdGFbaV0pOwotCX0KLQotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweEZGLCAweEZGQUEsIDB4RkYwMEFBMDB9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCwgdmFsdWVzLCAwKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpIDwgT0ZGU0VUKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjp6OiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSBpZiAoaSA8IE9GRlNFVCArIHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmFhOiIsIHZhbHVlc1tpLU9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7CQotCQl9IGVsc2UgaWYgKGkgPCBPRkZTRVQrR0VUX1dJRFRIKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphYjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgqR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBHRVRfV0lEVEgsIChpbnRbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscygtMSwgMSwgR0VUX1dJRFRILCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLmdldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgLTEsIEdFVF9XSURUSCwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBHRVRfV0lEVEgsIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIGdldFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCcygpIHsKLQlhc3NlcnROdWxsKCI6YToiLCBpbWFnZURhdGEuZ2V0UkdCcygpKTsKLQlSR0JbXSByZ2JzID0gbmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9OwotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDgsIG5ldyBQYWxldHRlRGF0YShyZ2JzKSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCByZ2JzLCBpbWFnZURhdGEuZ2V0UkdCcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrKCkgewotLy8JQnVnIDcxNDcyIC0gdHJhbnNwYXJlbmN5IG1hc2sgc2hvdWxkIGJlIG51bGwJCi0vLwlhc3NlcnROdWxsKCI6YToiLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5TWFzaygpKTsKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzWzBdKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCUltYWdlRGF0YSBtYXNrRGF0YSA9IGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lNYXNrKCk7Ci0JYXNzZXJ0Tm90TnVsbCgiOmI6IiwgbWFza0RhdGEpOwotCi0vLwlCdWcgNzE0NzIgLSB0cmFuc3BhcmVuY3kgbWFzayBzaG91bGQgYmUgbnVsbAkKLS8qCWltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oaW1hZ2VGaWxlbmFtZXNbMF0gKyAnLicgKyBpbWFnZUZvcm1hdHNbaW1hZ2VGb3JtYXRzLmxlbmd0aC0xXSkpOwotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCW1hc2tEYXRhID0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeU1hc2soKTsKLQlhc3NlcnROdWxsKCI6YzoiLCBtYXNrRGF0YSk7Ci0qLwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc3BhcmVuY3lUeXBlKCkgewotCWFzc2VydEVxdWFscygiOmE6IiwgU1dULlRSQU5TUEFSRU5DWV9OT05FLCBpbWFnZURhdGEuZ2V0VHJhbnNwYXJlbmN5VHlwZSgpKTsKLQotCUlucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzWzBdKTsKLQlJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShEaXNwbGF5LmdldERlZmF1bHQoKSwgc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWltYWdlRGF0YSA9IGltYWdlLmdldEltYWdlRGF0YSgpOwotCWFzc2VydEZhbHNlKCI6YjoiLCBTV1QuVFJBTlNQQVJFTkNZX05PTkUgPT0gaW1hZ2VEYXRhLmdldFRyYW5zcGFyZW5jeVR5cGUoKSk7Ci0JCi0Jc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGltYWdlRmlsZW5hbWVzWzBdICsgJy4nICsgaW1hZ2VGb3JtYXRzW2ltYWdlRm9ybWF0cy5sZW5ndGgtMV0pOwotCWltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzdHJlYW0pOwotCXRyeSB7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JaW1hZ2VEYXRhID0gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBTV1QuVFJBTlNQQVJFTkNZX05PTkUsIGltYWdlRGF0YS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgQVBJCi0JLy8gamF2YWRvYyBzdGF0ZXM6Ci0JLy8gPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotCS8vIEFQSSBmb3IgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPi4gSXQgaXMgbWFya2VkIHB1YmxpYyBvbmx5IHNvIHRoYXQgaXQKLQkvLyBjYW4gYmUgc2hhcmVkIHdpdGhpbiB0aGUgcGFja2FnZXMgcHJvdmlkZWQgYnkgU1dULiBJdCBpcyBzdWJqZWN0Ci0JLy8gdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tCi0JLy8gYXBwbGljYXRpb24gY29kZS4KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zY2FsZWRUb0lJKCkgewotCWZpbmFsIGludCBpbWFnZURpbWVuc2lvbiA9IDg7Ci0JUkdCW10gcmdicyA9IG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfTsKLQlieXRlW10gcGl4ZWxEYXRhID0gbmV3IGJ5dGVbKGltYWdlRGltZW5zaW9uKmltYWdlRGltZW5zaW9uKSAvIDhdOwotCQotCXBpeGVsRGF0YVswXSA9IDB4NEY7Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShpbWFnZURpbWVuc2lvbiwgaW1hZ2VEaW1lbnNpb24sIDEsIG5ldyBQYWxldHRlRGF0YShyZ2JzKSwgMSwgcGl4ZWxEYXRhKTsKLQotCUltYWdlRGF0YSBzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oLWltYWdlRGltZW5zaW9uLCAtaW1hZ2VEaW1lbnNpb24pOwotCWJ5dGVbXSBzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbl07Ci0Jc2NhbGVkSW1hZ2VEYXRhLmdldFBpeGVscygwLCBpbWFnZURpbWVuc2lvbiAtIDEsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWJ5dGVbXSBleHBlY3RlZFBpeGVsRGF0YSA9IG5ldyBieXRlW10gezB4MSwgMHgxLCAweDEsIDB4MSwgMCwgMCwgMHgxLCAwfTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIGV4cGVjdGVkUGl4ZWxEYXRhLCBzY2FsZWRQaXhlbERhdGEpOwotCi0Jc2NhbGVkSW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnNjYWxlZFRvKGltYWdlRGltZW5zaW9uICogMTAsIGltYWdlRGltZW5zaW9uKTsKLQlzY2FsZWRQaXhlbERhdGEgPSBuZXcgYnl0ZVtpbWFnZURpbWVuc2lvbiAqIDEwXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDAsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWFzc2VydEVxdWFscygiOmI6IiwgMCwgc2NhbGVkUGl4ZWxEYXRhWzBdKTsKLQlhc3NlcnRFcXVhbHMoIjpjOiIsIDAsIHNjYWxlZFBpeGVsRGF0YVsxXSk7Ci0KLQlzY2FsZWRJbWFnZURhdGEgPSBpbWFnZURhdGEuc2NhbGVkVG8oaW1hZ2VEaW1lbnNpb24sIGltYWdlRGltZW5zaW9uICogMTApOwotCXNjYWxlZFBpeGVsRGF0YSA9IG5ldyBieXRlW2ltYWdlRGltZW5zaW9uXTsKLQlzY2FsZWRJbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDAsIHNjYWxlZFBpeGVsRGF0YS5sZW5ndGgsIHNjYWxlZFBpeGVsRGF0YSwgMCk7CQotCWV4cGVjdGVkUGl4ZWxEYXRhID0gbmV3IGJ5dGVbXSB7MCwgMHgxLCAwLCAwLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWFzc2VydEVxdWFscygiOmQ6IiwgZXhwZWN0ZWRQaXhlbERhdGEsIHNjYWxlZFBpeGVsRGF0YSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxwaGFJSUkoKSB7Ci0JaW50IHZhbHVlOwotCQotCXZhbHVlID0gMHhBQTsKLQlpbWFnZURhdGEuc2V0QWxwaGEoMCwgMCwgdmFsdWUpOwotCWFzc2VydEVxdWFscygiOmE6IiwgdmFsdWUsIGltYWdlRGF0YS5nZXRBbHBoYSgwLCAwKSk7Ci0KLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoLTEsIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGEoSU1BR0VfRElNRU5TSU9OLCAxLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKDAsIC0xLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhKDAsIElNQUdFX0RJTUVOU0lPTiwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFscGhhc0lJSSRCSSgpIHsKLQlieXRlIHZhbHVlOwotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWJ5dGVbXSBhbHBoYURhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQkKLQl2YWx1ZSA9IChieXRlKSAweEFBOwotCWJ5dGVbXSB2YWx1ZXMgPSBuZXcgYnl0ZVtdIHt2YWx1ZSwgKGJ5dGUpICh2YWx1ZSsxKSwgKGJ5dGUpICh2YWx1ZSsyKSwgKGJ5dGUpICh2YWx1ZSszKSwgKGJ5dGUpICh2YWx1ZSs0KX07Ci0JaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBhbHBoYURhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIGFscGhhRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpiOiIsIDAsIGFscGhhRGF0YVtpXSk7Ci0JCX0KLQl9Ci0JCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04qSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIChieXRlW10pIG51bGwsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFscGhhcyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWxwaGFzID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoLTEsIDEsIElNQUdFX0RJTUVOU0lPTiwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRBbHBoYXMoSU1BR0VfRElNRU5TSU9OLCAxLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIC0xLCBJTUFHRV9ESU1FTlNJT04sIGFscGhhRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0QWxwaGFzKDAsIElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCBhbHBoYURhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldEFscGhhcygwLCAxLCAtMSwgYWxwaGFEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwdXRXaWR0aCA8IDAiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQaXhlbElJSSgpIHsKLQlpbnQgdmFsdWU7Ci0JCi0JdmFsdWUgPSAweEFBOwotCWltYWdlRGF0YS5zZXRQaXhlbCgwLCAwLCB2YWx1ZSk7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCB2YWx1ZSwgaW1hZ2VEYXRhLmdldFBpeGVsKDAsIDApKTsKLQotCS8vIGV4Y2VwdGlvbiBjYXNlcwotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbCgtMSwgMSwgdmFsdWUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbChJTUFHRV9ESU1FTlNJT04sIDEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeCBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgLTEsIHZhbHVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWwoMCwgSU1BR0VfRElNRU5TSU9OLCB2YWx1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHkgb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxzSUlJJEJJKCkgewotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWJ5dGVbXSBwaXhlbERhdGEgPSBuZXcgYnl0ZVtTSVpFXTsKLQotCS8vIHRlc3QgMSBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAxLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JYnl0ZVtdIHZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDEsIDB4MSwgMHgxLCAweDF9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6YToiLCAoYnl0ZSkgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6YjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyIGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDIsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgYnl0ZVtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmQ6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCA0LCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGJ5dGVbXXsweDEsIDB4MiwgMHgzLCAweDQsIDB4Rn07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjplOiIsIChieXRlKSB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBieXRlW117MHgxLCAweDIsIDB4MywgMHhGLCAoYnl0ZSkweEZGfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmc6IiwgKGJ5dGUpIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmg6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQkKLQkvLyBleGNlcHRpb24gY2FzZXMKLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTipJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcHV0V2lkdGggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgKGJ5dGVbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMCwgMHhGRjAwLCAweEZGKSk7CQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgZGVwdGgiKTsKLQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGRlcHRoIiwgU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRILCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGl4ZWxzSUlJJElJKCkgewotCWZpbmFsIGludCBTSVpFID0gMjA7IAotCWZpbmFsIGludCBPRkZTRVQgPSAxOwotCWludFtdIHBpeGVsRGF0YSA9IG5ldyBpbnRbU0laRV07Ci0KLQkvLyB0ZXN0IDEgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCWludFtdIHZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MSwgMHgxLCAweDEsIDB4MX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjphOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmI6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMiBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyLCBuZXcgUGFsZXR0ZURhdGEobmV3IFJHQltde25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KSk7Ci0JdmFsdWVzID0gbmV3IGludFtdezB4MSwgMHgyLCAweDMsIDB4MiwgMHgxfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmM6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZDoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCA0IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDQsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX0pKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MHgxLCAweDIsIDB4MywgMHg0LCAweEZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZToiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpmOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDggYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgOCwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSkpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXsweDEsIDB4MiwgMHgzLCAweEYsIDB4RkZ9OwotCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgMSwgdmFsdWVzLmxlbmd0aCAtIE9GRlNFVCwgdmFsdWVzLCBPRkZTRVQpOwotCWltYWdlRGF0YS5nZXRQaXhlbHMoMCwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxEYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICsgT0ZGU0VUIDwgdmFsdWVzLmxlbmd0aCkgewotCQkJYXNzZXJ0RXF1YWxzKCI6ZzoiLCB2YWx1ZXNbaSArIE9GRlNFVF0sIHBpeGVsRGF0YVtpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjpoOiIsIDAsIHBpeGVsRGF0YVtpXSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IDE2IGJpdAotCWltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIDE2LCBuZXcgUGFsZXR0ZURhdGEoMHhGODAwLCAweDdFMCwgMHgxRikpOwotCXZhbHVlcyA9IG5ldyBpbnRbXXswLCAweDIsIDB4RiwgMHhGRiwgMHhGRkFBfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOmk6IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6ajoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gdGVzdCAyNCBiaXQKLQlpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKElNQUdFX0RJTUVOU0lPTiwgSU1BR0VfRElNRU5TSU9OLCAyNCwgbmV3IFBhbGV0dGVEYXRhKDB4RkYwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQX07Ci0JaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCB2YWx1ZXMubGVuZ3RoIC0gT0ZGU0VULCB2YWx1ZXMsIE9GRlNFVCk7Ci0JaW1hZ2VEYXRhLmdldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbERhdGEubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgKyBPRkZTRVQgPCB2YWx1ZXMubGVuZ3RoKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjprOiIsIHZhbHVlc1tpICsgT0ZGU0VUXSwgcGl4ZWxEYXRhW2ldKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygiOmw6IiwgMCwgcGl4ZWxEYXRhW2ldKTsKLQkJfQotCX0KLQotCS8vIHRlc3QgMzIgYml0Ci0JaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShJTUFHRV9ESU1FTlNJT04sIElNQUdFX0RJTUVOU0lPTiwgMzIsIG5ldyBQYWxldHRlRGF0YSgweEZGMDAwMDAwLCAweEZGMDAsIDB4RkYpKTsKLQl2YWx1ZXMgPSBuZXcgaW50W117MCwgMHhGRiwgMHhGRkFBLCAweEZGMDBBQTAwfTsKLQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIHZhbHVlcy5sZW5ndGggLSBPRkZTRVQsIHZhbHVlcywgT0ZGU0VUKTsKLQlpbWFnZURhdGEuZ2V0UGl4ZWxzKDAsIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsRGF0YS5sZW5ndGg7IGkrKykgewotCQlpZiAoaSArIE9GRlNFVCA8IHZhbHVlcy5sZW5ndGgpIHsKLQkJCWFzc2VydEVxdWFscygiOm06IiwgdmFsdWVzW2kgKyBPRkZTRVRdLCBwaXhlbERhdGFbaV0pOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKCI6bjoiLCAwLCBwaXhlbERhdGFbaV0pOwotCQl9Ci0JfQotCi0JLy8gZXhjZXB0aW9uIGNhc2VzCi0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04qSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygwLCAxLCBJTUFHRV9ESU1FTlNJT04sIChpbnRbXSkgbnVsbCwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGl4ZWxzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwaXhlbHMgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscygtMSwgMSwgSU1BR0VfRElNRU5TSU9OLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHggb3V0IG9mIGJvdW5kcyIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci0JdHJ5IHsKLQkJaW1hZ2VEYXRhLnNldFBpeGVscyhJTUFHRV9ESU1FTlNJT04sIDEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB4IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgLTEsIElNQUdFX0RJTUVOU0lPTiwgcGl4ZWxEYXRhLCBPRkZTRVQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciB5IG91dCBvZiBib3VuZHMiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JfQotCXRyeSB7Ci0JCWltYWdlRGF0YS5zZXRQaXhlbHMoMCwgSU1BR0VfRElNRU5TSU9OLCBJTUFHRV9ESU1FTlNJT04sIHBpeGVsRGF0YSwgT0ZGU0VUKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgeSBvdXQgb2YgYm91bmRzIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCX0KLQl0cnkgewotCQlpbWFnZURhdGEuc2V0UGl4ZWxzKDAsIDEsIC0xLCBwaXhlbERhdGEsIE9GRlNFVCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHB1dFdpZHRoIDwgMCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvbmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFscGhhSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFscGhhc0lJSSRCSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGl4ZWxzSUlJJEJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQaXhlbHNJSUkkSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJHQnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zcGFyZW5jeU1hc2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NjYWxlZFRvSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFscGhhSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBbHBoYXNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQaXhlbHNJSUkkQkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFBpeGVsc0lJSSRJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvcklJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQiIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YUkkQigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9pb19JbnB1dFN0cmVhbSIpKSB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfaW9fSW5wdXRTdHJlYW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jbG9uZSIpKSB0ZXN0X2Nsb25lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbHBoYUlJIikpIHRlc3RfZ2V0QWxwaGFJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxwaGFzSUlJJEJJIikpIHRlc3RfZ2V0QWxwaGFzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbElJIikpIHRlc3RfZ2V0UGl4ZWxJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGl4ZWxzSUlJJEJJIikpIHRlc3RfZ2V0UGl4ZWxzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQaXhlbHNJSUkkSUkiKSkgdGVzdF9nZXRQaXhlbHNJSUkkSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJHQnMiKSkgdGVzdF9nZXRSR0JzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUcmFuc3BhcmVuY3lNYXNrIikpIHRlc3RfZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VHJhbnNwYXJlbmN5VHlwZSIpKSB0ZXN0X2dldFRyYW5zcGFyZW5jeVR5cGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld0lJSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGFJJEJJJEIkQklJSUlJSUkiKSkgdGVzdF9pbnRlcm5hbF9uZXdJSUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhSSRCSSRCJEJJSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zY2FsZWRUb0lJIikpIHRlc3Rfc2NhbGVkVG9JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxwaGFJSUkiKSkgdGVzdF9zZXRBbHBoYUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxwaGFzSUlJJEJJIikpIHRlc3Rfc2V0QWxwaGFzSUlJJEJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbElJSSIpKSB0ZXN0X3NldFBpeGVsSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRQaXhlbHNJSUkkQkkiKSkgdGVzdF9zZXRQaXhlbHNJSUkkQkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBpeGVsc0lJSSRJSSIpKSB0ZXN0X3NldFBpeGVsc0lJSSRJSSgpOwotfQotLyogY3VzdG9tICovCi1JbWFnZURhdGEgaW1hZ2VEYXRhOwotZmluYWwgaW50IElNQUdFX0RJTUVOU0lPTiA9IDEwOwotCi12b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgYnl0ZSBleHBlY3RlZFtdLCBieXRlIGFjdHVhbFtdKSB7Ci0JaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCXJldHVybjsKLQlib29sZWFuIGVxdWFsID0gZmFsc2U7Ci0JaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgYWN0dWFsICE9IG51bGwgJiYgZXhwZWN0ZWQubGVuZ3RoID09IGFjdHVhbC5sZW5ndGgpIHsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQllcXVhbCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pIHsKLQkJCQllcXVhbCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCWlmICghZXF1YWwpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZD0gIiI7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpCi0JCQlmb3JtYXR0ZWQ9IG1lc3NhZ2UrIiAiOwotCQlmYWlsKGZvcm1hdHRlZCsiZXhwZWN0ZWQ6PCIrZXhwZWN0ZWQrIj4gYnV0IHdhczo8IithY3R1YWwrIj4iKTsKLQl9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3NDhjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JbmV3IEltYWdlTG9hZGVyKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlJbWFnZUxvYWRlckxpc3RlbmVyIGxvYWRlckxpc3RlbmVyID0gbmV3IEltYWdlTG9hZGVyTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGltYWdlRGF0YUxvYWRlZChJbWFnZUxvYWRlckV2ZW50IGUpIHsKLQkJCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbG9hZGVyLmFkZEltYWdlTG9hZGVyTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEltYWdlTG9hZGVyTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRGYWxzZSgiOmE6IiwgbG9hZGVyLmhhc0xpc3RlbmVycygpKTsKLQlsb2FkZXIuYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lcihsb2FkZXJMaXN0ZW5lcik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgbG9hZGVyLmhhc0xpc3RlbmVycygpKTsKLQotCWxvYWRlckxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JSW5wdXRTdHJlYW0gc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiaW50ZXJsYWNlZF90YXJnZXQucG5nIik7CQotCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JdHJ5IHsKLQkJc3RyZWFtLmNsb3NlKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQlhc3NlcnRUcnVlKCI6YzoiLCBsb2FkZXJMaXN0ZW5lckNhbGxlZCk7Ci0KLQlsb2FkZXJMaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oInRhcmdldC5wbmciKTsJCi0JbG9hZGVyLmxvYWQoc3RyZWFtKTsKLQl0cnkgewotCQlzdHJlYW0uY2xvc2UoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCWFzc2VydEZhbHNlKCI6ZDoiLCBsb2FkZXJMaXN0ZW5lckNhbGxlZCk7Ci0KLQlsb2FkZXJMaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWxvYWRlci5ub3RpZnlMaXN0ZW5lcnMobmV3IEltYWdlTG9hZGVyRXZlbnQobG9hZGVyLCBsb2FkZXIuZGF0YVswXSwgMCwgdHJ1ZSkpOwotCWFzc2VydFRydWUoIjplOiIsIGxvYWRlckxpc3RlbmVyQ2FsbGVkKTsKLQotCWxvYWRlci5yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyKGxvYWRlckxpc3RlbmVyKTsKLQlhc3NlcnRGYWxzZSgiOmY6IiwgbG9hZGVyLmhhc0xpc3RlbmVycygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNMaXN0ZW5lcnMoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZEltYWdlTG9hZGVyTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbG9hZExqYXZhX2lvX0lucHV0U3RyZWFtKCkgewotCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2FkIGlucHV0U3RyZWFtID09IG51bGwiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJc3RyZWFtID0gU3d0VGVzdENhc2UuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZW1wdHkudHh0Iik7Ci0JCXRyeSB7Ci0JCQlsb2FkZXIubG9hZChzdHJlYW0pOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2FkIGZyb20gaW52YWxpZCBpbnB1dFN0cmVhbSIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQl9Ci0JCi0JCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF07Ci0JCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJCVN0cmluZyBmb3JtYXQgPSBTd3RUZXN0Q2FzZS5pbWFnZUZvcm1hdHNbaV07Ci0JCQlzdHJlYW0gPSBTd3RUZXN0Q2FzZS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCWxvYWRlci5sb2FkKHN0cmVhbSk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJfQotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9sb2FkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0JU3RyaW5nIGZpbGVuYW1lID0gbnVsbDsKLQl0cnkgewotCQlsb2FkZXIubG9hZChmaWxlbmFtZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGxvYWQgZmlsZW5hbWUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCS8vIGoyc2UgYW5kIGoybWUoY2RjKSBjYW4gbG9hZCBmcm9tIGEgZmlsZW5hbWUgYnV0LCBqMm1lKGNsZGMpIHRocm93cyBhbiBleGNlcHRpb24KLX0KLQotcHVibGljIHZvaWQgdGVzdF9ub3RpZnlMaXN0ZW5lcnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZEltYWdlTG9hZGVyTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zYXZlTGphdmFfaW9fT3V0cHV0U3RyZWFtSSgpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsKLQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWxvYWRlci5zYXZlKG91dFN0cmVhbSwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzYXZlIG91dHB1dFN0cmVhbSA9PSBudWxsIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkKLQkJb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJbG9hZGVyLnNhdmUob3V0U3RyZWFtLCAtMSk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzYXZlIHRvIGludmFsaWQgb3V0cHV0U3RyZWFtIGZvcm1hdCIpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQl9Ci0JCWJvb2xlYW4ganBnU3VwcG9ydGVkID0gZmFsc2U7Ci0JCWZvciAoaW50IGk9MDsgaTxpbWFnZUZvcm1hdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbWFnZUZvcm1hdHNbaV0uZXF1YWxzKCJqcGciKSkgewotCQkJCWpwZ1N1cHBvcnRlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGpwZ1N1cHBvcnRlZCkgewotCQkJU3RyaW5nIGZpbGVuYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbMF07Ci0JCQkvLyBtdXN0IHVzZSBqcGcgc2luY2Ugc2F2ZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0IGluIHBuZyBmb3JtYXQJCQotCQkJU3RyaW5nIGZpbGV0eXBlID0gImpwZyI7Ci0JCQlpblN0cmVhbSA9IFN3dFRlc3RDYXNlLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZW5hbWUgKyAiLiIgKyBmaWxldHlwZSk7CQotCQkJbG9hZGVyLmxvYWQoaW5TdHJlYW0pOwotCQkJdHJ5IHsKLQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VGb3JtYXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGltYWdlRm9ybWF0c1tpXS5lcXVhbHMoZmlsZXR5cGUpKSB7Ci0JCQkJCS8vIHNhdmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdAotCQkJCQlsb2FkZXIuc2F2ZShvdXRTdHJlYW0sIGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQl0cnkgewotCQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2F2ZUxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQlJbWFnZUxvYWRlciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCXRyeSB7Ci0JCWxvYWRlci5zYXZlKGZpbGVuYW1lLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2F2ZSBmaWxlbmFtZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JLy8gajJzZSBhbmQgajJtZShjZGMpIGNhbiBsb2FkIGZyb20gYSBmaWxlbmFtZSBidXQsIGoybWUoY2xkYykgdGhyb3dzIGFuIGV4Y2VwdGlvbgotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzTGlzdGVuZXJzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9sb2FkTGphdmFfaW9fSW5wdXRTdHJlYW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xvYWRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfbm90aWZ5TGlzdGVuZXJzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zYXZlTGphdmFfaW9fT3V0cHV0U3RyZWFtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2F2ZUxqYXZhX2xhbmdfU3RyaW5nSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyIikpIHRlc3RfYWRkSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzTGlzdGVuZXJzIikpIHRlc3RfaGFzTGlzdGVuZXJzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sb2FkTGphdmFfaW9fSW5wdXRTdHJlYW0iKSkgdGVzdF9sb2FkTGphdmFfaW9fSW5wdXRTdHJlYW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2xvYWRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2xvYWRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfbm90aWZ5TGlzdGVuZXJzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IikpIHRlc3Rfbm90aWZ5TGlzdGVuZXJzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJbWFnZUxvYWRlckxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlSW1hZ2VMb2FkZXJMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2F2ZUxqYXZhX2lvX091dHB1dFN0cmVhbUkiKSkgdGVzdF9zYXZlTGphdmFfaW9fT3V0cHV0U3RyZWFtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2F2ZUxqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X3NhdmVMamF2YV9sYW5nX1N0cmluZ0koKTsKLX0KLS8qIGN1c3RvbSAqLwotYm9vbGVhbiBsb2FkZXJMaXN0ZW5lckNhbGxlZDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOTg4NGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXJFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VEYXRhSVooKSB7Ci0JdHJ5IHsKLQkJbmV3IEltYWdlTG9hZGVyRXZlbnQobnVsbCwgbnVsbCwgMCwgdHJ1ZSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEltYWdlTG9hZGVyIHNvdXJjZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbmV3IEltYWdlTG9hZGVyRXZlbnQobmV3IEltYWdlTG9hZGVyKCksIG51bGwsIDAsIHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCUltYWdlTG9hZGVyRXZlbnQgZXZlbnQgPSBuZXcgSW1hZ2VMb2FkZXJFdmVudChuZXcgSW1hZ2VMb2FkZXIoKSwgbnVsbCwgMCwgdHJ1ZSk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudC50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGV2ZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlRGF0YUlaIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZURhdGFJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNjVmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZUxvYWRlckxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckxpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ltYWdlRGF0YUxvYWRlZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2VMb2FkZXJFdmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbWFnZURhdGFMb2FkZWRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlTG9hZGVyRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50IikpIHRlc3RfaW1hZ2VEYXRhTG9hZGVkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZUxvYWRlckV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmRkNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19QYWxldHRlRGF0YSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BhbGV0dGVEYXRhKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCXRyeSB7Ci0JCW5ldyBQYWxldHRlRGF0YShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge30pOwotCWFzc2VydEZhbHNlKCI6YToiLCBkYXRhLmlzRGlyZWN0KTsKLQotCW5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge251bGwsIG51bGx9KTsKLQlhc3NlcnRGYWxzZSgiOmI6IiwgZGF0YS5pc0RpcmVjdCk7Ci0KLQluZXcgUGFsZXR0ZURhdGEobmV3IFJHQltdIHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpfSk7Ci0JYXNzZXJ0RmFsc2UoIjpjOiIsIGRhdGEuaXNEaXJlY3QpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUlJKCkgewotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEoMCwgMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGF0YS5pc0RpcmVjdCk7Ci0KLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKC0xLCAtMSwgLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIGRhdGEuaXNEaXJlY3QpOwotCi0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBkYXRhLmlzRGlyZWN0KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQaXhlbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCkgewotCS8vIGluZGV4ZWQgcGFsZXR0ZSB0ZXN0cwkKLQlSR0JbXSByZ2JzID0ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSksIG5ldyBSR0IoNTAsIDEwMCwgMTUwKX07Ci0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YShyZ2JzKTsKLQkKLQl0cnkgewotCQlkYXRhLmdldFBpeGVsKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleGVkIHBhbGV0dGUgd2l0aCByZ2IgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJZGF0YS5nZXRQaXhlbChuZXcgUkdCKDAsIDAsIDEpKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmdiIG5vdCBmb3VuZCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIHJnYnMubGVuZ3RoLTEsIGRhdGEuZ2V0UGl4ZWwocmdic1tyZ2JzLmxlbmd0aC0xXSkpOwotCQotCS8vIGRpcmVjdCBwYWxldHRlIHRlc3RzCQotCVJHQiByZ2IgPW5ldyBSR0IoMHgzMiwgMHg2NCwgMHg5Nik7Ci0JZGF0YSA9IG5ldyBQYWxldHRlRGF0YSgweGZmMDAwMCwgMHgwMGZmMDAsIDB4MDAwMGZmKTsKLQkKLQl0cnkgewotCQlkYXRhLmdldFBpeGVsKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXJlY3QgcGFsZXR0ZSB3aXRoIHJnYiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiOmI6IiwgMHgzMjY0OTYsIGRhdGEuZ2V0UGl4ZWwocmdiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCSSgpIHsKLQkvLyBpbmRleGVkIHBhbGV0dGUgdGVzdHMJCi0JUkdCW10gcmdicyA9IHtuZXcgUkdCKDAsIDAsIDApLCBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpLCBuZXcgUkdCKDUwLCAxMDAsIDE1MCl9OwotCVBhbGV0dGVEYXRhIGRhdGEgPSBuZXcgUGFsZXR0ZURhdGEocmdicyk7Ci0KLQl0cnkgewotCQlkYXRhLmdldFJHQihyZ2JzLmxlbmd0aCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG5vbmV4aXN0ZW50IHBpeGVsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiOmE6Iiwgcmdic1tyZ2JzLmxlbmd0aC0xXSwgZGF0YS5nZXRSR0Iocmdicy5sZW5ndGgtMSkpOwotCi0JLy8gZGlyZWN0IHBhbGV0dGUgdGVzdHMJCi0JUkdCIHJnYiA9bmV3IFJHQigweDMyLCAweDY0LCAweDk2KTsKLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYpOwotCQotCWFzc2VydEVxdWFscygiOmI6IiwgcmdiLCBkYXRhLmdldFJHQigweDMyNjQ5NikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQnMoKSB7Ci0JLy8gaW5kZXhlZCBwYWxldHRlIHRlc3RzCQotCVJHQltdIHJnYnMgPSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KX07Ci0JUGFsZXR0ZURhdGEgZGF0YSA9IG5ldyBQYWxldHRlRGF0YShyZ2JzKTsKLQkKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHJnYnMsIGRhdGEuZ2V0UkdCcygpKTsKLQkKLQkvLyBkaXJlY3QgcGFsZXR0ZSB0ZXN0cwkKLQlkYXRhID0gbmV3IFBhbGV0dGVEYXRhKDB4ZmYwMDAwLCAweDAwZmYwMCwgMHgwMDAwZmYpOwotCQotCWFzc2VydE51bGwoIjpiOiIsIGRhdGEuZ2V0UkdCcygpKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUGFsZXR0ZURhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQaXhlbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSR0JzIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIikpIHRlc3RfQ29uc3RydWN0b3IkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBpeGVsTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9nZXRQaXhlbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0JJIikpIHRlc3RfZ2V0UkdCSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCcyIpKSB0ZXN0X2dldFJHQnMoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhMjBjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUkoKSB7Ci0JLy8gVGVzdCBuZXcgUG9pbnQgKGludCB4LCBpbnQgeSkKLQlQb2ludCBwID0gbmV3IFBvaW50KDMsIDQpOwotCWFzc2VydEVxdWFscygzLCBwLngpOwotCWFzc2VydEVxdWFscyg0LCBwLnkpOwotCi0JcCA9IG5ldyBQb2ludCgtNCwgLTMpOwotCWFzc2VydEVxdWFscygtNCwgcC54KTsKLQlhc3NlcnRFcXVhbHMoLTMsIHAueSk7Ci0KLQlwID0gbmV3IFBvaW50KDUwMDAwMCwgNzAwMDAwKTsKLQlhc3NlcnRFcXVhbHMoNTAwMDAwLCBwLngpOwotCWFzc2VydEVxdWFscyg3MDAwMDAsIHAueSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JUG9pbnQgcDEgPSBuZXcgUG9pbnQoNSwgNSk7Ci0JUG9pbnQgcDIgPSBuZXcgUG9pbnQoNSwgNSk7Ci0JYXNzZXJ0VHJ1ZSgiUG9pbnRzIHNob3VsZCBiZSBlcXVhbCIsIHAxLmVxdWFscyhwMikpOwotCi0JcDEgPSBuZXcgUG9pbnQoLTUsIC01KTsKLQlwMiA9IG5ldyBQb2ludCgtNSwgLTUpOwotCWFzc2VydFRydWUoIlBvaW50cyBzaG91bGQgYmUgZXF1YWwiLCBwMS5lcXVhbHMocDIpKTsKLQotCXAyID0gbmV3IFBvaW50KDMsIDQpOwotCWFzc2VydFRydWUoIlBvaW50cyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXAxLmVxdWFscyhwMikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCVBvaW50IHAxID0gbmV3IFBvaW50KDUsIDUpOwotCVBvaW50IHAyID0gbmV3IFBvaW50KDUsIDUpOwotCWFzc2VydFRydWUoIlBvaW50cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZSIsIHAxLmhhc2hDb2RlKCkgPT0gcDIuaGFzaENvZGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUG9pbnQgcCA9IG5ldyBQb2ludCgzLCA0KTsKLQlhc3NlcnROb3ROdWxsKHAudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShwLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLQlhc3NlcnRFcXVhbHMoIlBvaW50IHszLCA0fSIsIHAudG9TdHJpbmcoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWE5OTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUkoKSB7Ci0JLy8gVGVzdCBSR0IoaW50IHJlZCwgaW50IGdyZWVuLCBpbnQgYmx1ZSkKLQluZXcgUkdCKDIwLDEwMCwyMDApOwotCQotCW5ldyBSR0IoMCwwLDApOwotCi0JCi0KLQl0cnkgewotCQluZXcgUkdCKC0xLCAyMCwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWQgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDI1NiwgMjAsIDUwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVkID4gMjU1Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwLCAtMSwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBncmVlbiA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoMjAsIDI1NiwgNTApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBncmVlbiA+IDI1NSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgUkdCKDIwLCA1MCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBibHVlIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigyMCwgNTAsIDI1Nik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJsdWUgPiAyNTUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQkJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JGRkYoKSB7Ci0KLQluZXcgUkdCKDBmLDBmLDBmKTsKLQkKLQluZXcgUkdCKDBmLDFmLDBmKTsKLQluZXcgUkdCKDBmLDBmLDFmKTsKLQluZXcgUkdCKDBmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxZiwwZiwxZik7Ci0JbmV3IFJHQigxZiwxZiwxZik7Ci0JbmV3IFJHQigxZiwwZiwxZik7Ci0JbmV3IFJHQigxZiwxZiwwZik7Ci0JbmV3IFJHQigxZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoNTlmLDBmLDFmKTsKLQluZXcgUkdCKDU5ZiwxZiwxZik7Ci0JbmV3IFJHQig1OWYsMGYsMWYpOwotCW5ldyBSR0IoNTlmLDFmLDBmKTsKLQluZXcgUkdCKDU5ZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoNjBmLDBmLDFmKTsKLQluZXcgUkdCKDYwZiwxZiwxZik7Ci0JbmV3IFJHQig2MGYsMGYsMWYpOwotCW5ldyBSR0IoNjBmLDFmLDBmKTsKLQluZXcgUkdCKDYwZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoNjFmLDBmLDFmKTsKLQluZXcgUkdCKDYxZiwxZiwxZik7Ci0JbmV3IFJHQig2MWYsMGYsMWYpOwotCW5ldyBSR0IoNjFmLDFmLDBmKTsKLQluZXcgUkdCKDYxZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMTE5ZiwwZiwxZik7Ci0JbmV3IFJHQigxMTlmLDFmLDFmKTsKLQluZXcgUkdCKDExOWYsMGYsMWYpOwotCW5ldyBSR0IoMTE5ZiwxZiwwZik7Ci0JbmV3IFJHQigxMTlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxMjBmLDBmLDFmKTsKLQluZXcgUkdCKDEyMGYsMWYsMWYpOwotCW5ldyBSR0IoMTIwZiwwZiwxZik7Ci0JbmV3IFJHQigxMjBmLDFmLDBmKTsKLQluZXcgUkdCKDEyMGYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDEyMWYsMGYsMWYpOwotCW5ldyBSR0IoMTIxZiwxZiwxZik7Ci0JbmV3IFJHQigxMjFmLDBmLDFmKTsKLQluZXcgUkdCKDEyMWYsMWYsMGYpOwotCW5ldyBSR0IoMTIxZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMTc5ZiwwZiwxZik7Ci0JbmV3IFJHQigxNzlmLDFmLDFmKTsKLQluZXcgUkdCKDE3OWYsMGYsMWYpOwotCW5ldyBSR0IoMTc5ZiwxZiwwZik7Ci0JbmV3IFJHQigxNzlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigxODBmLDBmLDFmKTsKLQluZXcgUkdCKDE4MGYsMWYsMWYpOwotCW5ldyBSR0IoMTgwZiwwZiwxZik7Ci0JbmV3IFJHQigxODBmLDFmLDBmKTsKLQluZXcgUkdCKDE4MGYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDE4MWYsMGYsMWYpOwotCW5ldyBSR0IoMTgxZiwxZiwxZik7Ci0JbmV3IFJHQigxODFmLDBmLDFmKTsKLQluZXcgUkdCKDE4MWYsMWYsMGYpOwotCW5ldyBSR0IoMTgxZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMjM5ZiwwZiwxZik7Ci0JbmV3IFJHQigyMzlmLDFmLDFmKTsKLQluZXcgUkdCKDIzOWYsMGYsMWYpOwotCW5ldyBSR0IoMjM5ZiwxZiwwZik7Ci0JbmV3IFJHQigyMzlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigyNDBmLDBmLDFmKTsKLQluZXcgUkdCKDI0MGYsMWYsMWYpOwotCW5ldyBSR0IoMjQwZiwwZiwxZik7Ci0JbmV3IFJHQigyNDBmLDFmLDBmKTsKLQluZXcgUkdCKDI0MGYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDI0MWYsMGYsMWYpOwotCW5ldyBSR0IoMjQxZiwxZiwxZik7Ci0JbmV3IFJHQigyNDFmLDBmLDFmKTsKLQluZXcgUkdCKDI0MWYsMWYsMGYpOwotCW5ldyBSR0IoMjQxZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMjk5ZiwwZiwxZik7Ci0JbmV3IFJHQigyOTlmLDFmLDFmKTsKLQluZXcgUkdCKDI5OWYsMGYsMWYpOwotCW5ldyBSR0IoMjk5ZiwxZiwwZik7Ci0JbmV3IFJHQigyOTlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigzMDBmLDBmLDFmKTsKLQluZXcgUkdCKDMwMGYsMWYsMWYpOwotCW5ldyBSR0IoMzAwZiwwZiwxZik7Ci0JbmV3IFJHQigzMDBmLDFmLDBmKTsKLQluZXcgUkdCKDMwMGYsMC42ZiwwLjRmKTsKLQluZXcgUkdCKDMwMWYsMGYsMWYpOwotCW5ldyBSR0IoMzAxZiwxZiwxZik7Ci0JbmV3IFJHQigzMDFmLDBmLDFmKTsKLQluZXcgUkdCKDMwMWYsMWYsMGYpOwotCW5ldyBSR0IoMzAxZiwwLjZmLDAuNGYpOwotCW5ldyBSR0IoMzU5ZiwwZiwxZik7Ci0JbmV3IFJHQigzNTlmLDFmLDFmKTsKLQluZXcgUkdCKDM1OWYsMGYsMWYpOwotCW5ldyBSR0IoMzU5ZiwxZiwwZik7Ci0JbmV3IFJHQigzNTlmLDAuNmYsMC40Zik7Ci0JbmV3IFJHQigzNjBmLDBmLDFmKTsKLQluZXcgUkdCKDM2MGYsMWYsMWYpOwotCW5ldyBSR0IoMzYwZiwwZiwxZik7Ci0JbmV3IFJHQigzNjBmLDFmLDBmKTsKLQluZXcgUkdCKDM2MGYsMC42ZiwwLjRmKTsKLQkKLQl0cnkgewotCQluZXcgUkdCKDQwMGYsIDAuNWYsIDAuNWYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBodWUgPiAzNjAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCW5ldyBSR0IoLTVmLCAwLjVmLCAwLjVmKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaHVlIDwgMCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigyMDBmLCAtMC41ZiwgMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNhdHVyYXRpb24gPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwMGYsIDMwMGYsIDAuNWYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzYXR1cmF0aW9uID4gMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJbmV3IFJHQigyMDBmLCAwLjVmLCAtMC41Zik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGJyaWdodG5lc3MgPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQluZXcgUkdCKDIwMGYsIDAuNWYsIDQwMGYpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBicmlnaHRuZXNzID4gMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JaW50IHIgPSAwLCBnID0gMTI3LCBiID0gMjU0OwotCVJHQiByZ2IxID0gbmV3IFJHQihyLCBnLCBiKTsKLQlSR0IgcmdiMjsKLQkKLQlyZ2IyID0gcmdiMTsKLQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCWZhaWwoIlR3byByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIFJHQiBpbnN0YW5jZSBub3QgZm91bmQgZXF1YWwiKTsKLQl9Ci0JCi0JcmdiMiA9IG5ldyBSR0IociwgZywgYik7Ci0JaWYgKCFyZ2IxLmVxdWFscyhyZ2IyKSkgewotCQlmYWlsKCJSZWZlcmVuY2VzIHRvIHR3byBkaWZmZXJlbnQgUkdCIGluc3RhbmNlcyB3aXRoIHNhbWUgUiBHIEIgcGFyYW1ldGVycyBub3QgZm91bmQgZXF1YWwiKTsKLQl9Ci0JCi0JaWYgKHJnYjEuZXF1YWxzKG5ldyBSR0IocisxLCBnLCBiKSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihyLCBnKzEsIGIpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKHIsIGcsIGIrMSkpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IocisxLCBnKzEsIGIrMSkpKSB7Ci0JCWZhaWwoIkNvbXBhcmluZyB0d28gUkdCIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbiBvZiBSIEcgQiBwYXJhbWV0ZXJzIGZvdW5kIGVxdWFsIik7ICAgIAkKLQl9Ci0KLQlmbG9hdCBodWUgPSAyMjBmLCBzYXQgPSAwLjZmLCBicmlnaHQgPSAwLjdmOwotCXJnYjEgPSBuZXcgUkdCKGh1ZSwgc2F0LCBicmlnaHQpOwotCXJnYjIgPSByZ2IxOwotCWlmICghcmdiMS5lcXVhbHMocmdiMikpIHsKLQkJZmFpbCgiVHdvIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgUkdCIGluc3RhbmNlIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlyZ2IyID0gbmV3IFJHQihodWUsIHNhdCwgYnJpZ2h0KTsKLQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCWZhaWwoIlJlZmVyZW5jZXMgdG8gdHdvIGRpZmZlcmVudCBSR0IgaW5zdGFuY2VzIHdpdGggc2FtZSBIIFMgQiBwYXJhbWV0ZXJzIG5vdCBmb3VuZCBlcXVhbCIpOwotCX0KLQkKLQlpZiAocmdiMS5lcXVhbHMobmV3IFJHQihodWUrMSwgc2F0LCBicmlnaHQpKSB8fAotCSAgICByZ2IxLmVxdWFscyhuZXcgUkdCKGh1ZSwgc2F0KzAuMWYsIGJyaWdodCkpIHx8Ci0JICAgIHJnYjEuZXF1YWxzKG5ldyBSR0IoaHVlLCBzYXQsIGJyaWdodCswLjFmKSkgfHwKLQkgICAgcmdiMS5lcXVhbHMobmV3IFJHQihodWUrMSwgc2F0KzAuMWYsIGJyaWdodCswLjFmKSkpIHsKLQkJZmFpbCgiQ29tcGFyaW5nIHR3byBSR0IgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9uIG9mIEggUyBCIHBhcmFtZXRlcnMgZm91bmQgZXF1YWwiKTsgICAgCQotCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SFNCKCkgewotCWZsb2F0W10gaHNiID0gbmV3IGZsb2F0W10gewotCQkJCTBmLDBmLDBmLAotCQkJCTBmLDFmLDFmLAotCQkJCTBmLDFmLDBmLAotCQkJCTBmLDBmLDFmLAotCQkJCTBmLDAuNmYsMC40ZiwKLQkJCQkxZiwwZiwxZiwKLQkJCQkxZiwxZiwxZiwKLQkJCQkxZiwwZiwxZiwKLQkJCQkxZiwxZiwwZiwKLQkJCQkxZiwwLjZmLDAuNGYsCi0JCQkJNTlmLDBmLDFmLAotCQkJCTU5ZiwxZiwxZiwKLQkJCQk1OWYsMGYsMWYsCi0JCQkJNTlmLDFmLDBmLAotCQkJCTU5ZiwwLjZmLDAuNGYsCi0JCQkJNjBmLDBmLDFmLAotCQkJCTYwZiwxZiwxZiwKLQkJCQk2MGYsMGYsMWYsCi0JCQkJNjBmLDFmLDBmLAotCQkJCTYwZiwwLjZmLDAuNGYsCi0JCQkJNjFmLDBmLDFmLAotCQkJCTYxZiwxZiwxZiwKLQkJCQk2MWYsMGYsMWYsCi0JCQkJNjFmLDFmLDBmLAotCQkJCTYxZiwwLjZmLDAuNGYsCi0JCQkJMTE5ZiwwZiwxZiwKLQkJCQkxMTlmLDFmLDFmLAotCQkJCTExOWYsMGYsMWYsCi0JCQkJMTE5ZiwxZiwwZiwKLQkJCQkxMTlmLDAuNmYsMC40ZiwKLQkJCQkxMjBmLDBmLDFmLAotCQkJCTEyMGYsMWYsMWYsCi0JCQkJMTIwZiwwZiwxZiwKLQkJCQkxMjBmLDFmLDBmLAotCQkJCTEyMGYsMC42ZiwwLjRmLAotCQkJCTEyMWYsMGYsMWYsCi0JCQkJMTIxZiwxZiwxZiwKLQkJCQkxMjFmLDBmLDFmLAotCQkJCTEyMWYsMWYsMGYsCi0JCQkJMTIxZiwwLjZmLDAuNGYsCi0JCQkJMTc5ZiwwZiwxZiwKLQkJCQkxNzlmLDFmLDFmLAotCQkJCTE3OWYsMGYsMWYsCi0JCQkJMTc5ZiwxZiwwZiwKLQkJCQkxNzlmLDAuNmYsMC40ZiwKLQkJCQkxODBmLDBmLDFmLAotCQkJCTE4MGYsMWYsMWYsCi0JCQkJMTgwZiwwZiwxZiwKLQkJCQkxODBmLDFmLDBmLAotCQkJCTE4MGYsMC42ZiwwLjRmLAotCQkJCTE4MWYsMGYsMWYsCi0JCQkJMTgxZiwxZiwxZiwKLQkJCQkxODFmLDBmLDFmLAotCQkJCTE4MWYsMWYsMGYsCi0JCQkJMTgxZiwwLjZmLDAuNGYsCi0JCQkJMjM5ZiwwZiwxZiwKLQkJCQkyMzlmLDFmLDFmLAotCQkJCTIzOWYsMGYsMWYsCi0JCQkJMjM5ZiwxZiwwZiwKLQkJCQkyMzlmLDAuNmYsMC40ZiwKLQkJCQkyNDBmLDBmLDFmLAotCQkJCTI0MGYsMWYsMWYsCi0JCQkJMjQwZiwwZiwxZiwKLQkJCQkyNDBmLDFmLDBmLAotCQkJCTI0MGYsMC42ZiwwLjRmLAotCQkJCTI0MWYsMGYsMWYsCi0JCQkJMjQxZiwxZiwxZiwKLQkJCQkyNDFmLDBmLDFmLAotCQkJCTI0MWYsMWYsMGYsCi0JCQkJMjQxZiwwLjZmLDAuNGYsCi0JCQkJMjk5ZiwwZiwxZiwKLQkJCQkyOTlmLDFmLDFmLAotCQkJCTI5OWYsMGYsMWYsCi0JCQkJMjk5ZiwxZiwwZiwKLQkJCQkyOTlmLDAuNmYsMC40ZiwKLQkJCQkzMDBmLDBmLDFmLAotCQkJCTMwMGYsMWYsMWYsCi0JCQkJMzAwZiwwZiwxZiwKLQkJCQkzMDBmLDFmLDBmLAotCQkJCTMwMGYsMC42ZiwwLjRmLAotCQkJCTMwMWYsMGYsMWYsCi0JCQkJMzAxZiwxZiwxZiwKLQkJCQkzMDFmLDBmLDFmLAotCQkJCTMwMWYsMWYsMGYsCi0JCQkJMzAxZiwwLjZmLDAuNGYsCi0JCQkJMzU5ZiwwZiwxZiwKLQkJCQkzNTlmLDFmLDFmLAotCQkJCTM1OWYsMGYsMWYsCi0JCQkJMzU5ZiwxZiwwZiwKLQkJCQkzNTlmLDAuNmYsMC40ZiwKLQkJCQkzNjBmLDBmLDFmLAotCQkJCTM2MGYsMWYsMWYsCi0JCQkJMzYwZiwwZiwxZiwKLQkJCQkzNjBmLDFmLDBmLAotCQkJCTM2MGYsMC42ZiwwLjRmLAotCQkJCTIyMGYsMC42ZiwwLjdmfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGhzYi5sZW5ndGg7IGkrPTMpIHsKLQkJUkdCIHJnYjEgPSBuZXcgUkdCKGhzYltpXSwgaHNiW2krMV0sIGhzYltpKzJdKTsKLQkJZmxvYXRbXSBoc2IyID0gcmdiMS5nZXRIU0IoKTsKLQkJUkdCIHJnYjIgPSBuZXcgUkdCKGhzYjJbMF0sIGhzYjJbMV0sIGhzYjJbMl0pOwotCQlpZiAoIXJnYjEuZXF1YWxzKHJnYjIpKSB7Ci0JCQlmYWlsKCJUd28gcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBSR0IgdXNpbmcgZ2V0SFNCKCkgZnVuY3Rpb24gbm90IGZvdW5kIGVxdWFsIik7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCWludCByID0gMjU1LCBnID0gMTAwLCBiID0gMDsKLQlSR0IgcmdiMSA9IG5ldyBSR0IociwgZywgYik7Ci0JUkdCIHJnYjIgPSBuZXcgUkdCKHIsIGcsIGIpOwotCQotCWludCBoYXNoMSA9IHJnYjEuaGFzaENvZGUoKTsKLQlpbnQgaGFzaDIgPSByZ2IyLmhhc2hDb2RlKCk7Ci0JCi0JaWYgKGhhc2gxICE9IGhhc2gyKSB7Ci0JCWZhaWwoIlR3byBSR0IgaW5zdGFuY2VzIHdpdGggc2FtZSBSIEcgQiBwYXJhbWV0ZXJzIHJldHVybmVkIGRpZmZlcmVudCBoYXNoIGNvZGVzIik7Ci0JfQotCQotCWlmIChyZ2IxLmhhc2hDb2RlKCkgPT0gbmV3IFJHQihnLCBiLCByKS5oYXNoQ29kZSgpIHx8Ci0JCXJnYjEuaGFzaENvZGUoKSA9PSBuZXcgUkdCKGIsIHIsIGcpLmhhc2hDb2RlKCkpIHsKLQkJZmFpbCgiVHdvIFJHQiBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgUiBHIEIgcGFyYW1ldGVycyByZXR1cm5lZCB0aGUgc2FtZSBoYXNoIGNvZGUiKTsKLQl9Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVJHQiByZ2IgPSBuZXcgUkdCKDAsIDEwMCwgMjAwKTsKLQotCVN0cmluZyBzID0gcmdiLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgiUkdCLnRvU3RyaW5nIHJldHVybnMgYSBudWxsIG9yIGVtcHR5IFN0cmluZyIpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JGRkYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIU0IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2hhc2hDb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvcklJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckZGRiIpKSB0ZXN0X0NvbnN0cnVjdG9yRkZGKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIU0IiKSkgdGVzdF9nZXRIU0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE0ZWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklJSUkoKSB7Ci0JLy8gVGVzdCBuZXcgUmVjdGFuZ2xlIChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUoMywgNCwgNSwgNik7Ci0JYXNzZXJ0RXF1YWxzKDMsIHIueCk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKDUsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscyg2LCByLmhlaWdodCk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgtNCwgLTMsIC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKC00LCByLngpOwotCWFzc2VydEVxdWFscygtMywgci55KTsKLQlhc3NlcnRFcXVhbHMoLTIsIHIud2lkdGgpOwotCWFzc2VydEVxdWFscygtMSwgci5oZWlnaHQpOwotCi0JciA9IG5ldyBSZWN0YW5nbGUoNTAwMDAwLCA3MDAwMDAsIDIwMDAwMCwgMTAwMDAwKTsKLQlhc3NlcnRFcXVhbHMoNTAwMDAwLCByLngpOwotCWFzc2VydEVxdWFscyg3MDAwMDAsIHIueSk7Ci0JYXNzZXJ0RXF1YWxzKDIwMDAwMCwgci53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKDEwMDAwMCwgci5oZWlnaHQpOwotfQotCi0vKioKLSAqIERlc3RydWN0aXZlbHkgcmVwbGFjZXMgdGhlIHgsIHksIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzCi0gKiBpbiB0aGUgcmVjZWl2ZXIgd2l0aCBvbmVzIHdoaWNoIHJlcHJlc2VudCB0aGUgdW5pb24gb2YgdGhlCi0gKiByZWN0YW5nbGVzIHNwZWNpZmllZCBieSB0aGUgcmVjZWl2ZXIgYW5kIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAyLCAyKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMSk7Ci0KLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDQsIDQpLCByMSk7Ci0JCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlyMS5hZGQocjIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGFkZCBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMSk7Ci0KLQlyMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JcjIgPSBuZXcgUmVjdGFuZ2xlKDYsIDYsIDAsIDApOwotCXIxLmFkZChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgYWRkIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNSwgNCksIHIxKTsKLQotCXRyeSB7Ci0JCXIxLmFkZChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLS8qKgotICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcG9pbnQgc3BlY2lmaWVkIGJ5IHRoZQotICogYXJndW1lbnRzIGlzIGluc2lkZSB0aGUgYXJlYSBzcGVjaWZpZWQgYnkgdGhlIHJlY2VpdmVyLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zSUkoKSB7Ci0JUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMSwgMikiLCByLmNvbnRhaW5zKDEsIDIpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNCkiLCByLmNvbnRhaW5zKDMsIDQpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNSkiLCByLmNvbnRhaW5zKDMsIDUpKTsKLQotLy8JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIHBvaW50ICgzLCA2KSIsIHIuY29udGFpbnMoMywgNikpOwotLy8KLS8vCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoNCwgNSkiLCByLmNvbnRhaW5zKDQsIDUpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDYpIiwgci5jb250YWlucyg0LCA2KSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICg5LCAxMCkiLCAhci5jb250YWlucyg5LCAxMCkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBwb2ludCAoLTEsIC0xKSIsICFyLmNvbnRhaW5zKC0xLCAtMSkpOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBvaW50IGlzIGluc2lkZSB0aGUKLSAqIGFyZWEgc3BlY2lmaWVkIGJ5IHRoZSByZWNlaXZlci4KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoMSwgMikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgxLCAyKSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBjb250YWluIFBvaW50KDMsIDQpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNCkpKTsKLQotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBzaG91bGQgY29udGFpbiBwb2ludCAoMywgNSkiLCByLmNvbnRhaW5zKG5ldyBQb2ludCgzLCA1KSkpOwotCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDMsIDYpIiwgci5jb250YWlucyhuZXcgUG9pbnQoMywgNikpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gcG9pbnQgKDQsIDUpIiwgci5jb250YWlucyhuZXcgUG9pbnQoNCwgNSkpKTsKLS8vCi0vLwlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIGNvbnRhaW4gUG9pbnQoNCwgNikiLCByLmNvbnRhaW5zKG5ldyBQb2ludCg0LCA2KSkpOwotCi0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlIHNob3VsZCBub3QgY29udGFpbiBQb2ludCg5LCAxMCkiLCAhci5jb250YWlucyhuZXcgUG9pbnQoOSwgMTApKSk7Ci0KLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgc2hvdWxkIG5vdCBjb250YWluIHBvaW50ICgtMSwgLTEpIiwgIXIuY29udGFpbnMobmV3IFBvaW50KC0xLCAtMSkpKTsKLQotCXRyeSB7Ci0JCXIuY29udGFpbnMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSg1LCA0LCAzLCAyKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBiZSBlcXVhbCIsIHIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDQsIDUsIDYpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA0LCA1KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGVzIHNob3VsZCBub3QgYmUgZXF1YWwiLCAhcjEuZXF1YWxzKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMiwgMyk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgbm90IGJlIGVxdWFsIiwgIXIxLmVxdWFscyhyMikpOwotCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDQsIDUsIDMsIDIpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZXMgc2hvdWxkIG5vdCBiZSBlcXVhbCIsICFyMS5lcXVhbHMocjIpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNoQ29kZSgpIHsKLQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDUsIDQsIDMsIDIpOwotCVJlY3RhbmdsZSByMiA9IG5ldyBSZWN0YW5nbGUoNSwgNCwgMywgMik7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZSIsIHIxLmhhc2hDb2RlKCkgPT0gcjIuaGFzaENvZGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCQotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMywgMywgMSwgMiksIHIxKTsKLQotCXIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JcjEuaW50ZXJzZWN0KHIyKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3QgaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSwgcjEpOwotCi0JcjEgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpOwotCXIxLmludGVyc2VjdChyMik7Ci0JYXNzZXJ0RXF1YWxzKCJSZWN0YW5nbGUgaW50ZXJzZWN0IGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHIxKTsKLQotCXRyeSB7Ci0JCXIxLmludGVyc2VjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIGludGVyc2VjdGlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDMsIDMsIDEsIDIpLCByMS5pbnRlcnNlY3Rpb24ocjIpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gaW5jb3JyZWN0IiwgbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgcjEuaW50ZXJzZWN0aW9uKHIyKSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3Rpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdHNJSUlJKCkgewotCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCk7Ci0JUmVjdGFuZ2xlIHIyID0gbmV3IFJlY3RhbmdsZSgyLCAzLCA3LCA4KTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMiwgMywgNywgOCkiLCByMS5pbnRlcnNlY3RzKDIsIDMsIDcsIDgpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMiwgMywgNywgOCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQotCXIyID0gbmV3IFJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKSIsICFyMS5pbnRlcnNlY3RzKDIwMCwgMzAwLCA0MDAsIDUwMCkpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKDEsIDIsIDMsIDQpKTsKLQkKLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgMCwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIDAsIDApIiwgcjEuaW50ZXJzZWN0cygzLCAzLCAwLCAwKSk7Ci0JYXNzZXJ0VHJ1ZSgiUmVjdGFuZ2xlKDMsIDMsIDAsIDApIHNob3VsZCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpIiwgcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkiLCAhcjEuaW50ZXJzZWN0cygzLCAzLCAtMSwgLTEpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgLTEsIC0xKSBzaG91bGQgbm90IGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCAhcjIuaW50ZXJzZWN0cygxLCAyLCAzLCA0KSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3RzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDIsIDMsIDcsIDgpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgyLCAzLCA3LCA4KSIsIHIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMiwgMywgNywgOCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMjAwLCAzMDAsIDQwMCwgNTAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDIwMCwgMzAwLCA0MDAsIDUwMCkiLCAhcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgyMDAsIDMwMCwgNDAwLCA1MDApIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKHIxKSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgxLCAyLCAzLCA0KSBzaG91bGQgaW50ZXJzZWN0IFJlY3RhbmdsZSgzLCAzLCAwLCAwKSIsIHIxLmludGVyc2VjdHMocjIpKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMywgMywgMCwgMCkgc2hvdWxkIGludGVyc2VjdCBSZWN0YW5nbGUoMSwgMiwgMywgNCkiLCByMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUoMSwgMiwgMywgNCkgc2hvdWxkIG5vdCBpbnRlcnNlY3QgUmVjdGFuZ2xlKDMsIDMsIC0xLCAtMSkiLCAhcjEuaW50ZXJzZWN0cyhyMikpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSgzLCAzLCAtMSwgLTEpIHNob3VsZCBub3QgaW50ZXJzZWN0IFJlY3RhbmdsZSgxLCAyLCAzLCA0KSIsICFyMi5pbnRlcnNlY3RzKHIxKSk7Ci0KLQl0cnkgewotCQlyMS5pbnRlcnNlY3RzKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VtcHR5KCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAwLCAwKTsKLQlhc3NlcnRUcnVlKCJSZWN0YW5nbGUgaXMgZW1wdHkiLCByLmlzRW1wdHkoKSk7Ci0KLQlyID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAtMywgLTQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBlbXB0eSIsIHIuaXNFbXB0eSgpKTsKLQotCXIgPSBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpOwotCWFzc2VydFRydWUoIlJlY3RhbmdsZSBpcyBub3QgZW1wdHkiLCAhci5pc0VtcHR5KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgzLCA0LCA1LCA2KTsKLQlhc3NlcnROb3ROdWxsKHIudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB7MywgNCwgNSwgNn0iLCByLnRvU3RyaW5nKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JUmVjdGFuZ2xlIHIxID0gbmV3IFJlY3RhbmdsZSgxLCAyLCAzLCA0KTsKLQlSZWN0YW5nbGUgcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDIsIDIpOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgNCwgNCksIHIxLnVuaW9uKHIyKSk7Ci0JCi0JcjIgPSBuZXcgUmVjdGFuZ2xlKDMsIDMsIDAsIDApOwotCWFzc2VydEVxdWFscygiUmVjdGFuZ2xlIHVuaW9uIGluY29ycmVjdCIsIG5ldyBSZWN0YW5nbGUoMSwgMiwgMywgNCksIHIxLnVuaW9uKHIyKSk7Ci0KLQlyMiA9IG5ldyBSZWN0YW5nbGUoMywgMywgLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIlJlY3RhbmdsZSB1bmlvbiBpbmNvcnJlY3QiLCBuZXcgUmVjdGFuZ2xlKDEsIDIsIDMsIDQpLCByMS51bmlvbihyMikpOwotCi0JdHJ5IHsKLQkJcjEudW5pb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVjdGFuZ2xlID09IG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbXB0eSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3VuaW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2FkZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb250YWluc0lJIikpIHRlc3RfY29udGFpbnNJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfY29udGFpbnNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X2ludGVyc2VjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzSUlJSSIpKSB0ZXN0X2ludGVyc2VjdHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW1wdHkiKSkgdGVzdF9pc0VtcHR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF91bmlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfdW5pb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Y2ZlNmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlZ2lvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlZ2lvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQkvLyB0ZXN0IFJlZ2lvbigpCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oKTsKLQlpZiAocmVnLmlzRGlzcG9zZWQoKSkgewotCQlmYWlsKCJDb25zdHJ1Y3RvciBmb3IgUmVnaW9uIGRpZG4ndCBpbml0aWFsaXplIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmlzRGlzcG9zZWQoKSkgewotCQlmYWlsKCJDb25zdHJ1Y3RvciBmb3IgUmVnaW9uIGRpZG4ndCBpbml0aWFsaXplIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkJEkoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JdHJ5IHsKLQkJcmVnLmFkZCgoaW50W10pbnVsbCk7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyBhIG51bGwgcmVjdGFuZ2xlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCi0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuYWRkKG5ldyBpbnRbXXt9KTsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlSZWN0YW5nbGUgZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDAsNTAsMjUpOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgiYWRkIDEgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyNSwgMCwyNX0pOwotCXJlZy5hZGQobmV3IGludFtdIHswLDI1LCA1MCwyNSwgNTAsNDAsIDAsNDB9KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlleHBlY3RlZCA9IG5ldyBSZWN0YW5nbGUgKDAsMCw1MCw0MCk7Ci0JaWYgKCFib3guZXF1YWxzKGV4cGVjdGVkKSkgewotCQlmYWlsKCJhZGQgMiBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotCX0KLQkKLS8vCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0vLwlyZWcuYWRkKG5ldyBpbnRbXSB7MTAsMTAsIDQwLDMwLCAyMCw2MCwgNSw1NX0pOwotLy8JYm94ID0gcmVnLmdldEJvdW5kcygpOwotLy8JcmVnLmRpc3Bvc2UoKTsKLS8vCWV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoNSwxMCwzNSw1MCk7Ci0vLwlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0vLwkJZmFpbCgiYWRkIDMgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLS8vCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkvLyBhZGQgYSByZWN0YW5nbGUKLQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAwLCA1MCkpOwotCS8vIGFkZCBhIHNlY29uZCByZWN0YW5nbGUKLQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMjAwLCAyMDAsIDEwLDEwKSk7CQotCi0JdHJ5IHsKLQkJcmVnLmFkZCgoUmVjdGFuZ2xlKW51bGwpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBudWxsIHJlY3RhbmdsZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMjAsMzAsMTAsNSkpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSByZWN0YW5nbGUgYWZ0ZXIgUmVnaW9uIGdvdCBkaXNwb3NlZCIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCS8vIG1ha2UgYSBzZWNvbmQgcmVnaW9uIGFuZCBhZGQgaXQgdG8gdGhlIGZpcnN0IG9uZQotCVJlZ2lvbiByZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDQwLCA1MCwgMTAsIDIwKSk7Ci0JcmVnMS5hZGQocmVnMik7Ci0KLQl0cnkgewotCQlyZWcxLmFkZCgoUmVnaW9uKW51bGwpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBudWxsIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQkJcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgxLDEsMTAwLDIwMCkpOwotCQlyZWcyLmRpc3Bvc2UoKTsKLQkJcmVnMS5hZGQocmVnMik7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZGluZyB0byBhIFJlZ2lvbiBhIFJlZ2lvbiB3aGljaCBnb3QgZGlzcG9zZWQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZzEuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDEsMSwxMDAsMjAwKSk7Ci0JCXJlZzEuYWRkKHJlZzIpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRpbmcgYSBSZWdpb24gdG8gYSBSZWdpb24gd2hpY2ggZ290IGRpc3Bvc2VkIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb250YWluc0lJKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMjAwLDEwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QxID0gbmV3IFBvaW50KDEwLDEwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDUwLDUwLDEwMDAsMTAwMCk7Ci0JUG9pbnQgcG9pbnRJblJlY3QyID0gbmV3IFBvaW50KDEwNDksMTAwOSk7Ci0JUG9pbnQgcG9pbnROb3RJblJlY3QxMiA9IG5ldyBQb2ludCg0OSwxMTApOwotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuY29udGFpbnMocG9pbnRJblJlY3QxLngsIHBvaW50SW5SZWN0MS55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJFbXB0eSByZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiUmVnaW9uIHNob3VsZCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5hZGQocmVjdDIpOwotCWlmICghcmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MS54LCBwb2ludEluUmVjdDEueSkgfHwKLQkJIXJlZy5jb250YWlucyhwb2ludEluUmVjdDIueCwgcG9pbnRJblJlY3QyLnkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgY29udGFpbiBwb2ludCIpOwotCX0KLQlpZiAocmVnLmNvbnRhaW5zKHBvaW50Tm90SW5SZWN0MTIueCwgcG9pbnROb3RJblJlY3QxMi55KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQkKLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDIwMCwxMDApOwotCVBvaW50IHBvaW50SW5SZWN0MSA9IG5ldyBQb2ludCgxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSg1MCw1MCwxMDAwLDEwMDApOwotCVBvaW50IHBvaW50SW5SZWN0MiA9IG5ldyBQb2ludCgxMDQ5LDEwMDkpOwotCVBvaW50IHBvaW50Tm90SW5SZWN0MTIgPSBuZXcgUG9pbnQoNDksMTEwKTsKLQkKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5jb250YWlucyhwb2ludEluUmVjdDEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmNvbnRhaW5zKHBvaW50SW5SZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiRW1wdHkgcmVnaW9uIHNob3VsZCBub3QgY29udGFpbiBwb2ludCIpOwotCX0KLQlyZWcuYWRkKHJlY3QxKTsKLQlpZiAoIXJlZy5jb250YWlucyhwb2ludEluUmVjdDEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgY29udGFpbiBwb2ludCIpOwotCX0KLQlyZWcuYWRkKHJlY3QyKTsKLQlpZiAoIXJlZy5jb250YWlucyhwb2ludEluUmVjdDEpIHx8Ci0JCSFyZWcuY29udGFpbnMocG9pbnRJblJlY3QyKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIGNvbnRhaW4gcG9pbnQiKTsKLQl9Ci0JaWYgKHJlZy5jb250YWlucyhwb2ludE5vdEluUmVjdDEyKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJSZWdpb24gc2hvdWxkIG5vdCBjb250YWluIHBvaW50Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMSwxLDUwLDEwMCkpOwotCWlmIChyZWcuaXNEaXNwb3NlZCgpKSB7Ci0JCWZhaWwoIlJlZ2lvbiBzaG91bGQgbm90IGJlIGluIHRoZSBkaXNwb3NlZCBzdGF0ZSIpOwotCX0KLQkKLQkvLyBkaXNwb3NlIHR3aWNlIGFzIHRoaXMgaXMgYWxsb3dlZAotCWZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWlmICghcmVnLmlzRGlzcG9zZWQoKSkgewotCQkJZmFpbCgiUmVnaW9uIHNob3VsZCBiZSBpbiB0aGUgZGlzcG9zZWQgc3RhdGUiKTsKLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDI1LCAxMDAsIDIwMCwgNzgwKTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLCAxMDUsIDIwNSwgNzg1KTsKLQkKLQlSZWdpb24gcmVnMSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMS5hZGQocmVjdDEpOwotCi0JUmVnaW9uIHJlZzIgPSByZWcxOwotCQotCWlmICghcmVnMS5lcXVhbHMocmVnMikpIHsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJyZWZlcmVuY2VzIHRvIHRoZSBzYW1lIGluc3RhbmNlIG9mIFJlZ2lvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVhbCIpOwotCX0KLQkKLQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChyZWN0MSk7Ci0JCi0vLyBDdXJyZW50bHksIFJlZ2lvbnMgYXJlIG9ubHkgImVxdWFsIiBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgaGFuZGxlLgotLy8gVGhpcyBpcyBzbyB0aGF0IGlkZW50aWNhbCBvYmplY3RzIGFyZSBwcm9wZXJseSBoYXNoZWQuCi0vLyBXZSBhcmUgY29uc2lkZXJpbmcgYWRkaW5nIGEgbmV3IG1ldGhvZCB0aGF0IHdpbGwgY29tcGFyZSBSZWdpb25zIGZvciB0aGUgc2FtZSBhcmVhLgotLy8JaWYgKCFyZWcxLmVxdWFscyhyZWcyKSkgewotLy8JCXJlZzEuZGlzcG9zZSgpOwotLy8JCXJlZzIuZGlzcG9zZSgpOwotLy8JCWZhaWwoInR3byBpbnN0YW5jZXMgb2YgUmVnaW9uIHJlcHJlc2VudGluZyB0aGUgc2FtZSBhcmVhIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWFsIik7Ci0vLwl9CQkKLQkKLQlyZWcyLmRpc3Bvc2UoKTsKLQlyZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnMS5lcXVhbHMocmVnMikpIHsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJOb24gZW1wdHkgcmVnaW9uIGNvbnNpZGVyZWQgZXF1YWwgdG8gZW1wdHkgb25lIik7Ci0JfQotCQotCXJlZzIuYWRkKHJlY3QyKTsKLQlpZiAocmVnMS5lcXVhbHMocmVnMikpIHsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJ0d28gZGlmZmVyZW50IHJlZ2lvbnMgY29uc2lkZXJlZCBlcXVhbCIpOwotCX0KLQkKLQlyZWcxLmRpc3Bvc2UoKTsKLQlyZWcyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQlyZWcuZ2V0Qm91bmRzKCk7Ci0JCWZhaWwoIlJlZ2lvbiBkaXNwb3NlZCBzaG91bGQgdGhyb3cgRXhjZXB0aW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsNTAsMzApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMTAwLDEwMCwxMCwxMCk7Ci0JLy8gdGhlIHJlY3RhbmdsZSBlbmNsb3NpbmcgdGhlIHR3byBwcmVjZWRpbmcgcmVjdGFuZ2xlcwotCVJlY3RhbmdsZSByZWN0MTJCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwMCwxMDApOwotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmFkZChyZWN0MSk7Ci0JUmVjdGFuZ2xlIHJlY3QxQmlzID0gcmVnLmdldEJvdW5kcygpOwotCWlmIChyZWN0MUJpcy54ICE9IHJlY3QxLnggfHwgcmVjdDFCaXMueSAhPSByZWN0MS55IHx8IAotCQlyZWN0MUJpcy5oZWlnaHQgIT0gcmVjdDEuaGVpZ2h0IHx8IHJlY3QxQmlzLndpZHRoICE9IHJlY3QxLndpZHRoKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImdldEJvdW5kcyBkb2Vzbid0IHJldHVybiB0aGUgYm9yZGVycyBvZiB0aGUgcmVjdGFuZ2xlIGFyZWEgd2hpY2ggd2FzIHNldCB1cCIpOwotCX0KLQkKLQlyZWcuYWRkKHJlY3QyKTsKLQlSZWN0YW5nbGUgcmVjdDEyID0gcmVnLmdldEJvdW5kcygpOwotCWlmIChyZWN0MTIueCAhPSByZWN0MTJCb3VuZHMueCB8fCByZWN0MTIueSAhPSByZWN0MTJCb3VuZHMueSB8fCAKLQkJcmVjdDEyLmhlaWdodCAhPSByZWN0MTJCb3VuZHMuaGVpZ2h0IHx8IHJlY3QxMi53aWR0aCAhPSByZWN0MTJCb3VuZHMud2lkdGgpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiZ2V0Qm91bmRzIGRvZXNuJ3QgcmV0dXJuIHRoZSBib3JkZXJzIG9mIHRoZSByZXN1bHRpbmcgcmVjdGFuZ2xlIGFyZWEgd2hpY2ggd2FzIHNldCB1cCIpOwotCX0KLQkKLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JCQotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMjUsIDEwMCwgMjAwLCA3ODApOwotCVJlY3RhbmdsZSByZWN0MiA9IG5ldyBSZWN0YW5nbGUoMzAsIDEwNSwgMjA1LCA3ODUpOwotCQotCXJlZzEuYWRkKHJlY3QxKTsKLQlyZWcyLmFkZChyZWN0Mik7Ci0JCi0JaWYgKHJlZzEuaGFzaENvZGUoKSA9PSByZWcyLmhhc2hDb2RlKCkpIHsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzIuZGlzcG9zZSgpOwotCQlmYWlsKCJ0d28gZGlmZmVyZW50IHJlZ2lvbnMgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGhhc2hDb2RlIik7Ci0JfQotCXJlZzIuZGlzcG9zZSgpOwkKLQotCXJlZzIgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzIuYWRkKHJlY3QxKTsKLQotCi0vLyBCVUc6IHRoaXMgc2hvdWxkIHBhc3MJCi0vLwlpZiAocmVnMS5oYXNoQ29kZSgpICE9IHJlZzIuaGFzaENvZGUoKSkgewotLy8JCXJlZzEuZGlzcG9zZSgpOwotLy8JCXJlZzIuZGlzcG9zZSgpOwotLy8JCWZhaWwoInR3byByZWdpb25zIHJlcHJlc2VudGluZyBzYW1lIGFyZWEgc2hvdWxkIGhhdmUgc2FtZSBoYXNoQ29kZSIpOwotLy8JfQotCQotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KTsKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QzID0gbmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q0ID0gbmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCk7Ci0JUmVjdGFuZ2xlIHJlY3Q1ID0gbmV3IFJlY3RhbmdsZSgyNSwyMCwyNSwxMCk7Ci0KLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5pbnRlcnNlY3QocmVjdDEpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuaW50ZXJzZWN0KHJlY3QxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCBmb3IgZW1wdHkgcmVnaW9uIik7Ci0JfQotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5pbnRlcnNlY3QocmVjdDIpOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnLmludGVyc2VjdChyZWN0Myk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MykpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCAyIik7Ci0JfQotCXJlZy5pbnRlcnNlY3QocmVjdDQpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDMiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MS51bmlvbihyZWN0NCkpOwotCXJlZy5pbnRlcnNlY3QocmVjdDUpOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVjdDUpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlY3QxKTsKLQlyZWcuYWRkKHJlY3Q0KTsKLQlyZWcuaW50ZXJzZWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCVJlZ2lvbiByZWcxID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcxLmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSkpOwotCi0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuaW50ZXJzZWN0KHJlZzEpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmludGVyc2VjdChyZWcxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgZm9yIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlSZWdpb24gcmVnMiA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMi5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpKTsKLQotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLmludGVyc2VjdChyZWcyKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWcxLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMSIpOwotCX0KLQlyZWcyLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnMyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnMy5hZGQobmV3IFJlY3RhbmdsZSgxMCwxMCwxMCwxMCkpOwotCQotCXJlZy5pbnRlcnNlY3QocmVnMyk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWczLmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWczLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnNCA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnNC5hZGQobmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCkpOwotCi0JcmVnLmludGVyc2VjdChyZWc0KTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzQuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3QgZmFpbGVkIDMiKTsKLQl9Ci0JCi0JUmVnaW9uIHJlZzUgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzUuYWRkKG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsMTApKTsKLQkKLQlyZWcuYWRkKHJlZzEuZ2V0Qm91bmRzKCkudW5pb24ocmVnNC5nZXRCb3VuZHMoKSkpOwotCXJlZy5pbnRlcnNlY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWc1LmdldEJvdW5kcygpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdCBmYWlsZWQgNCIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuYWRkKHJlZzEpOwotCXJlZy5hZGQocmVnNCk7Ci0JcmVnLmludGVyc2VjdChyZWc1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMjUsMjAsMjUsNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0IGZhaWxlZCA1Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0JcmVnMS5kaXNwb3NlKCk7Ci0JcmVnNC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0lJSUkoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QxID0gbmV3IFJlY3RhbmdsZSgxMCwyMCw1MCwzMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDU5LDQ5LDEwLDIwKTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMSA9IG5ldyBSZWN0YW5nbGUoMCw1LDEwLDE1KTsKLQkKLQlSZWN0YW5nbGUgcmVjdDIgPSBuZXcgUmVjdGFuZ2xlKDMwLDQwLDEwLDEwMCk7Ci0JUmVjdGFuZ2xlIHJlY3RJbnRlcjIgPSBuZXcgUmVjdGFuZ2xlKDM5LDEzOSwxLDUpOwotCVJlY3RhbmdsZSByZWN0Tm90SW50ZXIxMiA9IG5ldyBSZWN0YW5nbGUoNDAsNTAsNSwxNSk7Ci0JCi0JCi0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIxLngsIHJlY3RJbnRlcjEueSwgcmVjdEludGVyMS53aWR0aCwgcmVjdEludGVyMS5oZWlnaHQpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlpZiAocmVnLmludGVyc2VjdHMocmVjdDEueCwgcmVjdDEueSwgcmVjdDEud2lkdGgsIHJlY3QxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBjYW4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0MS54LCByZWN0MS55LCByZWN0MS53aWR0aCwgcmVjdDEuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjEueCwgcmVjdEludGVyMS55LCByZWN0SW50ZXIxLndpZHRoLCByZWN0SW50ZXIxLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxLngsIHJlY3ROb3RJbnRlcjEueSwgcmVjdE5vdEludGVyMS53aWR0aCwgcmVjdE5vdEludGVyMS5oZWlnaHQpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0Mi54LCByZWN0Mi55LCByZWN0Mi53aWR0aCwgcmVjdDIuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSIpOwotCX0KLQlpZiAoIXJlZy5pbnRlcnNlY3RzKHJlY3RJbnRlcjIueCwgcmVjdEludGVyMi55LCByZWN0SW50ZXIyLndpZHRoLCByZWN0SW50ZXIyLmhlaWdodCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUgIik7Ci0JfQotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0Tm90SW50ZXIxMi54LCByZWN0Tm90SW50ZXIxMi55LCByZWN0Tm90SW50ZXIxMi53aWR0aCwgcmVjdE5vdEludGVyMTIuaGVpZ2h0KSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIHJldHVybiB0cnVlIG9uIHJlY3RhbmdsZSBub3QgaW50ZXJzZWN0aW5nIHdpdGggcmVnaW9uIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCVJlY3RhbmdsZSByZWN0MSA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsNTAsMzApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIxID0gbmV3IFJlY3RhbmdsZSg1OSw0OSwxMCwyMCk7Ci0JUmVjdGFuZ2xlIHJlY3ROb3RJbnRlcjEgPSBuZXcgUmVjdGFuZ2xlKDAsNSwxMCwxNSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgzMCw0MCwxMCwxMDApOwotCVJlY3RhbmdsZSByZWN0SW50ZXIyID0gbmV3IFJlY3RhbmdsZSgzOSwxMzksMSw1KTsKLQlSZWN0YW5nbGUgcmVjdE5vdEludGVyMTIgPSBuZXcgUmVjdGFuZ2xlKDQwLDUwLDUsMTUpOwotCQotCQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLmludGVyc2VjdHMocmVjdEludGVyMSk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCWlmIChyZWcuaW50ZXJzZWN0cyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBjYW4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUiKTsKLQl9Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSAiKTsKLQl9Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3ROb3RJbnRlcjEpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImludGVyc2VjdHMgcmV0dXJuIHRydWUgb24gcmVjdGFuZ2xlIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCByZWdpb24iKTsKLQl9Ci0JCi0JcmVnLmFkZChyZWN0Mik7Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0MikpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgiaW50ZXJzZWN0cyBkaWRuJ3QgcmV0dXJuIHRydWUiKTsKLQl9Ci0JaWYgKCFyZWcuaW50ZXJzZWN0cyhyZWN0SW50ZXIyKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIGRpZG4ndCByZXR1cm4gdHJ1ZSAiKTsKLQl9Ci0JaWYgKHJlZy5pbnRlcnNlY3RzKHJlY3ROb3RJbnRlcjEyKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpbnRlcnNlY3RzIHJldHVybiB0cnVlIG9uIHJlY3RhbmdsZSBub3QgaW50ZXJzZWN0aW5nIHdpdGggcmVnaW9uIik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQkvLyB0ZXN0IGluIGRpc3Bvc2UoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW1wdHkoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JUmVjdGFuZ2xlIGVtcHR5UmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDAsMjAwKTsKLQlSZWN0YW5nbGUgZW1wdHlSZWN0MiA9IG5ldyBSZWN0YW5nbGUoMTAsMjAsMTAsMCk7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDUwLDEwMCk7Ci0JCi0JaWYgKCFyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImlzRW1wdHkgZGlkbid0IHJldHVybiB0cnVlIG9uIGVtcHR5IHJlZ2lvbiIpOwotCX0KLQkKLQlyZWcuYWRkKGVtcHR5UmVjdDEpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpc0VtcHR5IGRpZG4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0KLQlyZWcuYWRkKGVtcHR5UmVjdDIpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJpc0VtcHR5IGRpZG4ndCByZXR1cm4gdHJ1ZSBvbiBlbXB0eSByZWdpb24iKTsKLQl9Ci0KLQlyZWcuYWRkKHJlY3QpOwotCWlmIChyZWcuaXNFbXB0eSgpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoImlzRW1wdHkgcmV0dXJuZWQgdHJ1ZSBvbiBub24gZW1wdHkgcmVnaW9uIik7Ci0JfQotCQotCXJlZy5kaXNwb3NlKCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N1YnRyYWN0JEkoKSB7Ci0JUmVnaW9uIHJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JdHJ5IHsKLQkJcmVnLnN1YnRyYWN0KChpbnRbXSludWxsKTsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3VidHJhY3QgYSBudWxsIGFycmF5Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCi0JcmVnLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlyZWcuc3VidHJhY3QobmV3IGludFtde30pOwotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIG9uIGRpc3Bvc2VkIHJlZ2lvbiIpOwotCX0KLQljYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmVnLmRpc3Bvc2UoKTsKLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQobmV3IGludFtdIHswLDAsIDUwLDAsIDUwLDI1LCAwLDI1fSk7Ci0JcmVnLnN1YnRyYWN0KG5ldyBpbnRbXSB7MCwwLCA1MCwwLCA1MCwyMCwgMCwyMH0pOwotCVJlY3RhbmdsZSBib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JcmVnLmRpc3Bvc2UoKTsKLQlSZWN0YW5nbGUgZXhwZWN0ZWQgPSBuZXcgUmVjdGFuZ2xlICgwLDIwLDUwLDUpOwotCWlmICghYm94LmVxdWFscyhleHBlY3RlZCkpIHsKLQkJZmFpbCgic3VidHJhY3QgMSBmYWlsZWQgLSBleHBlY3RlZDogIitleHBlY3RlZCsiIGFjdHVhbDogIitib3gpOwotCX0KLQkKLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQobmV3IGludFtdIHswLDAsIDUwLDAsIDUwLDI1LCAwLDI1fSk7Ci0JcmVnLmFkZChuZXcgaW50W10gezAsMjUsIDUwLDI1LCA1MCw0MCwgMCw0MH0pOwotCXJlZy5zdWJ0cmFjdChuZXcgaW50W10gezAsMjUsIDUwLDI1LCA1MCw0MCwgMCw0MH0pOwotCWJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlyZWcuZGlzcG9zZSgpOwotCWV4cGVjdGVkID0gbmV3IFJlY3RhbmdsZSAoMCwwLDUwLDI1KTsKLQlpZiAoIWJveC5lcXVhbHMoZXhwZWN0ZWQpKSB7Ci0JCWZhaWwoInN1YnRyYWN0IDIgZmFpbGVkIC0gZXhwZWN0ZWQ6ICIrZXhwZWN0ZWQrIiBhY3R1YWw6ICIrYm94KTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQlSZWN0YW5nbGUgcmVjdDEgPSBuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSk7Ci0JUmVjdGFuZ2xlIHJlY3QyID0gbmV3IFJlY3RhbmdsZSgwLDAsNTAsMjUpOwotCVJlY3RhbmdsZSByZWN0MyA9IG5ldyBSZWN0YW5nbGUoMTAsMTAsMTAsMTApOwotCVJlY3RhbmdsZSByZWN0NCA9IG5ldyBSZWN0YW5nbGUoNTAsMjUsMTAsMTApOwotCVJlY3RhbmdsZSByZWN0NSA9IG5ldyBSZWN0YW5nbGUoMCwwLDYwLDIwKTsKLQotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJcmVnLnN1YnRyYWN0KHJlY3QxKTsKLQkJZmFpbCgibm8gZXhjZXB0aW9uIHRocm93biBvbiBkaXNwb3NlZCByZWdpb24iKTsKLQl9Ci0JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXJlZyA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnLnN1YnRyYWN0KHJlY3QxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIGZvciBlbXB0eSByZWdpb24iKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLnN1YnRyYWN0KHJlY3QyKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDEiKTsKLQl9Ci0JcmVnLmFkZChyZWN0MSk7Ci0JcmVnLnN1YnRyYWN0KHJlY3QzKTsKLQlSZWN0YW5nbGUgYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhyZWN0MSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDIiKTsKLQl9Ci0JcmVnLnN1YnRyYWN0KHJlY3Q0KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlY3QxKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMyIpOwotCX0KLQlyZWcuYWRkKHJlY3QxLnVuaW9uKHJlY3Q0KSk7Ci0JcmVnLnN1YnRyYWN0KHJlY3Q1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwyMCw2MCwxNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCA0Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0KLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQocmVjdDEpOwotCXJlZy5hZGQocmVjdDQpOwotCXJlZy5zdWJ0cmFjdChyZWN0NSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsMjAsNjAsMTUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgNSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKSB7Ci0JUmVnaW9uIHJlZzEgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZzEuYWRkKG5ldyBSZWN0YW5nbGUoMCwwLDUwLDI1KSk7Ci0KLQlSZWdpb24gcmVnID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXJlZy5zdWJ0cmFjdChyZWcxKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCWZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24gb24gZGlzcG9zZWQgcmVnaW9uIik7Ci0JfQotCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCX0KLQkKLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5zdWJ0cmFjdChyZWcxKTsKLQlpZiAoIXJlZy5pc0VtcHR5KCkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCBmb3IgZW1wdHkgcmVnaW9uIik7Ci0JfQotCQotCVJlZ2lvbiByZWcyID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWcyLmFkZChuZXcgUmVjdGFuZ2xlKDAsMCw1MCwyNSkpOwotCQotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLnN1YnRyYWN0KHJlZzIpOwotCWlmICghcmVnLmlzRW1wdHkoKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnMi5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCAxIik7Ci0JfQotCXJlZzIuZGlzcG9zZSgpOwotCQotCVJlZ2lvbiByZWczID0gbmV3IFJlZ2lvbihkaXNwbGF5KTsKLQlyZWczLmFkZChuZXcgUmVjdGFuZ2xlKDEwLDEwLDEwLDEwKSk7Ci0JCi0JcmVnLmFkZChyZWcxKTsKLQlyZWcuc3VidHJhY3QocmVnMyk7Ci0JUmVjdGFuZ2xlIGJveCA9IHJlZy5nZXRCb3VuZHMoKTsKLQlpZiAoIWJveC5lcXVhbHMocmVnMS5nZXRCb3VuZHMoKSkpIHsKLQkJcmVnLmRpc3Bvc2UoKTsKLQkJcmVnMS5kaXNwb3NlKCk7Ci0JCXJlZzMuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgMiIpOwotCX0KLQlyZWczLmRpc3Bvc2UoKTsKLQkKLQlSZWdpb24gcmVnNCA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnNC5hZGQobmV3IFJlY3RhbmdsZSg1MCwyNSwxMCwxMCkpOwotCQotCXJlZy5zdWJ0cmFjdChyZWc0KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKHJlZzEuZ2V0Qm91bmRzKCkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJZmFpbCgic3VidHJhY3QgZmFpbGVkIDMiKTsKLQl9Ci0KLQlSZWdpb24gcmVnNSA9IG5ldyBSZWdpb24oZGlzcGxheSk7Ci0JcmVnNS5hZGQobmV3IFJlY3RhbmdsZSgwLDAsNjAsMjApKTsKLQkKLQlyZWcuYWRkKHJlZzEuZ2V0Qm91bmRzKCkudW5pb24ocmVnNC5nZXRCb3VuZHMoKSkpOwotCXJlZy5zdWJ0cmFjdChyZWc1KTsKLQlib3ggPSByZWcuZ2V0Qm91bmRzKCk7Ci0JaWYgKCFib3guZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwyMCw2MCwxNSkpKSB7Ci0JCXJlZy5kaXNwb3NlKCk7Ci0JCXJlZzEuZGlzcG9zZSgpOwotCQlyZWc0LmRpc3Bvc2UoKTsKLQkJcmVnNS5kaXNwb3NlKCk7Ci0JCWZhaWwoInN1YnRyYWN0IGZhaWxlZCA0Iik7Ci0JfQotCXJlZy5kaXNwb3NlKCk7Ci0KLQlyZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCXJlZy5hZGQocmVnMSk7Ci0JcmVnLmFkZChyZWc0KTsKLQlyZWcuc3VidHJhY3QocmVnNSk7Ci0JYm94ID0gcmVnLmdldEJvdW5kcygpOwotCWlmICghYm94LmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsMjAsNjAsMTUpKSkgewotCQlyZWcuZGlzcG9zZSgpOwotCQlyZWcxLmRpc3Bvc2UoKTsKLQkJcmVnNC5kaXNwb3NlKCk7Ci0JCXJlZzUuZGlzcG9zZSgpOwotCQlmYWlsKCJzdWJ0cmFjdCBmYWlsZWQgNSIpOwotCX0KLQlyZWcuZGlzcG9zZSgpOwotCXJlZzEuZGlzcG9zZSgpOwotCXJlZzQuZGlzcG9zZSgpOwotCXJlZzUuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCVJlZ2lvbiByZWcgPSBuZXcgUmVnaW9uKGRpc3BsYXkpOwotCQotCVN0cmluZyBzID0gcmVnLnRvU3RyaW5nKCk7Ci0JCi0JaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJZmFpbCgidG9TdHJpbmcgcmV0dXJucyBudWxsIG9yIGVtcHR5IHN0cmluZyIpOwotCX0KLQkKLQlyZWcuYWRkKG5ldyBSZWN0YW5nbGUoMSwxLDEwLDIwKSk7Ci0JcyA9IHJlZy50b1N0cmluZygpOwotCQotCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCWZhaWwoInRvU3RyaW5nIHJldHVybnMgbnVsbCBvciBlbXB0eSBzdHJpbmciKTsKLQl9Ci0KLQlyZWcuZGlzcG9zZSgpOwotCXMgPSByZWcudG9TdHJpbmcoKTsKLQkKLQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQlmYWlsKCJ0b1N0cmluZyByZXR1cm5zIG51bGwgb3IgZW1wdHkgc3RyaW5nIik7Ci0JfQkJCQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZUkoKSB7Ci0JaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgewotCQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VJIG5vdCB3cml0dGVuIik7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRhaW5zSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFzaENvZGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJzZWN0c0lJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludGVyc2VjdHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbXB0eSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3VidHJhY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkJEkiKSkgdGVzdF9hZGQkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9hZGRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29udGFpbnNJSSIpKSB0ZXN0X2NvbnRhaW5zSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X2NvbnRhaW5zTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaGFzaENvZGUiKSkgdGVzdF9oYXNoQ29kZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24iKSkgdGVzdF9pbnRlcnNlY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0c0lJSUkiKSkgdGVzdF9pbnRlcnNlY3RzSUlJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3RfaW50ZXJzZWN0c0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbXB0eSIpKSB0ZXN0X2lzRW1wdHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N1YnRyYWN0JEkiKSkgdGVzdF9zdWJ0cmFjdCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdWJ0cmFjdExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3VidHJhY3RMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X3N1YnRyYWN0TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWdpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSIpKSB0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlSSgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlEaXNwbGF5IGRpc3BsYXk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOGE2NjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9GaWxsTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRmlsbExheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJIikpIHRlc3RfQ29uc3RydWN0b3JJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiMjE1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtQXR0YWNobWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1BdHRhY2htZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySUkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSUkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCwgMTAwLCAxMCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2hlbGwpOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbEkoKSB7Ci0JRm9ybUF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBGb3JtQXR0YWNobWVudChzaGVsbCwgMTApOwotCWFzc2VydE5vdE51bGwoYXR0YWNobWVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJKCkgewotCUZvcm1BdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2hlbGwsIDEwLCBTV1QuTEVGVCk7Ci0JYXNzZXJ0Tm90TnVsbChhdHRhY2htZW50KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlGb3JtQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQlhc3NlcnROb3ROdWxsKGF0dGFjaG1lbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShhdHRhY2htZW50LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUF0dGFjaG1lbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUlJIikpIHRlc3RfQ29uc3RydWN0b3JJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiZDJhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybURhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJSSBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X0Zvcm1MYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjNWU0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Gb3JtTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfRm9ybUxheW91dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmMzY5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCWFzc2VydE5vdE51bGwoZGF0YSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID09IEdyaWREYXRhLkNFTlRFUik7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPT0gR3JpZERhdGEuQkVHSU5OSU5HKTsKLQlhc3NlcnRUcnVlKGRhdGEud2lkdGhIaW50ID09IFNXVC5ERUZBVUxUKTsKLQlhc3NlcnRUcnVlKGRhdGEuaGVpZ2h0SGludCA9PSBTV1QuREVGQVVMVCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxJbmRlbnQgPT0gMCk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmhvcml6b250YWxTcGFuID09IDEpOwotCWFzc2VydFRydWUoZGF0YS52ZXJ0aWNhbFNwYW4gPT0gMSk7Ci0JYXNzZXJ0VHJ1ZShkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPT0gZmFsc2UpOwotCWFzc2VydFRydWUoZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEpOwotCWFzc2VydFRydWUoZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5GSUxMKTsKLQlhc3NlcnRUcnVlKGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9PSBHcmlkRGF0YS5GSUxMKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9PSB0cnVlKTsKLQlhc3NlcnRUcnVlKGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKDEwMCwgMTAwKTsKLQlhc3NlcnROb3ROdWxsKGRhdGEpOwotCWFzc2VydFRydWUoZGF0YS53aWR0aEhpbnQgPT0gMTAwKTsKLQlhc3NlcnRUcnVlKGRhdGEuaGVpZ2h0SGludCA9PSAxMDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZERhdGEoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJSSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySUkiKSkgdGVzdF9Db25zdHJ1Y3RvcklJKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmYyY2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfR3JpZExheW91dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9HcmlkTGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJWiIpKSB0ZXN0X0NvbnN0cnVjdG9ySVooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1NDdjMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dEYXRhCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0RhdGEKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfbGF5b3V0X1Jvd0RhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dEYXRhKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJSSIpKSB0ZXN0X0NvbnN0cnVjdG9ySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5NDk2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2xheW91dF9Sb3dMYXlvdXQgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9sYXlvdXRfUm93TGF5b3V0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDNmYWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09MRSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcnJvckkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Vycm9ySSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Vycm9ySUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Vycm9ySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kUHJvZ3JhbUlETGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZpbmRQcm9ncmFtSURMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2lzT2xlRmlsZUxqYXZhX2lvX0ZpbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT0xFKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Vycm9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXJyb3JJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X1NXVC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXJyb3JJIikpIHRlc3RfZXJyb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lcnJvcklJIikpIHRlc3RfZXJyb3JJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfZmluZFByb2dyYW1JRExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc09sZUZpbGVMamF2YV9pb19GaWxlIikpIHRlc3RfaXNPbGVGaWxlTGphdmFfaW9fRmlsZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIyNzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlQXV0b21hdGlvbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVBdXRvbWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbiBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGlzcG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZGlzcG9zZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvY3VtZW50YXRpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXREb2N1bWVudGF0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlbHBGaWxlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SGVscEZpbGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExhc3RFcnJvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TGFzdEVycm9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE5hbWVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZXNJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0TmFtZXNJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb3BlcnR5SSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvcGVydHlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VHlwZUluZm9BdHRyaWJ1dGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlTm9SZXBseUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludm9rZU5vUmVwbHlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW52b2tlTm9SZXBseUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb2N1bWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RnVuY3Rpb25EZXNjcmlwdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlbHBGaWxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SURzT2ZOYW1lcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGFzdEVycm9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXROYW1lSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TmFtZXNJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlEZXNjcmlwdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb3BlcnR5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFR5cGVJbmZvQXR0cmlidXRlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW52b2tlTm9SZXBseUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREb2N1bWVudGF0aW9uSSIpKSB0ZXN0X2dldERvY3VtZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGdW5jdGlvbkRlc2NyaXB0aW9uSSIpKSB0ZXN0X2dldEZ1bmN0aW9uRGVzY3JpcHRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWxwRmlsZUkiKSkgdGVzdF9nZXRIZWxwRmlsZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldElEc09mTmFtZXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9nZXRJRHNPZk5hbWVzJExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMYXN0RXJyb3IiKSkgdGVzdF9nZXRMYXN0RXJyb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE5hbWVJIikpIHRlc3RfZ2V0TmFtZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE5hbWVzSUkiKSkgdGVzdF9nZXROYW1lc0lJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9wZXJ0eURlc2NyaXB0aW9uSSIpKSB0ZXN0X2dldFByb3BlcnR5RGVzY3JpcHRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9wZXJ0eUkiKSkgdGVzdF9nZXRQcm9wZXJ0eUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3RfZ2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKSkgdGVzdF9nZXRQcm9wZXJ0eUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMiKSkgdGVzdF9nZXRUeXBlSW5mb0F0dHJpYnV0ZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZUkiKSkgdGVzdF9pbnZva2VJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9pbnZva2VJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZUkkTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCRJIikpIHRlc3RfaW52b2tlSSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZU5vUmVwbHlJIikpIHRlc3RfaW52b2tlTm9SZXBseUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludm9rZU5vUmVwbHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkiKSkgdGVzdF9pbnZva2VOb1JlcGx5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByb3BlcnR5SSRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50IikpIHRlc3Rfc2V0UHJvcGVydHlJJExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9zZXRQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NzE3ZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDbGllbnRTaXRlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNsaWVudFNpdGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfaW9fRmlsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfaW9fRmlsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2RvVmVyYkkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2RvVmVyYkkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZXhlY0lJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmRlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluZGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb2dyYW1JRCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJvZ3JhbUlEIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXJ0eSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaXNEaXJ0eSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRm9jdXNDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9pc0ZvY3VzQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3F1ZXJ5U3RhdHVzSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcXVlcnlTdGF0dXNJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2F2ZUxqYXZhX2lvX0ZpbGVaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zYXZlTGphdmFfaW9fRmlsZVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNsaWVudFNpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfaW9fRmlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZG9WZXJiSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXhlY0lJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluZGVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UHJvZ3JhbUlEIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0RpcnR5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0ZvY3VzQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcXVlcnlTdGF0dXNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zYXZlTGphdmFfaW9fRmlsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluZGVudExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93UHJvcGVydGllc0xqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfaW9fRmlsZSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9pb19GaWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2lvX0ZpbGUiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmdMamF2YV9pb19GaWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZWFjdGl2YXRlSW5QbGFjZUNsaWVudCIpKSB0ZXN0X2RlYWN0aXZhdGVJblBsYWNlQ2xpZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kb1ZlcmJJIikpIHRlc3RfZG9WZXJiSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZXhlY0lJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9leGVjSUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5kZW50IikpIHRlc3RfZ2V0SW5kZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9ncmFtSUQiKSkgdGVzdF9nZXRQcm9ncmFtSUQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRGlydHkiKSkgdGVzdF9pc0RpcnR5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0ZvY3VzQ29udHJvbCIpKSB0ZXN0X2lzRm9jdXNDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9xdWVyeVN0YXR1c0kiKSkgdGVzdF9xdWVyeVN0YXR1c0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NhdmVMamF2YV9pb19GaWxlWiIpKSB0ZXN0X3NhdmVMamF2YV9pb19GaWxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5kZW50TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRJbmRlbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1Byb3BlcnRpZXNMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3Nob3dQcm9wZXJ0aWVzTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDb250cm9sU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRkYThiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUNvbnRyb2xTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNvbnRyb2xTaXRlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNvbnRyb2xTaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ2xpZW50U2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUlMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSUxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCYWNrZ3JvdW5kIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0Rm9udCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvcmVncm91bmQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXRlUHJvcGVydHlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTaXRlUHJvcGVydHlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfR1VJRElMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQ29udHJvbFNpdGUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCYWNrZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXRlUHJvcGVydHlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRXZlbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9HVUlESUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpdGVQcm9wZXJ0eUlMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVDbGllbnRTaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9hZGRFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X2FkZEV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyIikpIHRlc3RfYWRkUHJvcGVydHlMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZCIpKSB0ZXN0X2dldEJhY2tncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l0ZVByb3BlcnR5SSIpKSB0ZXN0X2dldFNpdGVQcm9wZXJ0eUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbklMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUV2ZW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uSUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVFdmVudExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbkxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0dVSURJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVByb3BlcnR5TGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVQcm9wZXJ0eUxpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l0ZVByb3BlcnR5SUxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQiKSkgdGVzdF9zZXRTaXRlUHJvcGVydHlJTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWViOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZTZkN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGcmFtZShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRhaW5lck1lbnVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250YWluZXJNZW51cyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbGVNZW51cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RmlsZU1lbnVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0V2luZG93TWVudXMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFdpbmRvd01lbnVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRDb250YWluZXJNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0V2luZG93TWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnJhbWUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250YWluZXJNZW51cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsZU1lbnVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXaW5kb3dNZW51cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udGFpbmVyTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGaWxlTWVudXMkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaW5kb3dNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250YWluZXJNZW51cyIpKSB0ZXN0X2dldENvbnRhaW5lck1lbnVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWxlTWVudXMiKSkgdGVzdF9nZXRGaWxlTWVudXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdpbmRvd01lbnVzIikpIHRlc3RfZ2V0V2luZG93TWVudXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X3NldENvbnRhaW5lck1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsZU1lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X3NldEZpbGVNZW51cyRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X3NldFdpbmRvd01lbnVzJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRnVuY3Rpb25EZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWE3MjgzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVGdW5jdGlvbkRlc2NyaXB0aW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUZ1bmN0aW9uRGVzY3JpcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVGdW5jdGlvbkRlc2NyaXB0aW9uIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUZ1bmN0aW9uRGVzY3JpcHRpb24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGRjNWJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlTGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlTGlzdGVuZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVMaXN0ZW5lcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUxpc3RlbmVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVFdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlRXZlbnQiKSkgdGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUV2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyMDYxZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQYXJhbWV0ZXJEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZVBhcmFtZXRlckRlc2NyaXB0aW9uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZVBhcmFtZXRlckRlc2NyaXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUGFyYW1ldGVyRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yIG5vdCB3cml0dGVuIik7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVBhcmFtZXRlckRlc2NyaXB0aW9uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVQcm9wZXJ0eURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjkxYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZVByb3BlcnR5RGVzY3JpcHRpb24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlUHJvcGVydHlEZXNjcmlwdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZVByb3BlcnR5RGVzY3JpcHRpb24gZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlUHJvcGVydHlEZXNjcmlwdGlvbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkNWJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX1ZhcmlhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5WYXJpYW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfVmFyaWFudCBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yRigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JGIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3Rvckkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcklTKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvcklTIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSVVua25vd24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfb2xlX3dpbjMyX09sZUF1dG9tYXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9vbGVfd2luMzJfT2xlQXV0b21hdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yUygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JTIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3Rvclogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9kaXNwb3NlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QXV0b21hdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QXV0b21hdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvb2xlYW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvb2xlYW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCeVJlZigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QnlSZWYgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREaXNwYXRjaCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGlzcGF0Y2ggbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGbG9hdCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RmxvYXQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNob3J0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTaG9ydCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0VHlwZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFVua25vd24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFVua25vd24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCeVJlZkYoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJ5UmVmRiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJ5UmVmSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0QnlSZWZJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QnlSZWZTKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRCeVJlZlMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCeVJlZlooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEJ5UmVmWiBub3Qgd3JpdHRlbiIpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9WYXJpYW50KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yRiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvcklTIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93biIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvclMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QXV0b21hdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm9vbGVhbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QnlSZWYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERpc3BhdGNoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGbG9hdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaG9ydCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUeXBlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRVbmtub3duIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCeVJlZkYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJ5UmVmSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QnlSZWZTIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCeVJlZloiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckYiKSkgdGVzdF9Db25zdHJ1Y3RvckYoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9ySSIpKSB0ZXN0X0NvbnN0cnVjdG9ySSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JJUyIpKSB0ZXN0X0NvbnN0cnVjdG9ySVMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9Db25zdHJ1Y3RvckxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lEaXNwYXRjaCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9vbGVfd2luMzJfSURpc3BhdGNoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfb2xlX3dpbjMyX0lVbmtub3duIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX29sZV93aW4zMl9JVW5rbm93bigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X29sZV93aW4zMl9PbGVBdXRvbWF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvclMiKSkgdGVzdF9Db25zdHJ1Y3RvclMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yWiIpKSB0ZXN0X0NvbnN0cnVjdG9yWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEF1dG9tYXRpb24iKSkgdGVzdF9nZXRBdXRvbWF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb29sZWFuIikpIHRlc3RfZ2V0Qm9vbGVhbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QnlSZWYiKSkgdGVzdF9nZXRCeVJlZigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGlzcGF0Y2giKSkgdGVzdF9nZXREaXNwYXRjaCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmxvYXQiKSkgdGVzdF9nZXRGbG9hdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW50IikpIHRlc3RfZ2V0SW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaG9ydCIpKSB0ZXN0X2dldFNob3J0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHJpbmciKSkgdGVzdF9nZXRTdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFR5cGUiKSkgdGVzdF9nZXRUeXBlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRVbmtub3duIikpIHRlc3RfZ2V0VW5rbm93bigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QnlSZWZGIikpIHRlc3Rfc2V0QnlSZWZGKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCeVJlZkkiKSkgdGVzdF9zZXRCeVJlZkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJ5UmVmUyIpKSB0ZXN0X3NldEJ5UmVmUygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QnlSZWZaIikpIHRlc3Rfc2V0QnlSZWZaKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODMzOTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50RGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnREaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50RGlhbG9nKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlwcmludERpYWxvZyA9IG5ldyBQcmludERpYWxvZyhzaGVsbCwgU1dULk5PTkUpOwotCXNldERpYWxvZyhwcmludERpYWxvZyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JbmV3IFByaW50RGlhbG9nKHNoZWxsKTsKLQkKLQl0cnkgewotCQluZXcgUHJpbnREaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JbmV3IFByaW50RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCi0JdHJ5IHsKLQkJbmV3IFByaW50RGlhbG9nKG51bGwsIFNXVC5OT05FKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuZFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEVuZFBhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQcmludFRvRmlsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UHJpbnRUb0ZpbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTY29wZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2NvcGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdGFydFBhZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0YXJ0UGFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X29wZW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmRQYWdlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0RW5kUGFnZUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcmludFRvRmlsZVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFByaW50VG9GaWxlWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNjb3BlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U2NvcGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3RhcnRQYWdlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U3RhcnRQYWdlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludERpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmRQYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmludFRvRmlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2NvcGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN0YXJ0UGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5kUGFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFByaW50VG9GaWxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2NvcGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTdGFydFBhZ2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmRQYWdlIikpIHRlc3RfZ2V0RW5kUGFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJpbnRUb0ZpbGUiKSkgdGVzdF9nZXRQcmludFRvRmlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2NvcGUiKSkgdGVzdF9nZXRTY29wZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3RhcnRQYWdlIikpIHRlc3RfZ2V0U3RhcnRQYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5kUGFnZUkiKSkgdGVzdF9zZXRFbmRQYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJpbnRUb0ZpbGVaIikpIHRlc3Rfc2V0UHJpbnRUb0ZpbGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTY29wZUkiKSkgdGVzdF9zZXRTY29wZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFN0YXJ0UGFnZUkiKSkgdGVzdF9zZXRTdGFydFBhZ2VJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCVByaW50RGlhbG9nIHByaW50RGlhbG9nOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZTMwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU3RyaW5nIGRldGFpbCA9ICIiOwotCWlmIChQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpID09IG51bGwpIHsKLQkJLyogVGhlcmUgYXJlbid0IGFueSBwcmludGVycywgc28gdmVyaWZ5IHRoYXQgdGhlCi0JCSAqIGNvbnN0cnVjdG9yIHRocm93cyBhbiBFUlJPUl9OT19IQU5ETEVTIFNXVEVycm9yLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKCk7Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoU1dURXJyb3IgZXgpIHsKLQkJCWlmIChleC5jb2RlID09IFNXVC5FUlJPUl9OT19IQU5ETEVTKSBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIkVSUk9SX05PX0hBTkRMRVMgbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JfSBlbHNlIHsKLQkJLyogVGhlcmUgaXMgYXQgbGVhc3QgYSBkZWZhdWx0IHByaW50ZXIsIHNvIHZlcmlmeSB0aGF0Ci0JCSAqIHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9ucy4KLQkJICovCi0JCXRyeSB7Ci0JCQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcigpOwotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJCWRldGFpbCA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJfQotCQlhc3NlcnRGYWxzZSgiRXhjZXB0aW9uIHRocm93bjogIiArIGRldGFpbCwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhKCkgewotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU3RyaW5nIGRldGFpbCA9ICIiOwotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWlmIChkYXRhID09IG51bGwpIHsKLQkJLyogVGhlcmUgYXJlbid0IGFueSBwcmludGVycywgc28gdmVyaWZ5IHRoYXQgdGhlCi0JCSAqIGNvbnN0cnVjdG9yIHRocm93cyBhbiBFUlJPUl9OT19IQU5ETEVTIFNXVEVycm9yLgotCQkgKi8KLQkJdHJ5IHsKLQkJCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCQkJcHJpbnRlci5kaXNwb3NlKCk7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGV4KSB7Ci0JCQlpZiAoZXguY29kZSA9PSBTV1QuRVJST1JfTk9fSEFORExFUykgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJFUlJPUl9OT19IQU5ETEVTIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCX0gZWxzZSB7Ci0JCS8qIFRoZXJlIGlzIGF0IGxlYXN0IGEgZGVmYXVsdCBwcmludGVyLCBzbyB2ZXJpZnkgdGhhdAotCQkgKiB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgdGhyb3cgYW55IGV4Y2VwdGlvbnMuCi0JCSAqLwotCQl0cnkgewotCQkJUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JCQlwcmludGVyLmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCQkJZGV0YWlsID0gZXguZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWFzc2VydEZhbHNlKCJFeGNlcHRpb24gdGhyb3duOiAiICsgZGV0YWlsLCBleGNlcHRpb25UaHJvd24pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jYW5jZWxKb2IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NhbmNlbEpvYiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVUcmltSUlJSSgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JUmVjdGFuZ2xlIHRyaW0gPSBwcmludGVyLmNvbXB1dGVUcmltKDAsIDAsIDEwLCAxMCk7Ci0JYXNzZXJ0VHJ1ZSgidHJpbSB3aWR0aCBvciBoZWlnaHQgaXMgaW5jb3JyZWN0IiwgdHJpbS53aWR0aCA+PSAxMCAmJiB0cmltLmhlaWdodCA+PSAxMCk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZW5kSm9iKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lbmRKb2Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lbmRQYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9lbmRQYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbnRlci5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCJib3VuZHMgd2lkdGggb3IgaGVpZ2h0IGlzIHplcm8iLCBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCVByaW50ZXJEYXRhIGRhdGEgPSBQcmludGVyLmdldERlZmF1bHRQcmludGVyRGF0YSgpOwotCS8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgcHJpbnRlcnMsIGRvbid0IGRvIHRoaXMgdGVzdAotCWlmIChkYXRhID09IG51bGwpIHJldHVybjsKLQlQcmludGVyIHByaW50ZXIgPSBuZXcgUHJpbnRlcihkYXRhKTsKLQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHByaW50ZXIuZ2V0Q2xpZW50QXJlYSgpOwotCWFzc2VydFRydWUoImNsaWVudEFyZWEgd2lkdGggb3IgaGVpZ2h0IGlzIHplcm8iLCBjbGllbnRBcmVhLndpZHRoID4gMCAmJiBjbGllbnRBcmVhLmhlaWdodCA+IDApOwotCXByaW50ZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERQSSgpIHsKLQlQcmludGVyRGF0YSBkYXRhID0gUHJpbnRlci5nZXREZWZhdWx0UHJpbnRlckRhdGEoKTsKLQkvLyBpZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCBkb24ndCBkbyB0aGlzIHRlc3QKLQlpZiAoZGF0YSA9PSBudWxsKSByZXR1cm47Ci0JUHJpbnRlciBwcmludGVyID0gbmV3IFByaW50ZXIoZGF0YSk7Ci0JUG9pbnQgZHBpID0gcHJpbnRlci5nZXREUEkoKTsKLQlhc3NlcnRUcnVlKCJkcGkgeCBvciB5IGlzIHplcm8iLCBkcGkueCA+IDAgJiYgZHBpLnkgPiAwKTsKLQlwcmludGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0UHJpbnRlckRhdGEoKSB7Ci0JLy8gVGVzdGVkIGluIHRlc3RfZ2V0UHJpbnRlckRhdGEuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbnRlckRhdGEoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JLy8gaWYgdGhlcmUgYXJlbid0IGFueSBwcmludGVycywgZG9uJ3QgZG8gdGhpcyB0ZXN0Ci0JaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuOwotCVByaW50ZXIgcHJpbnRlciA9IG5ldyBQcmludGVyKGRhdGEpOwotCWFzc2VydFRydWUoImdldFByaW50ZXJEYXRhICE9IGRhdGEgdXNlZCBpbiBjb25zdHJ1Y3RvciIsCi0JCQlkYXRhID09IHByaW50ZXIuZ2V0UHJpbnRlckRhdGEoKSk7Ci0JcHJpbnRlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbnRlckxpc3QoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IFByaW50ZXIuZ2V0RGVmYXVsdFByaW50ZXJEYXRhKCk7Ci0JaWYgKGRhdGEgPT0gbnVsbCkgewotCQkvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHByaW50ZXJzLCB2ZXJpZnkgdGhhdCB0aGUKLQkJICogcHJpbnRlciBsaXN0IGlzIGVtcHR5LgotCQkgKi8KLQkJUHJpbnRlckRhdGEgbGlzdFtdID0gUHJpbnRlci5nZXRQcmludGVyTGlzdCgpOwotCQlhc3NlcnRUcnVlKCJwcmludGVyIGxpc3QgY29udGFpbnMgaXRlbXMgZXZlbiB0aG91Z2ggdGhlcmUgYXJlIG5vIHByaW50ZXJzIiwKLQkJCQlsaXN0Lmxlbmd0aCA9PSAwKTsKLQl9IGVsc2UgewotCQkvKiBJZiB0aGVyZSBpcyBhdCBsZWFzdCBhIGRlZmF1bHQgcHJpbnRlciwgdmVyaWZ5Ci0JCSAqIHRoYXQgdGhlIHByaW50ZXIgbGlzdCBpcyBub3QgZW1wdHkuCi0JCSAqLwotCQlQcmludGVyRGF0YSBsaXN0W10gPSBQcmludGVyLmdldFByaW50ZXJMaXN0KCk7Ci0JCWFzc2VydFRydWUoInByaW50ZXIgbGlzdCBpcyBlbXB0eSIsIGxpc3QubGVuZ3RoID4gMCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RhcnRQYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zdGFydFBhZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NhbmNlbEpvYiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lbmRKb2IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2VuZFBhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RFBJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREZWZhdWx0UHJpbnRlckRhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByaW50ZXJEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmludGVyTGlzdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3N0YXJ0UGFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NhbmNlbEpvYiIpKSB0ZXN0X2NhbmNlbEpvYigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9lbmRKb2IiKSkgdGVzdF9lbmRKb2IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VuZFBhZ2UiKSkgdGVzdF9lbmRQYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREUEkiKSkgdGVzdF9nZXREUEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSIpKSB0ZXN0X2dldERlZmF1bHRQcmludGVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJpbnRlckRhdGEiKSkgdGVzdF9nZXRQcmludGVyRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJpbnRlckxpc3QiKSkgdGVzdF9nZXRQcmludGVyTGlzdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3N0YXJ0Sm9iTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zdGFydEpvYkxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdGFydFBhZ2UiKSkgdGVzdF9zdGFydFBhZ2UoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3Y2NkOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3ByaW50aW5nX1ByaW50ZXJEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC5wcmludGluZy5QcmludGVyRGF0YQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXJEYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJpbnRpbmdfUHJpbnRlckRhdGEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCW5ldyBQcmludGVyRGF0YSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX1N0cmluZygpIHsKLQluZXcgUHJpbnRlckRhdGEoImhlbGxvIiwgInRoZXJlIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JUHJpbnRlckRhdGEgZGF0YSA9IG5ldyBQcmludGVyRGF0YSgpOwotCWFzc2VydE5vdE51bGwoZGF0YS50b1N0cmluZygpKTsKLQlhc3NlcnRUcnVlKGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF9wcmludGluZ19QcmludGVyRGF0YSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3IiKSkgdGVzdF9Db25zdHJ1Y3RvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfQ29uc3RydWN0b3JMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF9wcm9ncmFtX1Byb2dyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0OTY1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3RfcHJvZ3JhbV9Qcm9ncmFtIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCURpc3BsYXkuZ2V0RGVmYXVsdCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCgpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCWFzc2VydFRydWUocHJvZ3JhbS5lcXVhbHMocHJvZ3JhbSkpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZygpIHsKLQkKLQkvLyBUaGlzIHRlc3QgaXMgaW5jb21wbGV0ZSBiZWNhdXNlIGEgdHJ1ZSB0ZXN0IG9mIGV4ZWN1dGUgd291bGQgb3BlbgotCS8vIGFuIGFwcGxpY2F0aW9uIHRoYXQgY2Fubm90IGJlIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkLgotCQotCXRyeSB7Ci0JCVByb2dyYW1bXSBwcm9ncmFtcyA9IFByb2dyYW0uZ2V0UHJvZ3JhbXMoKTsKLQkJaWYgKHByb2dyYW1zICE9IG51bGwgJiYgcHJvZ3JhbXMubGVuZ3RoID4gMCkgewotCi0JCQkvLyBDYW5ub3QgdGVzdCBlbXB0eSBzdHJpbmcgYXJndW1lbnQgYmVjYXVzZSBpdCBtYXkgbGF1bmNoIHNvbWV0aGluZy4KLQkJCS8vYm9vbGVhbiByZXN1bHQgPSBwcm9ncmFtc1swXS5leGVjdXRlKCIiKTsKLQkJCS8vYXNzZXJ0RmFsc2UocmVzdWx0KTsKLQkJCQotCQkJLy8gdGVzdCBudWxsIGFyZ3VtZW50Ci0JCQkJCi0JCQlwcm9ncmFtc1swXS5leGVjdXRlKG51bGwpOwotCQkJZmFpbCgiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiKTsKLQkJfQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWFzc2VydEVxdWFscygiRmFpbGVkIHRvIHRocm93IEVSUk9SX05VTExfQVJHVU1FTlQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgYSBudWxsIHJlc3VsdCBpcyBhbGxvd2VkLgotCQl9Ci0JfQotCQotCXRyeSB7Ci0JCVByb2dyYW0uZmluZFByb2dyYW0obnVsbCk7Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlmYWlsKCJJbnZhbGlkIEV4Y2VwdGlvbiB0aHJvd24gb2YgdHlwZSAiK2UuZ2V0Q2xhc3MoKSk7Ci0JfSBjYXRjaCAoRXJyb3IgZSkgewotCQlmYWlsKCJJbnZhbGlkIEVycm9yIHRocm93biBvZiB0eXBlICIrZS5nZXRDbGFzcygpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXh0ZW5zaW9ucygpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnROb3ROdWxsKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlRGF0YSgpIHsKLQlTdHJpbmdbXSBleHRlbnNpb25zID0gUHJvZ3JhbS5nZXRFeHRlbnNpb25zKCk7Ci0JLy8gTm8gYXNzZXJ0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZG9jIGRvZXMgbm90IGd1YXJhbnRlZSBhIG5vbi1udWxsIHJlc3VsdC4KLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9ncmFtIHByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbnNbaV0pOwotCQkJaWYgKHByb2dyYW0gIT0gbnVsbCkgewotCQkJCXByb2dyYW0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJLy8gTm90aGluZyB0byBkby4KLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSBQcm9ncmFtLmdldEV4dGVuc2lvbnMoKTsKLQkvLyBObyBhc3NlcnRpb24gaGVyZSBiZWNhdXNlIHRoZSBkb2MgZG9lcyBub3QgZ3VhcmFudGVlIGEgbm9uLW51bGwgcmVzdWx0LgotCWlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2dyYW0gcHJvZ3JhbSA9IFByb2dyYW0uZmluZFByb2dyYW0oZXh0ZW5zaW9uc1tpXSk7Ci0JCQlpZiAocHJvZ3JhbSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwcm9ncmFtLmdldE5hbWUoKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJQcm9ncmFtIGhhcyBudWxsIG5hbWUiLG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByb2dyYW1zKCkgewotCVByb2dyYW1bXSBwcm9ncmFtcyA9IFByb2dyYW0uZ2V0UHJvZ3JhbXMoKTsKLQkKLQkvLyBUaGUgcmVzdWx0IGlzIG5vdCB3ZWxsLWRvY3VtZW50ZWQsIGJ1dCBpdCBzaG91bGQgCi0JLy8gYmUgbm9uLW51bGwgYW5kIGNvbnRhaW4gbm8gbnVsbCBlbnRyaWVzLgotCQotCWFzc2VydE5vdE51bGwocHJvZ3JhbXMpOwotCQotCUhhc2h0YWJsZSBsb29rdXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHByb2dyYW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQotCQkvLyB0ZXN0IG5vbi1udWxsIGVudHJ5Ci0JCWFzc2VydE5vdE51bGwocHJvZ3JhbXNbaV0pOwotCQkKLQkJLy8gdGVzdCB1bmlxdWUgaGFzaCBjb2RlCi0JCWludCBoYXNoQ29kZSA9IHByb2dyYW1zW2ldLmhhc2hDb2RlKCk7Ci0JCUludGVnZXIga2V5ID0gbmV3IEludGVnZXIoaGFzaENvZGUpOwotCQlpZiAobG9va3VwLmNvbnRhaW5zKGtleSkpIHsKLQkJCWZhaWwoIkR1cGxpY2F0ZSBoYXNoIGNvZGUgZm9yICIrcHJvZ3JhbXNbaV0rIiAoc2FtZSBhcyAiK2xvb2t1cC5nZXQoa2V5KSsiKSIpOwotCQl9Ci0JCWVsc2UgewotCQkJbG9va3VwLnB1dChrZXkscHJvZ3JhbXNbaV0pOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2dldFByb2dyYW1zCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0KLQkvLyBUaGlzIHRlc3QgaXMgaW5jb21wbGV0ZSBiZWNhdXNlIGEgdHJ1ZSB0ZXN0IG9mIGxhdW5jaCB3b3VsZCBvcGVuCi0JLy8gYW4gYXBwbGljYXRpb24gdGhhdCBjYW5ub3QgYmUgcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQuCi0JCi0JLy8gQ2Fubm90IHRlc3QgZW1wdHkgc3RyaW5nIGFyZ3VtZW50IGJlY2F1c2UgaXQgbWF5IGxhdW5jaCBzb21ldGhpbmcuCi0JCi0JLy8gdGVzdCBudWxsIGFyZ3VtZW50Ci0JCi0JdHJ5IHsKLQkJUHJvZ3JhbS5sYXVuY2gobnVsbCk7Ci0JCWZhaWwoIkZhaWxlZCB0byB0aHJvdyBFUlJPUl9OVUxMX0FSR1VNRU5UIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKCJGYWlsZWQgdG8gdGhyb3cgRVJST1JfTlVMTF9BUkdVTUVOVCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfdG9TdHJpbmcoKSB7Ci0JU3RyaW5nW10gZXh0ZW5zaW9ucyA9IFByb2dyYW0uZ2V0RXh0ZW5zaW9ucygpOwotCS8vIE5vIGFzc2VydGlvbiBoZXJlIGJlY2F1c2UgdGhlIGRvYyBkb2VzIG5vdCBndWFyYW50ZWUgYSBub24tbnVsbCByZXN1bHQuCi0JaWYgKGV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQlmb3IgKGludCBpPTA7IGk8ZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJUHJvZ3JhbSBwcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb25zW2ldKTsKLQkJCWlmIChwcm9ncmFtICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3RyaW5nID0gcHJvZ3JhbS50b1N0cmluZygpOwotCQkJCWFzc2VydE5vdE51bGwoInRvU3RyaW5nIHJldHVybmVkIG51bGwiLHN0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3Byb2dyYW1fUHJvZ3JhbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZXhlY3V0ZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHRlbnNpb25zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9maW5kUHJvZ3JhbUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE5hbWUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByb2dyYW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF1bmNoTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2V4ZWN1dGVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmluZFByb2dyYW1MamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2ZpbmRQcm9ncmFtTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4dGVuc2lvbnMiKSkgdGVzdF9nZXRFeHRlbnNpb25zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZURhdGEiKSkgdGVzdF9nZXRJbWFnZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE5hbWUiKSkgdGVzdF9nZXROYW1lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcm9ncmFtcyIpKSB0ZXN0X2dldFByb2dyYW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYXNoQ29kZSIpKSB0ZXN0X2hhc2hDb2RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXVuY2hMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2xhdW5jaExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90b1N0cmluZyIpKSB0ZXN0X3RvU3RyaW5nKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDc5YzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b24KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1CdXR0b24gYnV0dG9uOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQlzZXRXaWRnZXQoYnV0dG9uKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIFRlc3QgQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLQluZXcgQnV0dG9uKHNoZWxsLCBTV1QuTlVMTCk7Ci0KLQluZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0KLQluZXcgQnV0dG9uKHNoZWxsLCBTV1QuQ0hFQ0spOwotCi0JbmV3IEJ1dHRvbihzaGVsbCwgU1dULlRPR0dMRSk7Ci0KLQluZXcgQnV0dG9uKHNoZWxsLCBTV1QuQVJST1cpOwotCi0JbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0ggfCBTV1QuQ0hFQ0spOwotCi0JdHJ5IHsKLQkJbmV3IEJ1dHRvbihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlidXR0b24ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGxpc3RlbmVyQ2FsbGVkKTsKLQkKLQl0cnkgewotCQlidXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlidXR0b24ubm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JYnV0dG9uLmNvbXB1dGVTaXplKDAsIDApOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDAsIDAsIGZhbHNlKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgtMTAsIC0xMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoLTEwLCAtMTAsIGZhbHNlKTsKLQotCWJ1dHRvbi5jb21wdXRlU2l6ZSgxMCwgMTApOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwLCAxMCwgZmFsc2UpOwotCi0JYnV0dG9uLmNvbXB1dGVTaXplKDEwMDAwLCAxMDAwMCk7Ci0KLQlidXR0b24uY29tcHV0ZVNpemUoMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEFsaWdubWVudEkoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTZWxlY3Rpb25aCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsaWdubWVudEkoKSB7Ci0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5MRUZULCBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydEVxdWFscyhTV1QuUklHSFQsIGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlidXR0b24uc2V0QWxpZ25tZW50KFNXVC5DRU5URVIpOwotCWFzc2VydEVxdWFscyhTV1QuQ0VOVEVSLCBidXR0b24uZ2V0QWxpZ25tZW50KCkpOwotCi0JYnV0dG9uLnNldEFsaWdubWVudChTV1QuVVApOyAvLyBiYWQgdmFsdWUgZm9yIHB1c2ggYnV0dG9uCi0JYXNzZXJ0VHJ1ZShTV1QuVVAgIT0gYnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCUJ1dHRvbiBhcnJvd0J1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0JYXJyb3dCdXR0b24uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRFcXVhbHMoU1dULkxFRlQsIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydEVxdWFscyhTV1QuUklHSFQsIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuVVApOwotCWFzc2VydEVxdWFscyhTV1QuVVAsIGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQotCWFycm93QnV0dG9uLnNldEFsaWdubWVudChTV1QuRE9XTik7Ci0JYXNzZXJ0RXF1YWxzKFNXVC5ET1dOLCBhcnJvd0J1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci0KLQlhcnJvd0J1dHRvbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7IC8vIGJhZCB2YWx1ZSBmb3IgYXJyb3cgYnV0dG9uCi0JYXNzZXJ0VHJ1ZShTV1QuQ0VOVEVSICE9IGFycm93QnV0dG9uLmdldEFsaWdubWVudCgpKTsKLQlhcnJvd0J1dHRvbi5kaXNwb3NlKCk7Ci0KLQlpbnQgYWxpZ25tZW50ID0gNTU7IC8vIHNvbWUgYm9ndXMgbnVtYmVyCi0JYnV0dG9uLnNldEFsaWdubWVudChhbGlnbm1lbnQpOwotCWFzc2VydFRydWUoYWxpZ25tZW50ICE9IGJ1dHRvbi5nZXRBbGlnbm1lbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0JQnV0dG9uIGJ0biA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5BUlJPVyk7Ci0JYnRuLnNldEZvY3VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCUltYWdlIGltYWdlID0gYnV0dG9uLmdldEltYWdlKCk7Ci0JYnV0dG9uLnNldEltYWdlKGltYWdlKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2UsIGJ1dHRvbi5nZXRJbWFnZSgpKTsKLQotCWJ1dHRvbi5zZXRJbWFnZShudWxsKTsKLQlhc3NlcnROdWxsKGJ1dHRvbi5nZXRJbWFnZSgpKTsKLQotCWltYWdlID0gbmV3IEltYWdlKHNoZWxsLmdldERpc3BsYXkoKSwgMTAsIDEwKTsKLQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgYnV0dG9uLmdldEltYWdlKCkpOwotCi0JYnV0dG9uLnNldEltYWdlKG51bGwpOwotCWltYWdlLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlidXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQlidXR0b24uc2V0SW1hZ2UobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGRpc3Bvc2VkIGltYWdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uWigpIHsKLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgY2hlY2sgYm94Ci0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULkNIRUNLKTsKLQlidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCWFzc2VydFRydWUoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQlidXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdCBzZXRTZWxlY3Rpb24gZm9yIGFycm93IGJ1dHRvbgotCUJ1dHRvbiBuZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuQVJST1cpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5kaXNwb3NlKCk7Ci0KLQkvLyB0ZXN0IHNldFNlbGVjdGlvbiBmb3IgcHVzaCBidXR0b24KLQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKCFuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciByYWRpbyBidXR0b24KLQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUkFESU8pOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShuZXdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCW5ld0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCWFzc2VydFRydWUoIW5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLmRpc3Bvc2UoKTsKLQotCS8vIHRlc3Qgc2V0U2VsZWN0aW9uIGZvciB0b2dnbGUgYnV0dG9uCi0JbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlRPR0dMRSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQlhc3NlcnRUcnVlKG5ld0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JbmV3QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghbmV3QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQluZXdCdXR0b24uZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgdGV4dCIsICJsZGthc2hkb2VodWZ3ZW92Y25oc2x2aHJlZ29qZWJja3JlYXZia3VoeGJpdWZ2Y3loYmlmdXlld3ZiaXVyZXlkLixjbW5lc2xqbGlld2pmY2h2YndvaWZpdmJld29yaXh1aWV1cnZiaXV2Ym9oZmxrc2plYWhmY2xpdXJlYWZneWNpYWJlbGl0dnlyd3RsaWN1eXJ0bGl1cmV5YmNsaXV5cmV1Y2V5dmJsaXVyZXliY3QiLCAiXG4gXG4gXGIgXHQgIiwgIlwwIn07Ci0JaW50IGdvb2RDYXNlcyA9IDQ7Ci0JZm9yIChpbnQgaT0wOyBpPGdvb2RDYXNlczsgaSsrKXsKLQkJYnV0dG9uLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJnb29kIGNhc2U6ICIgKyBTdHJpbmcudmFsdWVPZihpKSwgYnV0dG9uLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci0KLQl0cnkgewotCQlidXR0b24uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWJ1dHRvbi5zZXRUZXh0KCIiKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uWiIpKSB0ZXN0X3NldFNlbGVjdGlvblooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8vY3VzdG9tCi0KLXByb3RlY3RlZCB2b2lkIHNldFVwKGludCBzdHlsZSkgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgc3R5bGUpOwotICAgIHNldFdpZGdldChidXR0b24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULkNIRUNLKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuUkFESU8pOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBidXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5BUlJPVyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLS8vICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gcHVzaCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGJ1dHRvbnMKLS8vCSAgZGlmZmVyZW50IGFjcm9zcyBwbGF0Zm9ybXMKLS8vICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTMsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlJBRElPKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuVE9HR0xFKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEzLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotICAgIHRlYXJEb3duKCk7Ci0gICAgc2V0VXAoU1dULlRPR0dMRSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLSAgICB0ZWFyRG93bigpOwotICAgIC8vYXJyb3cgZG9lcyBub3QgcHJvZHVjZSBhIHRyYXZlcnNlIG1uZW1vbmljIG9uIHhwCi0gICAgc2V0VXAoU1dULkFSUk9XKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAyMCwgMjAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5DSEVDSyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5SQURJTyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1LCA1LCAxNSwgMTUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLSAgICB0ZWFyRG93bigpOwotICAgIHNldFVwKFNXVC5UT0dHTEUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzZXRVcChTV1QuQVJST1cpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoNSwgNSwgMTUsIDE1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yzg5YTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXMKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1DYW52YXMgY2FudmFzOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNhbnZhcyA9IG5ldyBDYW52YXMoc2hlbGwsIDApOwotCXN1cGVyLnNldFdpZGdldChjYW52YXMpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlpZiAoIWNhbnZhcy5pc0Rpc3Bvc2VkKCkpCi0JCWNhbnZhcy5kaXNwb3NlKCk7Ci0JY2FudmFzID0gKENhbnZhcyl3OwotCXN1cGVyLnNldFdpZGdldCh3KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCW5ldyBDYW52YXMobnVsbCwgU1dULk5PTkUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zY3JvbGxJSUlJSUlaKCkgewotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDAsIDAsIDUwLCA1MCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDAsIDAsIDUwLCA1MCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKDEwMDAwLCAxMDAwMCwgMTAwLCAxMDAsIDUwMCwgNTAwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgxMDAwMCwgMTAwMDAsIDEwMCwgMTAwLCA1MDAsIDUwMCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKC0xMDAsIC0xMDAsIDEwLCAxMCwgMzAsIDMwLCBmYWxzZSk7Ci0JY2FudmFzLnNjcm9sbCgtMTAwLCAtMTAwLCAxMCwgMTAsIDMwLCAzMCwgdHJ1ZSk7Ci0KLQljYW52YXMuc2Nyb2xsKDEwLCAxMCwgLTIwMCwgLTIwMCwgMTAwLCAxMDAsIGZhbHNlKTsKLQljYW52YXMuc2Nyb2xsKDEwLCAxMCwgLTIwMCwgLTIwMCwgMTAwLCAxMDAsIHRydWUpOwotCi0JY2FudmFzLnNjcm9sbCgxMDAsIDEwMCwgNTAsIDUwLCAtNTAsIC01MCwgZmFsc2UpOwotCWNhbnZhcy5zY3JvbGwoMTAwLCAxMDAsIDUwLCA1MCwgLTUwLCAtNTAsIHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0KCkgewotCWludCBudW1iZXIgPSA1OwotCUNhcmV0W10gY2FyZXRzID0gbmV3IENhcmV0W251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljYXJldHNbaV0gPSBuZXcgQ2FyZXQoY2FudmFzLCBTV1QuTk9ORSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY2FudmFzLnNldENhcmV0KGNhcmV0c1tpXSk7Ci0JCWFzc2VydEVxdWFscygiQ2FyZXQgIyAiICsgaSArICJub3Qgc2V0IHByb3Blcmx5IiwgY2FudmFzLmdldENhcmV0KCksIGNhcmV0c1tpXSk7Ci0JfQotCi0JY2FudmFzLnNldENhcmV0KG51bGwpOwotCWFzc2VydE51bGwoIkNhcmV0IHNob3VsZCBiZSBudWxsIiAsIGNhbnZhcy5nZXRDYXJldCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCUZvbnREYXRhIGZvbnREYXRhID0gY2FudmFzLmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGNhbnZhcy5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgOCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JY2FudmFzLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY2FudmFzLmdldEZvbnQoKS5lcXVhbHMoZm9udCkpOwotCWNhbnZhcy5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDYXJldCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2Nyb2xsSUlJSUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXQiKSkgdGVzdF9nZXRDYXJldCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2Nyb2xsSUlJSUlJWiIpKSB0ZXN0X3Njcm9sbElJSUlJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldENhcmV0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhcmV0IikpIHRlc3Rfc2V0Q2FyZXRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tKi8KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDEwLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDIwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiMmE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhcmV0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYXJldAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotQ2FudmFzIGNhbnZhczsKLUNhcmV0IGNhcmV0OwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYXJldChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY2FudmFzID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5VTEwpOwotCWNhcmV0ID0gbmV3IENhcmV0KGNhbnZhcywgU1dULk5VTEwpOwotCXNldFdpZGdldChjYXJldCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzSSgpIHsKLQl0cnkgewotCQluZXcgQ2FyZXQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKDAsMCwzMCwzMCk7Ci0JY2FyZXQuc2V0Qm91bmRzKHJlY3QpOwotCWFzc2VydFRydWUoY2FyZXQuZ2V0Qm91bmRzKCkuZXF1YWxzKHJlY3QpKTsKLQotCXJlY3QgPSBuZXcgUmVjdGFuZ2xlKDAsMCwzMCwzMCk7Ci0JY2FyZXQuc2V0Qm91bmRzKHJlY3QpOwotCWFzc2VydFRydWUoIWNhcmV0LmdldEJvdW5kcygpLmVxdWFscyhuZXcgUmVjdGFuZ2xlICgwLDAsNjAsNzApKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2F0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyhjYW52YXMsIGNhcmV0LmdldFBhcmVudCgpKTsKLQotCWFzc2VydFRydWUoY2FyZXQuZ2V0RGlzcGxheSgpPT1zaGVsbC5nZXREaXNwbGF5KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNpemUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFNpemUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCWNhcmV0LnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSghY2FyZXQuaXNWaXNpYmxlKCkpOyAvL2JlY2F1c2UgdGhlIHNoZWxsIGlzIG5vdCB2aXNpYmxlCi0KLQljYXJldC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjYXJldC5pc1Zpc2libGUoKSk7Ci0KLQljYXJldC5zZXRWaXNpYmxlKHRydWUpOwotCWNhbnZhcy5zZXRWaXNpYmxlKHRydWUpOwotCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjYXJldC5nZXRWaXNpYmxlKCkgPT0gdHJ1ZSk7Ci0JY2FudmFzLnNldFZpc2libGUoZmFsc2UpOwotCWlmIChmQ2hlY2tWaXNpYmlsaXR5KSB7Ci0JCWFzc2VydFRydWUoIWNhcmV0LmdldFZpc2libGUoKSk7Ci0JfQotCi0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JY2FudmFzLnNldFZpc2libGUoZmFsc2UpOwotCWNhcmV0LnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIWNhcmV0LmdldFZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQljYXJldC5zZXRCb3VuZHMoMCwgMCwgMzAsIDMwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQljYXJldC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgwLDAsMzAsMzApKTsKLQotCXRyeSB7Ci0JCWNhcmV0LnNldEJvdW5kcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYm91bmRzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRm9udCBmb250ID0gY2FyZXQuZ2V0Rm9udCgpOwotCWNhcmV0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGNhcmV0LmdldEZvbnQoKSk7Ci0JY2FyZXQuc2V0Rm9udChudWxsKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoY2FyZXQuZ2V0RGlzcGxheSgpLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQljYXJldC5zZXRGb250KGZvbnQpOwotCWFzc2VydEVxdWFscyhmb250LCBjYXJldC5nZXRGb250KCkpOwotCi0JY2FyZXQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQl0cnkgewotCQljYXJldC5zZXRGb250KGZvbnQpOwotCQljYXJldC5zZXRGb250KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCUltYWdlIGltYWdlID0gY2FyZXQuZ2V0SW1hZ2UoKTsKLQljYXJldC5zZXRJbWFnZShpbWFnZSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlLCBjYXJldC5nZXRJbWFnZSgpKTsKLQotCWNhcmV0LnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoY2FyZXQuZ2V0SW1hZ2UoKSk7Ci0KLQlpbWFnZSA9IG5ldyBJbWFnZShzaGVsbC5nZXREaXNwbGF5KCksIDEwLCAxMCk7Ci0JY2FyZXQuc2V0SW1hZ2UoaW1hZ2UpOwotCWFzc2VydEVxdWFscyhpbWFnZSwgY2FyZXQuZ2V0SW1hZ2UoKSk7Ci0KLQljYXJldC5zZXRJbWFnZShudWxsKTsKLQlpbWFnZS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY2FyZXQuc2V0SW1hZ2UoaW1hZ2UpOwotCQljYXJldC5zZXRJbWFnZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgaW1hZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhdGlvbklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMb2NhdGlvbklJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNpemVJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCWNhcmV0LnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiQ2FyZXQgc2hvdWxkIGJlIHZpc2libGUiLCBjYXJldC5nZXRWaXNpYmxlKCk9PXRydWUpOwotCi0JY2FyZXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiQ2FyZXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwgY2FyZXQuZ2V0VmlzaWJsZSgpPT1mYWxzZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FyZXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFZpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0Lm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ2FudmFzSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlIikpIHRlc3RfZ2V0SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uIikpIHRlc3RfZ2V0TG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZpc2libGUiKSkgdGVzdF9nZXRWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Zpc2libGUiKSkgdGVzdF9pc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0lJSUkiKSkgdGVzdF9zZXRCb3VuZHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbklJIikpIHRlc3Rfc2V0TG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplSUkiKSkgdGVzdF9zZXRTaXplSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFZpc2libGVaIikpIHRlc3Rfc2V0VmlzaWJsZVooKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db2xvckRpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTBlM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbG9yRGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1Db2xvckRpYWxvZyBjb2xvckRpYWxvZzsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGNvbG9yRGlhbG9nKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0JbmV3IENvbG9yRGlhbG9nKHNoZWxsKTsKLQkKLQl0cnkgewotCQluZXcgQ29sb3JEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JbmV3IENvbG9yRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCi0JdHJ5IHsKLQkJbmV3IENvbG9yRGlhbG9nKG51bGwsIFNXVC5OVUxMKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJHQigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X29wZW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQlSR0IgcmdiID0gbmV3IFJHQigwLCAwLCAwKTsKLQotCWFzc2VydFRydWUoIjphOiIsIGNvbG9yRGlhbG9nLmdldFJHQigpID09IG51bGwpOwkKLQkJCi0JY29sb3JEaWFsb2cuc2V0UkdCKHJnYik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29sb3JEaWFsb2cuZ2V0UkdCKCkgPT0gcmdiKTsKLQotCWNvbG9yRGlhbG9nLnNldFJHQihudWxsKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBjb2xvckRpYWxvZy5nZXRSR0IoKSA9PSBudWxsKTsJCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29sb3JEaWFsb2coKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UkdCIikpIHRlc3RfZ2V0UkdCKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UkdCTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SR0IiKSkgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbWJvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1YjIwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibwotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotCUNvbWJvIGNvbWJvOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21ibyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwsIDApOwotCXNldFdpZGdldChjb21ibyk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQljb21ibyA9IG5ldyBDb21ibyhudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7U1dULkRST1BfRE9XTiwgU1dULlNJTVBMRX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21ibyA9IG5ldyBDb21ibyhzaGVsbCwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCI6YToiICsgU3RyaW5nLnZhbHVlT2YoaSksIChjb21iby5nZXRTdHlsZSgpICYgY2FzZXNbaV0pID09IGNhc2VzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uYWRkKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8uYWRkKCIiKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIG5ldyBTdHJpbmdbXXsiIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBuZXcgU3RyaW5nW117IiIsICIifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci0JY29tYm8uYWRkKCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBuZXcgU3RyaW5nW117IiIsICIiLCAiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQl0cnkgewotCQljb21iby5hZGQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5hZGQoInN0cmluZyIsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLmFkZCgic3RyaW5nMCIsIDApOwotCXRyeSB7Ci0JCWNvbWJvLmFkZCgic3RyaW5nMSIsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA+IHNpemUiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWNvbWJvLmFkZCgiZnJlZCIsIDApOwotCWFzc2VydEVxdWFscygiZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiLCAwKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQgZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIpOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkIGZyZWQiLCBuZXcgU3RyaW5nW117ImZyZWQiLCAiZnJlZCIsICJmcmVkIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLnJlbW92ZUFsbCgpOwotCQotCWludCBudW1iZXIgPSAzOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5hZGQoImZyZWQiLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygiZnJlZDAgZnJlZDEgZnJlZDIgZnJlZCIsIG5ldyBTdHJpbmdbXXsiZnJlZDAiLCAiZnJlZDEiLCAiZnJlZDIiLCAiZnJlZCJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCW51bWJlciA9IDM7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDEpOwotCWFzc2VydEVxdWFscygiZnJlZDAgZnJlZCBmcmVkMSBmcmVkMiIsIG5ldyBTdHJpbmdbXXsiZnJlZDAiLCAiZnJlZCIsICJmcmVkMSIsICJmcmVkMiJ9LCBjb21iby5nZXRJdGVtcygpKTsKLQljb21iby5hZGQoImZyZWQiLCAwKTsKLQlhc3NlcnRFcXVhbHMoImZyZWQgZnJlZDAgZnJlZCBmcmVkMSBmcmVkMiIsIG5ldyBTdHJpbmdbXXsiZnJlZCIsICJmcmVkMCIsICJmcmVkIiwgImZyZWQxIiwgImZyZWQyIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotCWNvbWJvLmFkZCgiZnJlZCIsIDQpOwotCWFzc2VydEVxdWFscygiZnJlZCBmcmVkMCBmcmVkIGZyZWQxIGZyZWQgZnJlZDIiLCBuZXcgU3RyaW5nW117ImZyZWQiLCAiZnJlZDAiLCAiZnJlZCIsICJmcmVkMSIsICJmcmVkIiwgImZyZWQyIn0sIGNvbWJvLmdldEl0ZW1zKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQl0cnkgewotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQkvLyB0ZXN0IHdoZXRoZXIgYWxsIGNvbnRlbnQgbW9kaWZ5aW5nIEFQSSBtZXRob2RzIHNlbmQgYSBNb2RpZnkgZXZlbnQJCi0JY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JY29tYm8uc2V0VGV4dCgibmV3IHRleHQiKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCi0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsJCi0JY29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCS8vIGNhdXNlIHRvIGNhbGwgdGhlIGxpc3RlbmVyLiAKLQljb21iby5zZXRUZXh0KCJsaW5lIik7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLQlleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQljb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JY29tYm8uc2VsZWN0KDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQljb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY2xlYXJTZWxlY3Rpb24oKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCAwKSkpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjpiOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgMCkpKTsgIC8vbm90aGluZyBpcyBzZWxlY3RlZAotCWNvbWJvLnNldFRleHQoInNvbWUgdGV4dCIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgNSkpOwotCWFzc2VydFRydWUoIjpjOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMCwgNSkpKTsKLQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbWJvLmdldFNlbGVjdGlvbigpLng9PWNvbWJvLmdldFNlbGVjdGlvbigpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvcHkoKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5jb3B5KCk7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLDApKTsKLQljb21iby5wYXN0ZSgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjIzMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQljb21iby5zZXRUZXh0KCIxMjM0NTYiKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDEsMykpOwotCWNvbWJvLmN1dCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoIjE0NTYiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RBbGwoKSB7Ci0JY29tYm8uYWRkKCIxMjMiKTsKLQljb21iby5hZGQoIjQ1NiIpOwotCWNvbWJvLmFkZCgiNzg5Iik7Ci0JY29tYm8uc2VsZWN0KDApOwotCWNvbWJvLnNlbGVjdCgyKTsKLQljb21iby5kZXNlbGVjdEFsbCgpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PSAtMSk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SSgpIHsKLQkvLyBpbmRpY2VzIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZAotCVN0cmluZ1tdIGl0ZW1zID0geyJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiJ9OwotCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQljb21iby5zZWxlY3QoMSk7Ci0JY29tYm8uZGVzZWxlY3QoMTApOwotCWFzc2VydEVxdWFscygxLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQljb21iby5kZXNlbGVjdCgyKTsKLQotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5zZWxlY3QoaSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPT1pKTsKLQkJY29tYm8uZGVzZWxlY3QoaSk7Ci0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPT0tMSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENoaWxkcmVuKCkgewotCS8vIENvbWJvIGNhbm5vdCBoYXZlIGNoaWxkcmVuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSBpKTsKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCX0KLQlhc3NlcnRUcnVlKCI6YWE6IiwgY29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gbnVtYmVyKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpID09IG51bWJlci1pKTsKLQkJY29tYm8ucmVtb3ZlKDApOwotCX0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCBjb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCWNvbWJvLmdldEl0ZW1IZWlnaHQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQl0cnkgewotCQljb21iby5nZXRJdGVtKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZShjb21iby5nZXRJdGVtKGkpLmVxdWFscygiZnJlZCIgKyBpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JY29tYm8uYWRkKCIxIik7Ci0JY29tYm8uYWRkKCIyIik7Ci0JY29tYm8uYWRkKCIzIik7Ci0JU3RyaW5nW10gaXRlbXMgPSBjb21iby5nZXRJdGVtcygpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zLmxlbmd0aD09Myk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgaXRlbXNbMF0uZXF1YWxzKCIxIikpOwotCWFzc2VydFRydWUoIjphOiIsIGl0ZW1zWzFdLmVxdWFscygiMiIpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBpdGVtc1syXS5lcXVhbHMoIjMiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHNldE9yaWVudGF0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWNvbWJvLnNldFRleHQoIjEyMzQ1NiIpOwotCWNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMSwzKSk7Ci0JY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgxLDMpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLnNlbGVjdChpKTsKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWFzc2VydEVxdWFscygtMSwgY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5zZWxlY3QoaSk7Ci0JCWNvbWJvLmRlc2VsZWN0KGkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCVN0cmluZ1tdIGNhc2VzID0geyIiLCAiZnJlZCIsICJmcmVkZnJlZCJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBTdHJpbmcudmFsdWVPZihpKSwgY2FzZXNbaV0uZXF1YWxzKGNvbWJvLmdldFRleHQoKSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SGVpZ2h0KCkgewotCWNvbWJvLmdldFRleHRIZWlnaHQoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0TGltaXQoKSB7Ci0JY29tYm8uc2V0VGV4dExpbWl0KDMpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFRleHRMaW1pdCgpPT0zKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9oYXNGb2N1cygpIHsKLQkvLyBub3QgcHVibGljIGFwaQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpIHsKLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOwotCWNvbWJvLnJlbW92ZSgiZnJlZDMiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSkpOwotCWFzc2VydEVxdWFscygtMSwgY29tYm8uaW5kZXhPZigiZnJlZDMiKSk7Ci0JZm9yIChpbnQgaSA9IDQ7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5yZW1vdmUoMik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpLCBjb21iby5pbmRleE9mKCJmcmVkIiArIGkpKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGNvbWJvLmluZGV4T2YoImZyZWQyIikpOwotCWZvciAoaW50IGkgPSAzOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscyhpIC0gMSwgY29tYm8uaW5kZXhPZigiZnJlZCIgKyBpKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5pbmRleE9mKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKC0xLCBjb21iby5pbmRleE9mKCJzdHJpbmcwIiwgLTEpKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQkKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgMCkgPT0gaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgaSArIDEpID09IC0xKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgMCkgPT0gaSk7Ci0JZm9yIChpbnQgaSA9IDM7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgMykgPT0gaSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIGNvbWJvLmluZGV4T2YoImZyZWQiICsgaSwgaSkgPT0gaSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFzdGUoKSB7Ci0JY29tYm8uc2V0VGV4dCgiMTIzNDU2Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgxLDMpKTsKLQljb21iby5jdXQoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKCIxNDU2IikpOwotCWNvbWJvLnBhc3RlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgY29tYm8uZ2V0VGV4dCgpLmVxdWFscygiMTIzNDU2IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQljb21iby5hZGQoIjEiKTsKLQljb21iby5hZGQoIjIiKTsKLQljb21iby5yZW1vdmVBbGwoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRJdGVtcygpLmxlbmd0aD09MCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSSgpIHsKLQl0cnkgewotCQljb21iby5yZW1vdmUoMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8ucmVtb3ZlKDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLmFkZCgic3RyaW5nMCIpOwotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCi0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiICsgaSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaXRlbXMiLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOyAgLy8gYWxsIGl0ZW1zIHRoZSBzYW1lCi0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaXRlbXMiLCBudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgwKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsgLy8gZGlmZmVyZW50IGl0ZW1zCi0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgbnVtYmVyIC0gaSwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCQljb21iby5zZWxlY3QoMCk7Ci0JCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIDAsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQljb21iby5yZW1vdmUoMCk7Ci0JCWlmIChTd3RKdW5pdC5pc1dpbmRvd3MgfHwgU3d0SnVuaXQuaXNHVEsgfHwgU3d0SnVuaXQuaXNDYXJib24pIHsKLQkJCS8vIFRoZSBiZWhhdmlvciBvbiBXaW5kb3dzIGFuZCBHVEsgd2hlbiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyByZW1vdmVkCi0JCQkvLyBpcyB0byBzaW1wbHkgc2F5IHRoYXQgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLgotCQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQl9IGVsc2UgewotCQkJLy8gVGhlIGJlaGF2aW9yIG9uIG90aGVyIHBsYXRmb3JtcyB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHJlbW92ZWQKLQkJCS8vIGlzIHRvIHNlbGVjdCB0aGUgaXRlbSB0aGF0IGlzIG5vdyBhdCB0aGUgc2FtZSBpbmRleCwgYW5kIHNlbmQgYQotCQkJLy8gc2VsZWN0aW9uIGV2ZW50LiBJZiB0aGVyZSBpcyBubyBpdGVtIGF0IHRoZSBzZWxlY3RlZCBpbmRleCwgdGhlbgotCQkJLy8gdGhlIHBsYXRmb3JtIHNheXMgdGhhdCBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0JCQlpZiAoaSA8IG51bWJlciAtIDEpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImluZGV4ICIgKyBpLCAwLCBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbmRleCAiICsgaSwgLTEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIiArIGkpOyAvLyBkaWZmZXJlbnQgaXRlbXMKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaW5kZXggIiArIGksIG51bWJlciAtIGksIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQkJY29tYm8ucmVtb3ZlKG51bWJlci1pLTEpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGNvbWJvLmdldEl0ZW1Db3VudCgpKTsKLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWNvbWJvLnJlbW92ZSgwLCAyKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0JY29tYm8ucmVtb3ZlKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0KLQljb21iby5yZW1vdmVBbGwoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCX0KLQljb21iby5yZW1vdmUoMywgMik7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgY29tYm8uZ2V0SXRlbUNvdW50KCkpOwotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQljb21iby5hZGQoImZyZWQiKTsKLQl9Ci0KLQl0cnkgewotCQljb21iby5yZW1vdmUoMiwgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQljb21iby5yZW1vdmUoLTEsIG51bWJlci0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RhcnQgaW5kZXggPCAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgiZnJlZCIgKyBpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQljb21iby5hZGQoImZyZWQiKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhudW1iZXIgLSBpLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWNvbWJvLnJlbW92ZSgiZnJlZCIpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIpOwotCXRyeSB7Ci0JCWNvbWJvLnJlbW92ZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl0cnkgewkKLQkJY29tYm8ucmVtb3ZlKCJmcmVkIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW0gbm90IGZvdW5kIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCBjb21iby5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTW9kaWZ5TGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEkoKSB7Ci0JY29tYm8uYWRkKCIxMjMiKTsKLQljb21iby5hZGQoIjQ1NiIpOwotCWNvbWJvLmFkZCgiNzg5Iik7Ci0JY29tYm8uc2VsZWN0KDEpOwotCWFzc2VydFRydWUoIjphOiIsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk9PSAxKTsKLQkKLQkvLyBpbmRpY2VzIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZAotCWNvbWJvLnNlbGVjdCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWNvbWJvLnNldEl0ZW0oMywgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgwLCAiZnJlZCIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQljb21iby5hZGQoInN0cmluZzAiKTsKLQl0cnkgewotCQljb21iby5zZXRJdGVtKDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbSgtMSwgIm5ldyB2YWx1ZSIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA8IDAiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWNvbWJvLmFkZCgiam9lIik7Ci0JY29tYm8uc2V0SXRlbSgwLCAiZnJlZCIpOwkKLQlhc3NlcnRUcnVlKCJmcmVkIiwgY29tYm8uZ2V0SXRlbSgwKS5lcXVhbHMoImZyZWQiKSk7Ci0KLQl0cnkgewotCQljb21iby5zZXRJdGVtKDQsICJmcmVkIik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29tYm8ucmVtb3ZlQWxsKCk7Ci0JaW50IG51bWJlciA9IDU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJY29tYm8uc2V0SXRlbShpLCAiZnJlZCIgKyBpKTsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIG5ldyBTdHJpbmdbXXsiZnJlZDAiLCAiZnJlZDEiLCAiZnJlZDIiLCAiZnJlZDMiLCAiZnJlZDQifSwgY29tYm8uZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JU3RyaW5nW11bXSBpdGVtcyA9IHt7fSwgeyIifSwgeyIiLCAiIn0sIHsiZnJlZCJ9LCB7ImZyZWQwIiwgImZyZWQwIn0sIHsiZnJlZCIsICJmcmVkIn19OwotCi0JZm9yIChpbnQgaSA9IDAgOyBpPCBpdGVtcy5sZW5ndGg7IGkrKyl7Ci0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKCI6YToiICsgaSwgaXRlbXNbaV0sIGNvbWJvLmdldEl0ZW1zKCkpO30KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRPcmllbnRhdGlvbkkoKSB7Ci0JY29tYm8uc2V0T3JpZW50YXRpb24oU1dULlJJR0hUX1RPX0xFRlQpOwotCWlmICgoY29tYm8uZ2V0U3R5bGUoKSAmIFNXVC5NSVJST1JFRCkgIT0gMCkgewotCQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRPcmllbnRhdGlvbigpPT1TV1QuUklHSFRfVE9fTEVGVCk7Ci0JfQotCWNvbWJvLnNldE9yaWVudGF0aW9uKFNXVC5MRUZUX1RPX1JJR0hUKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBjb21iby5nZXRPcmllbnRhdGlvbigpPT1TV1QuTEVGVF9UT19SSUdIVCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl0cnkgewotCQljb21iby5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvaW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludCBudW1iZXIgPSA1OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQljb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDUpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDAsIDApKSk7Ci0JY29tYm8uc2V0VGV4dCgic29tZSB0ZXh0Iik7Ci0JY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCA1KSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgY29tYm8uZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgwLCA1KSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMaW1pdEkoKSB7Ci0JdHJ5IHsKLQkJY29tYm8uc2V0VGV4dExpbWl0KDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaW1pdCA9PSAwIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbWJvLnNldFRleHRMaW1pdCgzKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBjb21iby5nZXRUZXh0TGltaXQoKT09Myk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWNvbWJvLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRleHQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJmcmVkIiwgImZyZWQwIn07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJY29tYm8uYWRkKCJmcmVkIik7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJY29tYm8uc2V0VGV4dChjYXNlc1tpXSk7Ci0JCWFzc2VydFRydWUoIjpiOiIgKyBpLCBjb21iby5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWNvbWJvLmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQljb21iby5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiArIGksIGNvbWJvLmdldFRleHQoKS5lcXVhbHMoY2FzZXNbaV0pKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tYm8oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dEhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dExpbWl0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE9yaWVudGF0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xlYXJTZWxlY3Rpb24iKSkgdGVzdF9jbGVhclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29weSIpKSB0ZXN0X2NvcHkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2N1dCIpKSB0ZXN0X2N1dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKSkgdGVzdF9nZXRJdGVtSGVpZ2h0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtcyIpKSB0ZXN0X2dldEl0ZW1zKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRPcmllbnRhdGlvbiIpKSB0ZXN0X2dldE9yaWVudGF0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbkluZGV4IikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRleHQiKSkgdGVzdF9nZXRUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0SGVpZ2h0IikpIHRlc3RfZ2V0VGV4dEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dExpbWl0IikpIHRlc3RfZ2V0VGV4dExpbWl0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYXN0ZSIpKSB0ZXN0X3Bhc3RlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVBbGwiKSkgdGVzdF9yZW1vdmVBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUkiKSkgdGVzdF9yZW1vdmVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVJSSIpKSB0ZXN0X3JlbW92ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEkiKSkgdGVzdF9zZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0U2VsZWN0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExpbWl0SSIpKSB0ZXN0X3NldFRleHRMaW1pdEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0lJSUkoKSB7Ci0JY29tYm8uc2V0Qm91bmRzKDEwLCAyMCwgMzAsIDQwKTsKLQkvLyBvbmx5IGNoZWNrIHgsIHksIGFuZCB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS54ID09IDEwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLnkgPT0gMjApOwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkud2lkdGggPT0gMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCWNvbWJvLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSk7Ci0JLy8gb25seSBjaGVjayB4LCB5LCBhbmQgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0Qm91bmRzKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZShjb21iby5nZXRCb3VuZHMoKS55ID09IDIwKTsKLQlhc3NlcnRUcnVlKGNvbWJvLmdldEJvdW5kcygpLndpZHRoID09IDMwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JY29tYm8uc2V0U2l6ZSgzMCwgNDApOwotCS8vIG9ubHkgY2hlY2sgdGhlIHdpZHRoIC0geW91IGNhbid0IHNldCB0aGUgaGVpZ2h0IG9mIGEgY29tYm8KLQlhc3NlcnRUcnVlKGNvbWJvLmdldFNpemUoKS54ID09IDMwKTsKLQotCWNvbWJvLnNldFNpemUoMzIsIDQzKTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JY29tYm8uc2V0U2l6ZShuZXcgUG9pbnQoMzAsIDQwKSk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzApOwotCi0JY29tYm8uc2V0Qm91bmRzKDMyLCA0MywgMzMsIDQ0KTsKLQkvLyBvbmx5IGNoZWNrIHRoZSB3aWR0aCAtIHlvdSBjYW4ndCBzZXQgdGhlIGhlaWdodCBvZiBhIGNvbWJvCi0JYXNzZXJ0VHJ1ZShjb21iby5nZXRTaXplKCkueCA9PSAzMyk7Ci0KLQljb21iby5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbWJvLnNldExvY2F0aW9uKDExLCAyMik7Ci0JY29tYm8uc2V0U2l6ZShuZXcgUG9pbnQoMzIsIDQzKSk7Ci0JLy8gb25seSBjaGVjayB0aGUgd2lkdGggLSB5b3UgY2FuJ3Qgc2V0IHRoZSBoZWlnaHQgb2YgYSBjb21ibwotCWFzc2VydFRydWUoY29tYm8uZ2V0U2l6ZSgpLnggPT0gMzIpOwotfQotCi1wcml2YXRlIHZvaWQgYWRkKCkgewotICAgIGNvbWJvLmFkZCgidGhpcyIpOwotICAgIGNvbWJvLmFkZCgiaXMiKTsKLSAgICBjb21iby5hZGQoIlNXVCIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoY29tYm8uZ2V0U2l6ZSgpLngtMTAsIDUsIDMwLCBjb21iby5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGFkZCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMywgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICAvL29uIGFycm93Ci0gICAgY29uc2lzdGVuY3lFdmVudChjb21iby5nZXRTaXplKCkueC0xMCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLSAgICAvL29uIHRleHQKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGEwODguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUgewotCi1Db21wb3NpdGUgY29tcG9zaXRlOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIDApOwotCXN1cGVyLnNldFdpZGdldChjb21wb3NpdGUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHtTV1QuSF9TQ1JPTEwsIFNXVC5WX1NDUk9MTCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hpbGRyZW4oKSB7Ci0JYXNzZXJ0RXF1YWxzKCI6YToiLCBuZXcgQ29udHJvbFtde30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQlDb21wb3NpdGUgYzEgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBuZXcgQ29udHJvbFtde2MxfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCi0JTGlzdCBjMiA9IG5ldyBMaXN0KGNvbXBvc2l0ZSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YzoiLCBuZXcgQ29udHJvbFtde2MxLCBjMn0sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQotCUJ1dHRvbiBjMyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCAwKTsKLQlhc3NlcnRFcXVhbHMoIjpkOiIsIG5ldyBDb250cm9sW117YzEsIGMyLCBjM30sIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpKTsKLQotCWMyLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIG5ldyBDb250cm9sW117YzEsIGMzfSwgY29tcG9zaXRlLmdldENoaWxkcmVuKCkpOwotCQotCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCWNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLQotCWFzc2VydEVxdWFscygiOmY6IiwgbmV3IENvbnRyb2xbXXt9LCBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGF5b3V0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUYWJMaXN0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXlvdXQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfbGF5b3V0WgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2xheW91dFooKSB7Ci0JLy8gdGVzdGVkIGluIHNwZWNpZmljIExheW91dCBjbGFzc2VzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc3BlY2lmaWMgTGF5b3V0IGNsYXNzZXMKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JQ29udHJvbFtdIHRhYmxpc3QgPSBuZXcgQ29udHJvbFtdIHtidXR0b24xLCBidXR0b24yfTsKLQljb21wb3NpdGUuc2V0VGFiTGlzdCh0YWJsaXN0KTsKLQlhc3NlcnRFcXVhbHModGFibGlzdCwgY29tcG9zaXRlLmdldFRhYkxpc3QoKSk7Ci0JYnV0dG9uMS5kaXNwb3NlKCk7Ci0JYnV0dG9uMi5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoaWxkcmVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMYXlvdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRhYkxpc3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGFiTGlzdCRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hpbGRyZW4iKSkgdGVzdF9nZXRDaGlsZHJlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGF5b3V0IikpIHRlc3RfZ2V0TGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUYWJMaXN0IikpIHRlc3RfZ2V0VGFiTGlzdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0IikpIHRlc3RfbGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9sYXlvdXRaIikpIHRlc3RfbGF5b3V0WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dCIpKSB0ZXN0X3NldExheW91dExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRhYkxpc3QkTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRUYWJMaXN0JExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotCQljb21wb3NpdGUuZGlzcG9zZSgpOwotCWNvbXBvc2l0ZSA9IChDb21wb3NpdGUpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNGRiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0JQ29udHJvbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY29udHJvbE1vdmVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkQ29udHJvbExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdmUsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuUmVzaXplLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKSB7Ci0JRm9jdXNMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBGb2N1c0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuRm9jdXNJbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Gb2N1c091dCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVGb2N1c0xpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JSGVscExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEhlbHBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGVscFJlcXVlc3RlZChIZWxwRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULkhlbHAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKCkgewotCUtleUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEtleUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULktleURvd24sIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuS2V5VXAsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCkgewotCU1vdXNlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRG93biwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZVVwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQlldmVudE9jY3VycmVkID0gZmFsc2U7Ci0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQlNb3VzZU1vdmVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkTW91c2VNb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VNb3ZlLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudE9jY3VycmVkKTsKLQljb250cm9sLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKSB7Ci0JTW91c2VUcmFja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7Ci0JCQlldmVudE9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JY29udHJvbC5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VFbnRlciwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCWNvbnRyb2wubm90aWZ5TGlzdGVuZXJzKFNXVC5Nb3VzZUV4aXQsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuTW91c2VIb3ZlciwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCkgewotCVBhaW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJZXZlbnRPY2N1cnJlZCA9IHRydWU7Ci0JCX0KLQl9OwotCWNvbnRyb2wuYWRkUGFpbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JZXZlbnRPY2N1cnJlZCA9IGZhbHNlOwotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JR0MgZ2MgPSBldmVudC5nYyA9IG5ldyBHQyhjb250cm9sKTsJCi0JY29udHJvbC5ub3RpZnlMaXN0ZW5lcnMoU1dULlBhaW50LCBldmVudCk7Ci0JZ2MuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZXZlbnRPY2N1cnJlZCk7Ci0JY29udHJvbC5yZW1vdmVQYWludExpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQlUcmF2ZXJzZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCWV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQljb250cm9sLmFkZFRyYXZlcnNlTGlzdGVuZXIobGlzdGVuZXIpOwotCWV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQljb250cm9sLm5vdGlmeUxpc3RlbmVycyhTV1QuVHJhdmVyc2UsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKGV2ZW50T2NjdXJyZWQpOwotCWNvbnRyb2wucmVtb3ZlVHJhdmVyc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSSgpIHsKLQljb250cm9sLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JUG9pbnQgc2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOwotCWNvbnRyb2wuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCWNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQlQb2ludCBzaXplID0gY29udHJvbC5nZXRTaXplKCk7Ci0JY29udHJvbC5jb21wdXRlU2l6ZShzaXplLngsIHNpemUueSwgZmFsc2UpOwotCWFzc2VydEVxdWFscyhzaXplLngsIGNvbnRyb2wuZ2V0U2l6ZSgpLngpOwotCWFzc2VydEVxdWFscyhzaXplLnksIGNvbnRyb2wuZ2V0U2l6ZSgpLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcmNlRm9jdXMoKSB7Ci0JLy8gdGhpcyBpcyBkaWZmaWN1bHQgdG8gdGVzdCBpbiBDb250cm9sLgotCS8vIHN1YmNsYXNzZXMgdGhhdCB3aXNoIHRvIHRlc3QgdGhpcyBzaG91bGQgb3ZlcnJpZGUuCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWNjZXNzaWJsZSgpIHsKLQlBY2Nlc3NpYmxlIGFjY2Vzc2libGUgPSBjb250cm9sLmdldEFjY2Vzc2libGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBhY2Nlc3NpYmxlICE9IG51bGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3JkZXJXaWR0aCgpIHsKLQljb250cm9sLmdldEJvcmRlcldpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJvdW5kc0lJSUkgYW5kIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEVuYWJsZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExheW91dERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWFzc2VydFRydWUoY29udHJvbC5nZXRMb2NhdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMzIsIDQzKSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lbnUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9uaXRvcigpIHsKLQlNb25pdG9yIG1vbml0b3IgPSBjb250cm9sLmdldE1vbml0b3IoKTsKLQlhc3NlcnROb3ROdWxsKG1vbml0b3IpOwotCURpc3BsYXkgZGlzcGxheSA9IGNvbnRyb2wuZ2V0RGlzcGxheSgpOwotCU1vbml0b3JbXSBtb25pdG9ycyA9IGRpc3BsYXkuZ2V0TW9uaXRvcnMoKTsKLQlpbnQgaTsKLQkvKiBtb25pdG9yIG11c3QgYmUgbGlzdGVkIGluIERpc3BsYXkuZ2V0TW9uaXRvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKG1vbml0b3IuZXF1YWxzKG1vbml0b3JzW2ldKSkgYnJlYWs7Ci0JfQotCWlmIChpID09IG1vbml0b3JzLmxlbmd0aCkgewotCQlmYWlsKCJDb250cm9sLmdldE1vbml0b3IgZG9lcyBub3QgcmV0dXJuIGEgbW9uaXRvciBsaXN0ZWQgaW4gRGlzcGxheS5nZXRNb25pdG9ycyIpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKHNoZWxsLCBjb250cm9sLmdldFBhcmVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaGVsbCgpIHsKLQlhc3NlcnRFcXVhbHMoc2hlbGwsIGNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2l6ZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTaXplSUkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb29sVGlwVGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBpbnRlbnRpb25hbGx5IG5vdCB0ZXN0ZWQgLSBub3QgcHVibGljIEFQSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQljb250cm9sLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmlzRW5hYmxlZCgpKTsKLQotCWNvbnRyb2wuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc0VuYWJsZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNGb2N1c0NvbnRyb2woKSB7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5pc0ZvY3VzQ29udHJvbCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1JlcGFyZW50YWJsZSgpIHsKLQlhc3NlcnRFcXVhbHMgKCJpc1JlcGFyZW50YWJsZSIsIGNvbnRyb2wuaXNSZXBhcmVudGFibGUoKSwgaXNSZXBhcmVudGFibGVQbGF0Zm9ybSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuaXNWaXNpYmxlKCkpOyAgLy9iZWNhdXNlIHRoZSBzaGVsbCBpcyBub3QgdmlzaWJsZQotCi0JY29udHJvbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQotCWlmICghU3d0SnVuaXQuaXNBSVgpIHsKLQkJY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOwotCQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCQlhc3NlcnRUcnVlKCJXaW5kb3cgc2hvdWxkIGJlIHZpc2libGUiLCBjb250cm9sLmlzVmlzaWJsZSgpKTsKLQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgbm90IGJlIHZpc2libGUiLCAhY29udHJvbC5pc1Zpc2libGUoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWNvbnRyb2wubW92ZUFib3ZlKG51bGwpOwotCi0JY29udHJvbC5tb3ZlQWJvdmUoY29udHJvbCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIDApOwotCWNvbnRyb2wubW92ZUFib3ZlKGIpOwotCWIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCWNvbnRyb2wubW92ZUJlbG93KG51bGwpOwotCi0JY29udHJvbC5tb3ZlQmVsb3coY29udHJvbCk7Ci0KLQlCdXR0b24gYiA9IG5ldyBCdXR0b24oc2hlbGwsIDApOwotCWNvbnRyb2wubW92ZUJlbG93KGIpOwotCWIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0JY29udHJvbC5wYWNrKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFja1ooKSB7Ci0JY29udHJvbC5wYWNrKHRydWUpOwotCWNvbnRyb2wucGFjayhmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3KCkgewotCWNvbnRyb2wucmVkcmF3KCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVkcmF3SUlJSVooKSB7Ci0JY29udHJvbC5yZWRyYXcoMCwgMCwgMCwgMCwgZmFsc2UpOwotCi0JY29udHJvbC5yZWRyYXcoMCwgMCwgMCwgMCwgdHJ1ZSk7Ci0KLQljb250cm9sLnJlZHJhdygtMTAsIC0xMCwgLTEwLCAtMTAsIHRydWUpOwotCi0JY29udHJvbC5yZWRyYXcoMTAsIDEwLCAxMCwgMTAsIHRydWUpOwotCi0JY29udHJvbC5yZWRyYXcoMTAsIDEwLCAxMCwgMTAsIGZhbHNlKTsKLQotCWNvbnRyb2wucmVkcmF3KDEwMDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZE1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihjb250cm9sLmdldERpc3BsYXkoKSwgMjU1LCAwLCAwKTsKLQljb250cm9sLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgY29udHJvbC5nZXRCYWNrZ3JvdW5kKCkpOwotCWNvbnRyb2wuc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRUcnVlKCFjb250cm9sLmdldEJhY2tncm91bmQoKS5lcXVhbHMoY29sb3IpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzSUlJSSgpIHsKLQljb250cm9sLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApLCBjb250cm9sLmdldEJvdW5kcygpKTsKLQotCWNvbnRyb2wuc2V0Qm91bmRzKDIwLCAzMCwgNDAsIDUwKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbnRyb2wuZ2V0Qm91bmRzKCkuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcygxMCwgMjAsIDMwLCA0MCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSwgY29udHJvbC5nZXRCb3VuZHMoKSk7Ci0KLQljb250cm9sLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgNDAsIDUwKSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb250cm9sLmdldEJvdW5kcygpLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMzAsIDQwKSkpOwotCi0JdHJ5IHsKLQkJY29udHJvbC5zZXRCb3VuZHMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlY3RhbmdsZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWNvbnRyb2wuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMTAsIDIwLCAzMCwgNDApKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDYXB0dXJlWigpIHsKLQljb250cm9sLnNldENhcHR1cmUodHJ1ZSk7Ci0KLQljb250cm9sLnNldENhcHR1cmUoZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCkgewotCWNvbnRyb2wuc2V0Q3Vyc29yKG51bGwpOwotCi0JQ3Vyc29yIGMgPSBuZXcgQ3Vyc29yKGNvbnRyb2wuZ2V0RGlzcGxheSgpLCAwKTsKLQljb250cm9sLnNldEN1cnNvcihjKTsKLQljLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQljb250cm9sLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShjb250cm9sLmdldEVuYWJsZWQoKSk7Ci0KLQljb250cm9sLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQljb250cm9sLnNldEZvY3VzKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250IGZvbnQgPSBjb250cm9sLmdldEZvbnQoKTsKLQljb250cm9sLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQoY29udHJvbC5nZXREaXNwbGF5KCksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQlhc3NlcnRFcXVhbHMoZm9udCwgY29udHJvbC5nZXRGb250KCkpOwotCi0JY29udHJvbC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCWNvbnRyb2wuc2V0Rm9udChmb250KTsKLQkJY29udHJvbC5zZXRGb250KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKSB7Ci0JQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoY29udHJvbC5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JY29udHJvbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQlhc3NlcnRFcXVhbHMoY29sb3IsIGNvbnRyb2wuZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb250cm9sLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkuZXF1YWxzKGNvbG9yKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExheW91dERhdGFMamF2YV9sYW5nX09iamVjdCgpIHsKLQljb250cm9sLnNldExheW91dERhdGEodGhpcyk7Ci0JYXNzZXJ0RXF1YWxzKHRoaXMsIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpKTsKLQotCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSgiYXNsZHNhaGRhaGNhc2xjc2hkYWMiKTsKLQlhc3NlcnRFcXVhbHMoImFzbGRzYWhkYWhjYXNsY3NoZGFjIiwgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKHRoaXMuZ2V0Q2xhc3MoKSk7Ci0JYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0Q2xhc3MoKSwgY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotCi0JY29udHJvbC5zZXRMYXlvdXREYXRhKG51bGwpOwotCWFzc2VydE51bGwoY29udHJvbC5nZXRMYXlvdXREYXRhKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb250cm9sLnNldFNpemUoMzIsIDQzKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBuZXcgUG9pbnQoMTEsIDIyKSk7Ci0KLQljb250cm9sLnNldExvY2F0aW9uKDEwLCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbmV3IFBvaW50KDEwLCAxMCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl0cnkgewotCQljb250cm9sLnNldExvY2F0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsb2NhdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVBvaW50IGxvYyA9IG5ldyBQb2ludCgzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24obG9jKTsKLQlhc3NlcnRFcXVhbHMoY29udHJvbC5nZXRMb2NhdGlvbigpLCBsb2MpOwotCi0JbG9jID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci0KLQlsb2MgPSBuZXcgUG9pbnQoMTAwMDAsIDEwMDAwKTsKLQljb250cm9sLnNldExvY2F0aW9uKGxvYyk7Ci0JYXNzZXJ0RXF1YWxzKGNvbnRyb2wuZ2V0TG9jYXRpb24oKSwgbG9jKTsKLQotCWxvYyA9IG5ldyBQb2ludCgtMTAsIC0xMCk7Ci0JY29udHJvbC5zZXRMb2NhdGlvbihsb2MpOwotCWFzc2VydEVxdWFscyhjb250cm9sLmdldExvY2F0aW9uKCksIGxvYyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51ICgpIHsKLQkvKiB0aGlzIGlzIGEgdmFsaWQgdGhpbmcgdG8gZG8sIHlvdSBjYW4gcmVzZXQgYSBtZW51IHRvIG5vdGhpbmcgKi8KLQljb250cm9sLnNldE1lbnUobnVsbCk7Ci0KLQlNZW51IG0gPSBuZXcgTWVudShjb250cm9sKTsKLQljb250cm9sLnNldE1lbnUobSk7Ci0JYXNzZXJ0RXF1YWxzKG0sIGNvbnRyb2wuZ2V0TWVudSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCkgewotCWlmIChjb250cm9sLmlzUmVwYXJlbnRhYmxlKCkpIHsKLQkJU2hlbGwgb3JpZ2luYWxQYXJlbnQgPSBuZXcgU2hlbGwoKTsKLQkJU2hlbGwgbmV3UGFyZW50ID0gbmV3IFNoZWxsKCk7Ci0JCUJ1dHRvbiBiID0gbmV3IEJ1dHRvbihvcmlnaW5hbFBhcmVudCwgU1dULlBVU0gpOwotCQliLnNldFBhcmVudChuZXdQYXJlbnQpOwotCQlvcmlnaW5hbFBhcmVudC5kaXNwb3NlKCk7Ci0JCWFzc2VydFRydWUoIWIuaXNEaXNwb3NlZCgpKTsKLQkJbmV3UGFyZW50LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQljb250cm9sLnNldFJlZHJhdyhmYWxzZSk7Ci0KLQljb250cm9sLnNldFJlZHJhdyh0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzAsIDQwKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JY29udHJvbC5zZXRCb3VuZHMoMzIsIDQzLCAzMCwgNDApOwotCWNvbnRyb2wuc2V0TG9jYXRpb24oMTEsIDIyKTsKLQljb250cm9sLnNldFNpemUoMzIsIDQzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDMyLCA0MyksIGNvbnRyb2wuZ2V0U2l6ZSgpKTsKLQotCWNvbnRyb2wuc2V0U2l6ZSgwLCAwKTsKLQkKLQljb250cm9sLnNldFNpemUoMTAsIDEwKTsKLQotCWNvbnRyb2wuc2V0U2l6ZSgxMDAwMCwgMTAwMDApOwotCi0JY29udHJvbC5zZXRTaXplKC0xMCwgLTEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KDMwLCA0MCkpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMzAsIDQwKSwgY29udHJvbC5nZXRTaXplKCkpOwotCi0JdHJ5IHsKLQkJY29udHJvbC5zZXRTaXplKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgwLCAwKSk7Ci0JCi0JY29udHJvbC5zZXRTaXplKG5ldyBQb2ludCgxMCwgMTApKTsKLQotCWNvbnRyb2wuc2V0U2l6ZShuZXcgUG9pbnQoMTAwMDAsIDEwMDAwKSk7Ci0KLQljb250cm9sLnNldFNpemUobmV3IFBvaW50KC0xMCwgLTEwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQljb250cm9sLnNldFRvb2xUaXBUZXh0KCJUaGlzIGlzIGEgdGlwIik7Ci0JYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIGEgdGlwIiwgY29udHJvbC5nZXRUb29sVGlwVGV4dCgpKTsKLQotCWNvbnRyb2wuc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0JYXNzZXJ0TnVsbChjb250cm9sLmdldFRvb2xUaXBUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuZ2V0VmlzaWJsZSgpKTsKLQotCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghY29udHJvbC5nZXRWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvQ29udHJvbElJKCkgewotCVBvaW50IGNvbnRyb2xDb29yZHMgPSBjb250cm9sLnRvQ29udHJvbCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvRGlzcGxheShjb250cm9sQ29vcmRzLngsIGNvbnRyb2xDb29yZHMueSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnQgY29udHJvbENvb3JkcyA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludCgwLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgwLCAwKSwgY29udHJvbC50b0Rpc3BsYXkoY29udHJvbENvb3JkcykpOwotCXRyeSB7Ci0JCWNvbnRyb2wudG9Db250cm9sKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvRGlzcGxheUlJKCkgewotCVBvaW50IGRpc3BsYXlDb29yZHMgPSBjb250cm9sLnRvRGlzcGxheSgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDAsIDApLCBjb250cm9sLnRvQ29udHJvbChkaXNwbGF5Q29vcmRzLngsIGRpc3BsYXlDb29yZHMueSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JUG9pbnQgZGlzcGxheUNvb3JkcyA9IGNvbnRyb2wudG9EaXNwbGF5KG5ldyBQb2ludCgwLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgwLCAwKSwgY29udHJvbC50b0NvbnRyb2woZGlzcGxheUNvb3JkcykpOwotCXRyeSB7Ci0JCWNvbnRyb2wudG9EaXNwbGF5KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzaXplID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RyYXZlcnNlSSgpIHsKLQljb250cm9sLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9FU0NBUEUpOwotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX1JFVFVSTik7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX05FWFQpOwotCWNvbnRyb2wudHJhdmVyc2UoU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUyk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCk7Ci0JY29udHJvbC50cmF2ZXJzZShTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSgpIHsKLQljb250cm9sLnVwZGF0ZSgpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2ZvcmNlRm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFjY2Vzc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvcmRlcldpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvcmVncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExheW91dERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNb25pdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzUmVwYXJlbnRhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tb3ZlQmVsb3dMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFjayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcGFja1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlZHJhdyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVkcmF3SUlJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZU1vdXNlVHJhY2tMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlVHJhY2tMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENhcHR1cmVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFyZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvQ29udHJvbElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90b0Rpc3BsYXlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdG9EaXNwbGF5TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdHJhdmVyc2VJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF91cGRhdGUiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRGb2N1c0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRm9jdXNMaXN0ZW5lciIpKSB0ZXN0X2FkZEZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIiKSkgdGVzdF9hZGRLZXlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0tleUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VMaXN0ZW5lciIpKSB0ZXN0X2FkZE1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VNb3ZlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZU1vdmVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyIikpIHRlc3RfYWRkTW91c2VUcmFja0xpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VUcmFja0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRQYWludExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfUGFpbnRMaXN0ZW5lciIpKSB0ZXN0X2FkZFBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUcmF2ZXJzZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJhdmVyc2VMaXN0ZW5lciIpKSB0ZXN0X2FkZFRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJIikpIHRlc3RfY29tcHV0ZVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZm9yY2VGb2N1cyIpKSB0ZXN0X2ZvcmNlRm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFjY2Vzc2libGUiKSkgdGVzdF9nZXRBY2Nlc3NpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm9yZGVyV2lkdGgiKSkgdGVzdF9nZXRCb3JkZXJXaWR0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udCIpKSB0ZXN0X2dldEZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmQiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMYXlvdXREYXRhIikpIHRlc3RfZ2V0TGF5b3V0RGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9jYXRpb24iKSkgdGVzdF9nZXRMb2NhdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVudSIpKSB0ZXN0X2dldE1lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1vbml0b3IiKSkgdGVzdF9nZXRNb25pdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnQiKSkgdGVzdF9nZXRQYXJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNoZWxsIikpIHRlc3RfZ2V0U2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpKSB0ZXN0X2ludGVybmFsX2Rpc3Bvc2VfR0NJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2ludGVybmFsX25ld19HQ0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNGb2N1c0NvbnRyb2wiKSkgdGVzdF9pc0ZvY3VzQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNSZXBhcmVudGFibGUiKSkgdGVzdF9pc1JlcGFyZW50YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3ZlQWJvdmVMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X21vdmVBYm92ZUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tb3ZlQmVsb3dMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpKSB0ZXN0X21vdmVCZWxvd0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrIikpIHRlc3RfcGFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcGFja1oiKSkgdGVzdF9wYWNrWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVkcmF3IikpIHRlc3RfcmVkcmF3KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWRyYXdJSUlJWiIpKSB0ZXN0X3JlZHJhd0lJSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUZvY3VzTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Gb2N1c0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlRm9jdXNMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0ZvY3VzTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlS2V5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19LZXlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZUtleUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfS2V5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTW91c2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vdXNlTW92ZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW91c2VNb3ZlTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vdXNlTW92ZUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb3VzZVRyYWNrTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVBhaW50TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19QYWludExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlUGFpbnRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1BhaW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRyYXZlcnNlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmF2ZXJzZUxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlVHJhdmVyc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyYXZlcnNlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEJvdW5kc0lJSUkiKSkgdGVzdF9zZXRCb3VuZHNJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpKSB0ZXN0X3NldEJvdW5kc0xvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDYXB0dXJlWiIpKSB0ZXN0X3NldENhcHR1cmVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb2N1cyIpKSB0ZXN0X3NldEZvY3VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0TGF5b3V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRMb2NhdGlvbklJIikpIHRlc3Rfc2V0TG9jYXRpb25JSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3Rfc2V0TG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKSkgdGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhcmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUiKSkgdGVzdF9zZXRQYXJlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9Db250cm9sSUkiKSkgdGVzdF90b0NvbnRyb2xJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3RvQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvRGlzcGxheUlJIikpIHRlc3RfdG9EaXNwbGF5SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvRGlzcGxheUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF90b0Rpc3BsYXlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90cmF2ZXJzZUkiKSkgdGVzdF90cmF2ZXJzZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3VwZGF0ZSIpKSB0ZXN0X3VwZGF0ZSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLQlDb250cm9sIGNvbnRyb2w7Ci0JYm9vbGVhbiBldmVudE9jY3VycmVkOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQljb250cm9sID0gKENvbnRyb2wpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLS8qIGEgZGlmZmVyZW50IG1ldGhvZCBpbiBDb25zaXN0ZW5jeVV0aWxpdHkgaXMgaW52b2tlZCBkZXBlbmRpbmcgb24gd2hhdCBtZXRob2QgCi0gKiBlcXVhbHMKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSzoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgCQkJCSAgCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sCi0gKiAJCQlwYXJhbUMgaXMgdGhlIG1vdXNlIGJ1dHRvbiB0byBjbGljay4KLSAqIAkJCXBhcmFtRCBpZiBpdCBlcXVhbHMgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCB0aGVuIGFub3RoZXIgY2xpY2sKLSAqIAkJCXdpbGwgYmUgbWFkZSBvbiB0aGUgYm9yZGVyIG9mIHRoZSBzaGVsbCwgdG8gZXNjYXBlIHRoZSBtZW51IHRoYXQgY2FtZSB1cAotICogCQkJKGllIHJpZ2h0IGNsaWNraW5nIGluIGEgdGV4dCB3aWRnZXQpCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0Q2xpY2soRGlzcGxheSwgUG9pbnQsIGludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSwotICogCQkJcGFyYW1BIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCAJCQkJICAKLSAqIAkJCXBhcmFtQiBpcyB0aGUgeSBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wKLSAqIAkJCXBhcmFtQyBpcyB0aGUgbW91c2UgYnV0dG9uIHRvIGNsaWNrLgotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERvdWJsZUNsaWNrKERpc3BsYXksIFBvaW50LCBpbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRzoKLSAqIAkJCXBhcmFtQSBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIG9yaWdpbiBvZiBkcmFnCi0gKiAJCQlwYXJhbUIgaXMgdGhlIHkgY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBvcmlnaW4gb2YgZHJhZwotICogCQkJcGFyYW1DIGlzIHRoZSB4IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZGVzdGluYXRpb24gb2YgZHJhZwotICogCQkJcGFyYW1EIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZGVzdGluYXRpb24gb2YgZHJhZwotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERyYWcoRGlzcGxheSwgUG9pbnQsIFBvaW50KQotICogQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUzogIAotICogCQkgCXBhcmFtQSBpcyB0aGUgY2hhcmFjdGVyIHRvIHByZXNzCi0gKiAJCQlwYXJhbUIgaXMgdGhlIGtleUNvZGUgCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0S2V5UHJlc3MoRGlzcGxheSwgaW50LCBpbnQpCi0gKiBDb25zaXN0ZW5jeVV0aWxpdHkuRE9VQkxFX0tFWV9QUkVTUzogIAotICogCQkgCXBhcmFtQSBpcyB0aGUgY2hhcmFjdGVyIHRvIHByZXNzIGFuZCBob2xkCi0gKiAJCQlwYXJhbUIgaXMgdGhlIGtleUNvZGUgCi0gKiAJCQlwYXJhbUMgaXMgdGhlIHNlY29uZCBrZXkgdG8gcHJlc3Mgd2hpbGUgdGhlIGZpcnN0IG9uZSBpcyBoZWxkIChpZSBjdHJsLWEpCi0gKiAJCQlwYXJhbUQgaXMgdGhlIHNlY29uZCBrZXljb2RlCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlS2V5UHJlc3MoRGlzcGxheSwgaW50LCBpbnQsIGludCwgaW50KSAKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT046Ci0gKiAJCQlwYXJhbUEgaXMgdGhlIHggY29vcmRpbmF0ZSBvZmZzZXQgZnJvbSBjb250cm9sIG9mIHRoZSBmaXJzdCBjbGljawotICogCQkJcGFyYW1CIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgZmlyc3QgY2xpY2sKLSAqIAkJCXBhcmFtQyBpcyB0aGUgeCBjb29yZGluYXRlIG9mZnNldCBmcm9tIGNvbnRyb2wgb2YgdGhlIHNlY29uZCBjbGljawotICogCQkJcGFyYW1EIGlzIHRoZSB5IGNvb3JkaW5hdGUgb2Zmc2V0IGZyb20gY29udHJvbCBvZiB0aGUgc2Vjb25kIGNsaWNrCi0gKiAJCQlpbnZva2VzIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2VsZWN0aW9uKERpc3BsYXksIFBvaW50LCBQb2ludCkKLSAqIENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZOgotICogCQkJcGFyYW1BIGlzIHRoZSBidXR0b24gdG8gY2xpY2sgd2l0aAotICogCQkJaW52b2tlcyBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdFNoZWxsSWNvbmlmeShEaXNwbGF5LCBQb2ludCwgaW50KQotICovCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeUV2ZW50KGZpbmFsIGludCBwYXJhbUEsIGZpbmFsIGludCBwYXJhbUIsIAotICAgICAgICAJCQkJCQlmaW5hbCBpbnQgcGFyYW1DLCBmaW5hbCBpbnQgcGFyYW1ELAotICAgICAgICAJCQkJCQlmaW5hbCBpbnQgbWV0aG9kLCBWZWN0b3IgZXZlbnRzLCBib29sZWFuIGZvY3VzKSB7Ci0gICAgaWYoZlRlc3RDb25zaXN0ZW5jeSkgewotICAgICAgICBmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0gICAgICAgIGlmKGV2ZW50cyA9PSBudWxsKSAKLSAgICAgICAgICAgIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3QgPSBnZXRUZXN0TmFtZSgpOwotICAgICAgICAKLSAgICAgICAgc2hlbGwuc2V0TGF5b3V0KG5ldyBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQoKSk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoIlBhcmVudCIpOwotCi0gICAgICAgIHNoZWxsLnBhY2soKTsKLSAgICAJc2hlbGwub3BlbigpOwotICAgIAlpZihjb250cm9sIGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAJICAgICgoU2hlbGwpY29udHJvbCkucGFjaygpOwotICAgICAgICAJKChTaGVsbCljb250cm9sKS5vcGVuKCk7Ci0gICAgCX0KLSAgICAJZmluYWwgUG9pbnRbXSBwdCA9IGRldGVybWluZUxvY2F0aW9ucyhwYXJhbUEsIHBhcmFtQiwgcGFyYW1DLCBwYXJhbUQsIG1ldGhvZCk7Ci0gICAgICAgIGlmKGZvY3VzICYmICFjb250cm9sLnNldEZvY3VzKCkpCi0gICAgICAgICAgICBjb250cm9sLmZvcmNlRm9jdXMoKTsKLSAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWRFdmVudHMgPSBob29rRXhwZWN0ZWRFdmVudHModGVzdCwgZXZlbnRzKTsKLSAgICAgICAgbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5Lndha2UoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gobWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgCWNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLOgotICAgICAgICAgICAgICAgIAkJQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lVdGlsaXR5LnBvc3RDbGljayhkaXNwbGF5LCBwdFswXSwgcGFyYW1DKSk7Ci0gICAgICAgICAgICAgICAgCQlpZihwYXJhbUQgPT0gQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VKSB7Ci0gICAgICAgICAgICAgICAgCQkgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0Q2xpY2soZGlzcGxheSwgcHRbMV0sIDEpKTsKLSAgICAgICAgICAgICAgICAJCX0gIAotICAgICAgICAgICAgICAgIAkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RPVUJMRUNMSUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0RG91YmxlQ2xpY2soZGlzcGxheSwgcHRbMF0sIHBhcmFtQykpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0S2V5UHJlc3MoZGlzcGxheSwgcGFyYW1BLCBwYXJhbUIpKTsKLSAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERvdWJsZUtleVByZXNzKGRpc3BsYXksIHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCkpOwotICAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdERyYWcoZGlzcGxheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFswXSwgcHRbMV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnNpc3RlbmN5VXRpbGl0eS5TRUxFQ1RJT046Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2VsZWN0aW9uKGRpc3BsYXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRbMF0sIHB0WzFdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zaXN0ZW5jeVV0aWxpdHkuU0hFTExfSUNPTklGWToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFN3dEp1bml0LmlzQ2FyYm9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5wb3N0U2hlbGxJY29uaWZ5KGRpc3BsYXksIHB0WzBdLCBwYXJhbUEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeVV0aWxpdHkucG9zdFNoZWxsSWNvbmlmeShkaXNwbGF5LCBwdFsxXSwgcGFyYW1BKSk7Ci0gICAgICAgICAgICAgICAgICAgIAlpZihjb250cm9sIGluc3RhbmNlb2YgU2hlbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICBkaXNwbGF5LnN5bmNFeGVjKG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICgoU2hlbGwpY29udHJvbCkuc2V0TWluaW1pemVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfX0pOwotICAgICAgICAgICAgICAgICAgICAJfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIAkgICAgZmFpbCgiSWNvbmlmeWluZyBhIG5vbiBzaGVsbCBjb250cm9sIik7Ci0gICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSAgICAgICAgc2hlbGwuZGlzcG9zZSgpOwotCQkJCSAgICB9Ci0JCQkJfSk7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgd2hpbGUoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaWYoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLSAgICAgICAgfQotICAgICAgICBzZXRVcCgpOyAgICAgICAgCi0gICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW2V2ZW50cy5zaXplKCldOwotICAgICAgICBldmVudHMuY29weUludG8ocmVzdWx0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0ICsgIiBldmVudCBvcmRlcmluZyIsIGV4cGVjdGVkRXZlbnRzLCByZXN1bHRzKTsKLSAgICB9Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5RXZlbnQoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwgCi0JCQkJCQkJCWludCBwYXJhbUMsIGludCBwYXJhbUQsCi0JCQkJCQkJCWludCBtZXRob2QsIFZlY3RvciBldmVudHMpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBhcmFtQSwgcGFyYW1CLCBwYXJhbUMsIHBhcmFtRCwgbWV0aG9kLCBldmVudHMsIHRydWUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjb25zaXN0ZW5jeUV2ZW50KGludCBwYXJhbUEsIGludCBwYXJhbUIsIAotCQkJCQkJCQlpbnQgcGFyYW1DLCBpbnQgcGFyYW1ELAotCQkJCQkJCQlpbnQgbWV0aG9kKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudChwYXJhbUEsIHBhcmFtQiwgcGFyYW1DLCBwYXJhbUQsIG1ldGhvZCwgbnVsbCwgdHJ1ZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCkgewotICAgIHNoZWxsLnNldExheW91dChuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0KCkpOwotICAgIHNoZWxsLnBhY2soKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIHNoZWxsLnBhY2soKTsKLX0KLQotCi1wcm90ZWN0ZWQgUG9pbnRbXSBkZXRlcm1pbmVMb2NhdGlvbnMoaW50IHBhcmFtQSwgaW50IHBhcmFtQiwKLSAgICAgICAgCQkJCQkJICAgICBpbnQgcGFyYW1DLCBpbnQgcGFyYW1ELCBpbnQgbWV0aG9kKSB7Ci0gICAgUG9pbnRbXSBhcnJheSA9IG5ldyBQb2ludFsyXTsKLSAgICBpZihtZXRob2QgPj0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKQotICAgICAgICBhcnJheVswXSA9IGNvbnRyb2wudG9EaXNwbGF5KHBhcmFtQSwgcGFyYW1CKTsKLSAgICBpZihtZXRob2QgPj0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpIAotICAgICAgICBhcnJheVsxXSA9IGNvbnRyb2wudG9EaXNwbGF5KHBhcmFtQywgcGFyYW1EKTsKLSAgICBpZihtZXRob2QgPT0gQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLICYmIHBhcmFtRCA9PSBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUpCi0gICAgICAgIGFycmF5WzFdID0gc2hlbGwudG9EaXNwbGF5KDI1LCAtMTApOwotICAgIGVsc2UgaWYobWV0aG9kID09IENvbnNpc3RlbmN5VXRpbGl0eS5TSEVMTF9JQ09OSUZZKSB7Ci0gICAgICAgIGFycmF5WzBdID0gY29udHJvbC50b0Rpc3BsYXkoMCwwKTsKLSAgICAgICAgYXJyYXlbMV0gPSBjb250cm9sLnRvRGlzcGxheShjb250cm9sLmdldFNpemUoKS54IC0yMCwgMCk7Ci0gICAgfQotICAgIHJldHVybiBhcnJheTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTAwZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoY29vbEJhcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoICJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Db3VudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1PcmRlcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbU9yZGVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbVNpemVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtU2l6ZXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SXRlbXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMb2NrZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldExvY2tlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdyYXBJbmRpY2VzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXcmFwSW5kaWNlcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJdGVtTGF5b3V0JEkkSSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TG9ja2VkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TG9ja2VkWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdyYXBJbmRpY2VzJEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdyYXBJbmRpY2VzJEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1PcmRlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbVNpemVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9ja2VkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRXcmFwSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TG9ja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V3JhcEluZGljZXMkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUNvdW50IikpIHRlc3RfZ2V0SXRlbUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtSSIpKSB0ZXN0X2dldEl0ZW1JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtT3JkZXIiKSkgdGVzdF9nZXRJdGVtT3JkZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1TaXplcyIpKSB0ZXN0X2dldEl0ZW1TaXplcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TG9ja2VkIikpIHRlc3RfZ2V0TG9ja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXcmFwSW5kaWNlcyIpKSB0ZXN0X2dldFdyYXBJbmRpY2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUxheW91dCRJJEkkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldEl0ZW1MYXlvdXQkSSRJJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2tlZFoiKSkgdGVzdF9zZXRMb2NrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRXcmFwSW5kaWNlcyRJIikpIHRlc3Rfc2V0V3JhcEluZGljZXMkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9DaGV2cm9uTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogQ3VzdG9tICovCi0KLUNvb2xCYXIgY29vbEJhcjsKLQotCi1wcml2YXRlIHZvaWQgY3JlYXRlQ29vbEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIFN0cmluZyB0ZXN0ID0gZ2V0VGVzdE5hbWUoKTsKLSAgICBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIFNXVC5GTEFUKTsKLQlUb29sQmFyW10gY29vbEl0ZW1Ub29sQmFyID0gbmV3IFRvb2xCYXJbMl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgU1dULkRST1BfRE9XTik7Ci0JCWNvb2xJdGVtVG9vbEJhcltpXSA9IG5ldyBUb29sQmFyKGNvb2xCYXIsIFNXVC5GTEFUKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGNvb2xJdGVtLCB0ZXN0LCBldmVudHMpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoY29vbEl0ZW1Ub29sQmFyW2ldLCB0ZXN0LCBldmVudHMpOwotCQlpbnQgdG9vbEl0ZW1XaWR0aCA9IDA7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7Ci0JCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKGNvb2xJdGVtVG9vbEJhcltpXSwgU1dULkNIRUNLKTsKLQkJCWl0ZW0uc2V0VGV4dCgiQ0IiICsgKChpKjIpICsgaikpOwotCQkJaXRlbS5zZXRUb29sVGlwVGV4dCgiVG9vbEl0ZW0gVG9vbFRpcCIgKyBpICsgaik7Ci0JCQlpZiAoaXRlbS5nZXRXaWR0aCgpID4gdG9vbEl0ZW1XaWR0aCkKLQkJCSAgICB0b29sSXRlbVdpZHRoID0gaXRlbS5nZXRXaWR0aCgpOwotCQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIHRlc3QsIGV2ZW50cyk7Ci0JCX0KLSAgICAgICAgY29vbEl0ZW0uc2V0Q29udHJvbChjb29sSXRlbVRvb2xCYXJbaV0pOwotICAgICAgICBQb2ludCBzaXplOwotICAgICAgICBpZihpID09IDEpCi0gICAgICAgICAgICBzaXplID0gY29vbEl0ZW1Ub29sQmFyW2ldLmNvbXB1dGVTaXplKDIwLCBTV1QuREVGQVVMVCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNpemUgPSBjb29sSXRlbVRvb2xCYXJbaV0uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLSAgICAgICAgUG9pbnQgY29vbFNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZSAoc2l6ZS54LCBzaXplLnkpOwotICAgICAgICBjb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sSXRlbVdpZHRoLzMsIGNvb2xTaXplLnkpOwotICAgICAgICBjb29sSXRlbS5zZXRQcmVmZXJyZWRTaXplKGNvb2xTaXplKTsKLSAgICAgICAgY29vbEl0ZW0uc2V0U2l6ZShjb29sU2l6ZS54LzMsIGNvb2xTaXplLnkpOwotICAgICAgICBjb29sSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQ29vbEl0ZW1TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQl9Ci0Jc2V0V2lkZ2V0KGNvb2xCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0NoZXZyb25NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICAvL2NoZXZyb24KLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LTEyLCAwLCAzLCBDb25zaXN0ZW5jeVV0aWxpdHkuRVNDQVBFX01FTlUsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LCAyLCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbkRyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIHBvaW50c1swXS54LTEyLCA1LCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUNvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIFBvaW50W10gcG9pbnRzID0gY29vbEJhci5nZXRJdGVtU2l6ZXMoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KHBvaW50c1swXS54LCAwLCBwb2ludHNbMF0ueCwgNSwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfQ2hldnJvbk1vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlQ29vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgUG9pbnRbXSBwb2ludHMgPSBjb29sQmFyLmdldEl0ZW1TaXplcygpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocG9pbnRzWzBdLngtMTIsIDAsIHBvaW50c1swXS54LTgsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuU0VMRUNUSU9OLCBldmVudHMpOwotfQotCi1jbGFzcyBDb29sSXRlbVNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCS8qKgotCQkgKiBBIHNlbGVjdGlvbiBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gdGhlIGNvb2wgaXRlbQotCQkgKiBpcyBzZWxlY3RlZCBieSBpdHMgZ3JpcHBlciBvciBpZiB0aGUgZHJvcCBkb3duIGFycm93Ci0JCSAqIChvciAnY2hldnJvbicpIGlzIHNlbGVjdGVkLiBFeGFtaW5lIHRoZSBldmVudCBkZXRhaWwKLQkJICogdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aWRnZXQgd2FzIHNlbGVjdGVkLgotCQkgKi8KLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBTV1QuQVJST1cpIHsKLQkJCS8qIElmIHRoZSBwb3B1cCBtZW51IGlzIGFscmVhZHkgdXAgKGkuZS4gdXNlciBwcmVzc2VkIGFycm93IHR3aWNlKSwKLQkJCSAqIHRoZW4gZGlzcG9zZSBpdC4KLQkJCSAqLwotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCW1lbnUuZGlzcG9zZSgpOwotCQkJCW1lbnUgPSBudWxsOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLyogR2V0IHRoZSBjb29sIGl0ZW0gYW5kIGNvbnZlcnQgaXRzIGJvdW5kcyB0byBkaXNwbGF5IGNvb3JkaW5hdGVzLiAqLwotCQkJQ29vbEl0ZW0gY29vbEl0ZW0gPSAoQ29vbEl0ZW0pIGV2ZW50LndpZGdldDsKLQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gY29vbEl0ZW0uZ2V0Qm91bmRzICgpOwotCQkJaXRlbUJvdW5kcy53aWR0aCA9IGV2ZW50LnggLSBpdGVtQm91bmRzLng7Ci0JCQlQb2ludCBwdCA9IGNvb2xCYXIudG9EaXNwbGF5KG5ldyBQb2ludCAoaXRlbUJvdW5kcy54LCBpdGVtQm91bmRzLnkpKTsKLQkJCWl0ZW1Cb3VuZHMueCA9IHB0Lng7Ci0JCQlpdGVtQm91bmRzLnkgPSBwdC55OwotCQkJCi0JCQkvKiBHZXQgdGhlIHRvb2xiYXIgZnJvbSB0aGUgY29vbCBpdGVtLiAqLwotCQkJVG9vbEJhciB0b29sQmFyID0gKFRvb2xCYXIpIGNvb2xJdGVtLmdldENvbnRyb2wgKCk7Ci0JCQlUb29sSXRlbVtdIHRvb2xzID0gdG9vbEJhci5nZXRJdGVtcyAoKTsKLQkJCWludCB0b29sQ291bnQgPSB0b29scy5sZW5ndGg7Ci0JCQkJCQkJCi0JCQkvKiBDb252ZXJ0IHRoZSBib3VuZHMgb2YgZWFjaCB0b29sIGl0ZW0gdG8gZGlzcGxheSBjb29yZGluYXRlcywKLQkJCSAqIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lcyBhcmUgcGFzdCB0aGUgYm91bmRzIG9mIHRoZSBjb29sIGl0ZW0uCi0JCQkgKi8KLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdG9vbENvdW50KSB7Ci0JCQkJUmVjdGFuZ2xlIHRvb2xCb3VuZHMgPSB0b29sc1tpXS5nZXRCb3VuZHMgKCk7Ci0JCQkJcHQgPSB0b29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQodG9vbEJvdW5kcy54LCB0b29sQm91bmRzLnkpKTsKLQkJCQl0b29sQm91bmRzLnggPSBwdC54OwotCQkJCXRvb2xCb3VuZHMueSA9IHB0Lnk7Ci0JCSAgCQlSZWN0YW5nbGUgaW50ZXJzZWN0aW9uID0gaXRlbUJvdW5kcy5pbnRlcnNlY3Rpb24gKHRvb2xCb3VuZHMpOwotCQkgIAkJaWYgKCFpbnRlcnNlY3Rpb24uZXF1YWxzICh0b29sQm91bmRzKSkgYnJlYWs7Ci0JCSAgCQlpKys7Ci0JCQl9Ci0JCQkKLQkJCS8qIENyZWF0ZSBhIHBvcC11cCBtZW51IHdpdGggaXRlbXMgZm9yIGVhY2ggb2YgdGhlIGhpZGRlbiBidXR0b25zLiAqLwotCQkJbWVudSA9IG5ldyBNZW51IChjb29sQmFyKTsKLQkJCWZvciAoaW50IGogPSBpOyBqIDwgdG9vbENvdW50OyBqKyspIHsKLQkJCQlUb29sSXRlbSB0b29sID0gdG9vbHNbal07Ci0JCQkJU3RyaW5nIHRleHQgPSB0b29sLmdldFRleHQoKTsKLQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbSAobWVudSwgU1dULk5PTkUpOwotCQkJCW1lbnVJdGVtLnNldFRleHQodGV4dCk7Ci0JCQl9Ci0JCQkKLQkJCS8qIERpc3BsYXkgdGhlIHBvcC11cCBtZW51IGF0IHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgYXJyb3cgYnV0dG9uLgotCQkJICogRGlzcG9zZSB0aGUgbWVudSB3aGVuIHRoZSB1c2VyIGlzIGRvbmUgd2l0aCBpdC4KLQkJCSAqLwotCQkJcHQgPSBjb29sQmFyLnRvRGlzcGxheShuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJbWVudS5zZXRMb2NhdGlvbiAocHQueCwgcHQueSk7Ci0JCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29vbEJhci5nZXREaXNwbGF5ICgpOwotCQkJd2hpbGUgKG1lbnUgIT0gbnVsbCAmJiAhbWVudS5pc0Rpc3Bvc2VkKCkgJiYgbWVudS5pc1Zpc2libGUgKCkpIHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoICgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQkJfQotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCW1lbnUuZGlzcG9zZSAoKTsKLQkJCQltZW51ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmFiYTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0Jc2V0V2lkZ2V0KGNvb2xJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCQotCXRyeSB7Ci0JCW5ldyBDb29sSXRlbShudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsJCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDApOwotCXRyeSB7Ci0JCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIC0xKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggPT0gLTEiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQl9Ci0JdHJ5IHsKLQkJY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IDIiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDEsIGNvb2xCYXIuZ2V0SXRlbUNvdW50KCkpOwotCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDAsIDEpOwotCWFzc2VydEVxdWFscygyLCBjb29sQmFyLmdldEl0ZW1Db3VudCgpKTsKLQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwLCAwKTsKLQlhc3NlcnRFcXVhbHMoMywgY29vbEJhci5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKGNvb2xJdGVtLCBjb29sQmFyLmdldEl0ZW0oMCkpOwkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSSgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb28iKTsKLQotCVBvaW50IHNpemUgPSBjb29sSXRlbS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JYXNzZXJ0VHJ1ZShzaXplMi54ID09IHNpemUueCk7Ci0KLQlzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoNTAsIDI1KTsKLQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDEwMCwgMjUpOwotCWFzc2VydEVxdWFscyhzaXplLnggKyA1MCwgc2l6ZTIueCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueSwgc2l6ZTIueSk7Ci0KLQlzaXplID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoMSwxKTsKLQlzaXplMiA9IGNvb2xJdGVtLmNvbXB1dGVTaXplKDI2LCAyNik7Ci0JYXNzZXJ0RXF1YWxzKDI1LCBzaXplMi54IC0gc2l6ZS54KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JUG9pbnQgc2l6ZSA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS54LCByZWN0LndpZHRoKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZS55LCByZWN0LmhlaWdodCk7Ci0JCi0JY29vbEl0ZW0uc2V0U2l6ZSgyNSwgMjUpOwotCXJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQljb29sSXRlbS5zZXRTaXplKDEwMCwgMjUpOwotCVJlY3RhbmdsZSBuZXdSZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3Qud2lkdGggKyA3NSwgbmV3UmVjdC53aWR0aCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QueCwgbmV3UmVjdC54KTsKLQlhc3NlcnRFcXVhbHMocmVjdC55LCBuZXdSZWN0LnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRyb2woKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWFzc2VydE51bGwoY29vbEl0ZW0uZ2V0Q29udHJvbCgpKTsKLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JQ29udHJvbCBjb250cm9sID0gY29vbEl0ZW0uZ2V0Q29udHJvbCgpOwotCWFzc2VydEVxdWFscyhidXR0b24sIGNvbnRyb2wpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCWNvbnRyb2wgPSBjb29sSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWluaW11bVNpemUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1pbmltdW1TaXplIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlhc3NlcnRFcXVhbHMoY29vbEJhciwgY29vbEl0ZW0uZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByZWZlcnJlZFNpemUoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vYmFyIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCVBvaW50IHByZWYgPSBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZShwcmVmKTsKLQlhc3NlcnRFcXVhbHMocHJlZiwgY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCVJlY3RhbmdsZSByZWN0ID0gY29vbEl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3Qud2lkdGgsIHNpemUueCk7Ci0JYXNzZXJ0RXF1YWxzKHJlY3QuaGVpZ2h0LCBzaXplLnkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCWNvb2xJdGVtLnNldENvbnRyb2wobnVsbCk7Ci0JCi0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQlhc3NlcnRUcnVlKHNpemUyLnggPiBzaXplLngpOwotCQotCWlmICghTUlOSU1BTF9DT05GT1JNQU5DRSkgewotCQlzaXplID0gYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXNpemUyID0gY29vbEl0ZW0uY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpOwotCQlhc3NlcnRFcXVhbHMoc2l6ZTIsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0JfQotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQlmYWlsKCJObyBleGNlcHRpb24gd2hlbiBjb250cm9sLmlzRGlzcG9zZWQoKSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCXRyeSB7Ci0JCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIGNvbnRyb2wgaGFzIHdyb25nIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWluaW11bVNpemVJSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluaW11bVNpemVJSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0TWluaW11bVNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJKCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvb2JhciIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoc2l6ZSk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUueCwgY29vbEl0ZW0uZ2V0U2l6ZSgpLngpOwotCWNvb2xJdGVtLnNldFNpemUoY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQlhc3NlcnRFcXVhbHMoc2l6ZSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQlDb29sQmFyIGNvb2xCYXIgPSBuZXcgQ29vbEJhcihzaGVsbCwgMCk7Ci0JQ29vbEl0ZW0gY29vbEl0ZW0gPSBuZXcgQ29vbEl0ZW0oY29vbEJhciwgMCk7Ci0JQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29vbEJhciwgU1dULlBVU0gpOwotCWJ1dHRvbi5zZXRUZXh0KCJmb29iYXIiKTsKLQljb29sSXRlbS5zZXRDb250cm9sKGJ1dHRvbik7Ci0JCi0JUG9pbnQgc2l6ZSA9IG5ldyBQb2ludCg1MCwgMzApOwotCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUoc2l6ZSk7Ci0JUG9pbnQgc2l6ZTIgPSBjb29sSXRlbS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSg1MCwgMzApOwotCWFzc2VydEVxdWFscyhzaXplMiwgY29vbEl0ZW0uZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTaXplSUkoKSB7Ci0JQ29vbEJhciBjb29sQmFyID0gbmV3IENvb2xCYXIoc2hlbGwsIDApOwotCUNvb2xJdGVtIGNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIDApOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvb2xCYXIsIFNXVC5QVVNIKTsKLQlidXR0b24uc2V0VGV4dCgiZm9vIik7Ci0JY29vbEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCi0JY29vbEl0ZW0uc2V0U2l6ZSg1MCwgNTApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoNTAsIDUwKSwgY29vbEl0ZW0uZ2V0U2l6ZSgpKTsKLQotCWNvb2xJdGVtLnNldFNpemUoMCwgMCk7Ci0JUG9pbnQgc21hbGxlc3QgPSBjb29sSXRlbS5nZXRTaXplKCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZSgxLCAxKTsKLQlhc3NlcnRFcXVhbHMoc21hbGxlc3QsIGNvb2xJdGVtLmdldFNpemUoKSk7Ci0JCi0JUmVjdGFuZ2xlIHJlY3QgPSBjb29sSXRlbS5nZXRCb3VuZHMoKTsKLQlQb2ludCBzaXplID0gY29vbEl0ZW0uZ2V0U2l6ZSgpOwotCWNvb2xJdGVtLnNldFNpemUocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwotCWFzc2VydEVxdWFscyhzaXplLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCUNvb2xCYXIgY29vbEJhciA9IG5ldyBDb29sQmFyKHNoZWxsLCAwKTsKLQlDb29sSXRlbSBjb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCAwKTsKLQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb29sQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLnNldFRleHQoImZvbyIpOwotCWNvb2xJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkKLQlQb2ludCBzaXplID0gbmV3IFBvaW50KDUwLCA1MCk7Ci0JY29vbEl0ZW0uc2V0U2l6ZShzaXplKTsKLQlQb2ludCBzaXplMiA9IGNvb2xJdGVtLmdldFNpemUoKTsKLQljb29sSXRlbS5zZXRTaXplKDUwLCA1MCk7Ci0JYXNzZXJ0RXF1YWxzKHNpemUyLCBjb29sSXRlbS5nZXRTaXplKCkpOwotfQotCi0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEl0ZW0oKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29vbEJhckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtU2l6ZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQcmVmZXJyZWRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1TaXplSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1TaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2l6ZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Nvb2xCYXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db29sQmFySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJIikpIHRlc3RfY29tcHV0ZVNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bVNpemUiKSkgdGVzdF9nZXRNaW5pbXVtU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQcmVmZXJyZWRTaXplIikpIHRlc3RfZ2V0UHJlZmVycmVkU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2l6ZSIpKSB0ZXN0X2dldFNpemUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1TaXplSUkiKSkgdGVzdF9zZXRNaW5pbXVtU2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRNaW5pbXVtU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFByZWZlcnJlZFNpemVJSSIpKSB0ZXN0X3NldFByZWZlcnJlZFNpemVJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UHJlZmVycmVkU2l6ZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRQcmVmZXJyZWRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2l6ZUlJIikpIHRlc3Rfc2V0U2l6ZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTaXplTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlOSU1BTF9DT05GT1JNQU5DRSA9IGZhbHNlOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E4ZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGVjb3JhdGlvbnMKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRlY29yYXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19DYW52YXMgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JLy8gZG8gbm90aGluZywgZXZlbiB0aG91Z2ggdGhpcyBpcyBub3QgYW4gYWJzdHJhY3QgY2xhc3MsIGl0IHdhcyBuZXZlciBtZWFudCB0byAKLQkvLyBiZSBpbnN0YW50aWF0ZWQKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIGRvIG5vdGhpbmcsIGV2ZW4gdGhvdWdoIHRoaXMgaXMgbm90IGFuIGFic3RyYWN0IGNsYXNzLCBpdCB3YXMgbmV2ZXIgbWVhbnQgdG8gCi0JLy8gYmUgaW5zdGFudGlhdGVkCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCWRlY29yYXRpb25zLmNvbXB1dGVUcmltKDAsMCwwLDApOwotCWRlY29yYXRpb25zLmNvbXB1dGVUcmltKDAsMCwxMCwyMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2Rpc3Bvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEJvdW5kcyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudEFyZWEoKSB7Ci0JUmVjdGFuZ2xlIHJlY3QgPSBkZWNvcmF0aW9ucy5nZXRDbGllbnRBcmVhKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgcmVjdC5oZWlnaHQgPj0gMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgcmVjdC53aWR0aCA+PSAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0QnV0dG9uKCkgewotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGRlY29yYXRpb25zLCBTV1QuUFVTSCk7Ci0JZGVjb3JhdGlvbnMuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSA9PSBidXR0b24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlKCkgewotCUltYWdlW10gY2FzZXMgPSB7bnVsbCwgbmV3IEltYWdlKG51bGwsIDEwMCwgMTAwKX07Ci0JZm9yKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCQlkZWNvcmF0aW9ucy5zZXRJbWFnZShjYXNlc1tpXSk7Ci0JIAlhc3NlcnRFcXVhbHMoZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSwgY2FzZXNbaV0pOwotCSAJaWYgKGNhc2VzW2ldIT1udWxsKQotCSAgCQljYXNlc1tpXS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlcygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SW1hZ2VzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYXRpb24oKSB7Ci0JZGVjb3JhdGlvbnMuc2V0TG9jYXRpb24oMTAsMTUpOwotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldExvY2F0aW9uKCkueCA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgZGVjb3JhdGlvbnMuZ2V0TG9jYXRpb24oKS55ID09IDE1KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNYXhpbWl6ZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldE1heGltaXplZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZW51QmFyKCkgewotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldE1lbnVCYXIoKSA9PSBudWxsKTsKLQlNZW51IGJhciA9IG5ldyBNZW51IChkZWNvcmF0aW9ucywgU1dULkJBUik7Ci0JZGVjb3JhdGlvbnMuc2V0TWVudUJhciAoYmFyKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBkZWNvcmF0aW9ucy5nZXRNZW51QmFyKCkgPT0gYmFyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbWl6ZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldE1pbmltaXplZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3Qgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JZGVjb3JhdGlvbnMuc2V0VGV4dCgidGVzdCIpOwotCWFzc2VydFRydWUoIjphOiIsIGRlY29yYXRpb25zLmdldFRleHQoKS5lcXVhbHMoInRlc3QiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNSZXBhcmVudGFibGUoKSB7Ci0JLyogRGVjb3JhdGlvbnMgYXJlIG5vdCByZXBhcmVudGFibGUsIHNlZSB3aW4zMiBpbXBsZW1lbnRhdGlvbiBvZiBpc1JlcGFyZW50YWJsZSgpICovCi0JYXNzZXJ0RmFsc2UoZGVjb3JhdGlvbnMuaXNSZXBhcmVudGFibGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24oKSB7Ci0JYXNzZXJ0TnVsbChkZWNvcmF0aW9ucy5nZXREZWZhdWx0QnV0dG9uKCkpOwotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGRlY29yYXRpb25zLCBTV1QuTlVMTCk7Ci0JZGVjb3JhdGlvbnMuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCWFzc2VydFRydWUoImJ1dHRvbiBub3QgZGVmYXVsdCIsIGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSA9PSBidXR0b24pOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQlkZWNvcmF0aW9ucy5zZXREZWZhdWx0QnV0dG9uKG51bGwpOwotCQlhc3NlcnROdWxsKGRlY29yYXRpb25zLmdldERlZmF1bHRCdXR0b24oKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKCI6YToiLCBkZWNvcmF0aW9ucy5nZXRJbWFnZSgpKTsKLQlsb2FkSW1hZ2VzKCk7Ci0JZGVjb3JhdGlvbnMuc2V0SW1hZ2UoaW1hZ2VzWzBdKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBpbWFnZXNbMF0gPT0gZGVjb3JhdGlvbnMuZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgaW1hZ2VzWzFdICE9IGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWRlY29yYXRpb25zLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoIjpkOiIsIGRlY29yYXRpb25zLmdldEltYWdlKCkpOwotCWZyZWVJbWFnZXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbWl6ZWRaKCkgewotCWRlY29yYXRpb25zLnNldE1heGltaXplZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGVjb3JhdGlvbnMuZ2V0TWF4aW1pemVkKCkgPT0gZmFsc2UpOwotCWRlY29yYXRpb25zLnNldE1heGltaXplZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkZWNvcmF0aW9ucy5nZXRNYXhpbWl6ZWQoKSA9PSB0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkZWNvcmF0aW9ucy5nZXRNaW5pbWl6ZWQoKSA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCkgewotCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0TWVudSgpKTsKLQlNZW51IHRlc3RNZW51ID0gbmV3IE1lbnUoZGVjb3JhdGlvbnMpOwotCWRlY29yYXRpb25zLnNldE1lbnUodGVzdE1lbnUpOwotCWFzc2VydFRydWUoIkluY29ycmVjdCBtZW51IiwgZGVjb3JhdGlvbnMuZ2V0TWVudSgpID09IHRlc3RNZW51KTsKLQlkZWNvcmF0aW9ucy5zZXRNZW51KG51bGwpOwotCWFzc2VydE51bGwoZGVjb3JhdGlvbnMuZ2V0TWVudSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbWl6ZWRaKCkgewotCWRlY29yYXRpb25zLnNldE1pbmltaXplZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZGVjb3JhdGlvbnMuZ2V0TWluaW1pemVkKCkgPT0gZmFsc2UpOwotCWRlY29yYXRpb25zLnNldE1pbmltaXplZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkZWNvcmF0aW9ucy5nZXRNaW5pbWl6ZWQoKSA9PSB0cnVlKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkZWNvcmF0aW9ucy5nZXRNYXhpbWl6ZWQoKSA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWRlY29yYXRpb25zLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQlkZWNvcmF0aW9ucy5zZXRUZXh0KHRlc3RTdHIpOwotCWFzc2VydFRydWUoImEiLCBkZWNvcmF0aW9ucy5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlkZWNvcmF0aW9ucy5zZXRUZXh0KCIiKTsKLQlhc3NlcnRUcnVlKCJiIiwgZGVjb3JhdGlvbnMuZ2V0VGV4dCgpLmVxdWFscygiIikpOwotCXRyeSB7Ci0JCWRlY29yYXRpb25zLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRWaXNpYmxlWigpIHsKLQkvLyB0ZXN0IGluIHN1YmNsYXNzZXMKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2xpZW50QXJlYSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGVmYXVsdEJ1dHRvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TG9jYXRpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltaXplZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVudUJhciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW1pemVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1JlcGFyZW50YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltaXplZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1lbnVCYXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWluaW1pemVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NhbnZhcy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREZWZhdWx0QnV0dG9uIikpIHRlc3RfZ2V0RGVmYXVsdEJ1dHRvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2UiKSkgdGVzdF9nZXRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VzIikpIHRlc3RfZ2V0SW1hZ2VzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMb2NhdGlvbiIpKSB0ZXN0X2dldExvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbWl6ZWQiKSkgdGVzdF9nZXRNYXhpbWl6ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1lbnVCYXIiKSkgdGVzdF9nZXRNZW51QmFyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNaW5pbWl6ZWQiKSkgdGVzdF9nZXRNaW5pbWl6ZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNSZXBhcmVudGFibGUiKSkgdGVzdF9pc1JlcGFyZW50YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGVmYXVsdEJ1dHRvbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19CdXR0b24iKSkgdGVzdF9zZXREZWZhdWx0QnV0dG9uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0J1dHRvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNYXhpbWl6ZWRaIikpIHRlc3Rfc2V0TWF4aW1pemVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3Rfc2V0TWVudUJhckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNaW5pbWl6ZWRaIikpIHRlc3Rfc2V0TWluaW1pemVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRGVjb3JhdGlvbnMgZGVjb3JhdGlvbnM7Ci1JbWFnZVtdIGltYWdlcyA9IG5ldyBJbWFnZSBbU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aCpTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGhdOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlpZiAoZGVjb3JhdGlvbnMgIT0gbnVsbCAmJiAhZGVjb3JhdGlvbnMuaXNEaXNwb3NlZCgpKQotCQlkZWNvcmF0aW9ucy5kaXNwb3NlKCk7Ci0JZGVjb3JhdGlvbnMgPSAoRGVjb3JhdGlvbnMpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBsb2FkSW1hZ2VzKCkgewotCWludCBudW1Gb3JtYXRzID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aDsKLQlpbnQgbnVtRmlsZXMgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGg7Ci0JZm9yIChpbnQgaT0wOyBpPG51bUZvcm1hdHM7IGkrKykgewotCQlTdHJpbmcgZm9ybWF0ID0gU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzW2ldOwotCQlpbnQgaW5kZXggPSBpKm51bUZpbGVzOwotCQlmb3IgKGludCBqPTA7IGo8bnVtRmlsZXM7IGorKyl7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lc1tqXTsKLQkJCUlucHV0U3RyZWFtICByZXNvdXJjZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lICsgIi4iICsgZm9ybWF0KTsKLQkJCWltYWdlcyBbaW5kZXgral0gPSBuZXcgSW1hZ2UgKHNoZWxsLmdldERpc3BsYXkoKSwgcmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIHZvaWQgZnJlZUltYWdlcygpIHsKLQlmb3IgKGludCBpPTA7IGk8aW1hZ2VzLmxlbmd0aDsgaSsrKSBpbWFnZXNbaV0uZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTRhYzg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgZGlhbG9nLmdldFBhcmVudCgpID09IHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyB3ZSB1c2UgdGhpcyBjYWxsIGluIGEgQ29uc3RydWN0b3IgdGVzdCBzbyB0aGF0IHdlIGNhbgotCS8vIGNoZWNrIGlmIHRoZSBzdHlsZSBpcyB0aGUgb25lIHRoYXQgd2FzIGNyZWF0ZWQKLQlkaWFsb2cuZ2V0U3R5bGUoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGRpYWxvZy5nZXRUZXh0KCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQlkaWFsb2cuc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkaWFsb2cuZ2V0VGV4dCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGlhbG9nLnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGRpYWxvZy5nZXRUZXh0KCkuZXF1YWxzKCIiKSk7Ci0JdHJ5IHsKLQkJZGlhbG9nLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3R5bGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3R5bGUiKSkgdGVzdF9nZXRTdHlsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotfQotCi0vKiBjdXN0b20gKi8KLXB1YmxpYyBTaGVsbCBzaGVsbDsKLXByaXZhdGUgRGlhbG9nIGRpYWxvZzsKLXByaXZhdGUgaW50IGp1bml0U3R5bGU7Ci0KLXByb3RlY3RlZCB2b2lkIHNldERpYWxvZyhEaWFsb2cgbmV3RGlhbG9nKSB7Ci0JZGlhbG9nID0gbmV3RGlhbG9nOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlKSB7Ci0Jc3R5bGUgPSBqdW5pdFN0eWxlOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpcmVjdG9yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTgyNDhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaWFsb2cgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXJlY3RvcnlEaWFsb2coU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCWRpckRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXREaWFsb2coZGlyRGlhbG9nKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsKTsKLQl0cnkgewotCQluZXcgRGlyZWN0b3J5RGlhbG9nKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9CQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlclBhdGgoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNZXNzYWdlTGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9vcGVuKCkgewotCWlmIChmVGVzdERpYWxvZ09wZW4pCi0JCWRpckRpYWxvZy5vcGVuKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gIi4vKiI7Ci0JZGlyRGlhbG9nLnNldEZpbHRlclBhdGgodGVzdFN0cik7Ci0JYXNzZXJ0VHJ1ZSgiOjI6IiwgZGlyRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHModGVzdFN0cikpOwotCWRpckRpYWxvZy5zZXRGaWx0ZXJQYXRoKCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBkaXJEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscygiIikpOwotCWRpckRpYWxvZy5zZXRGaWx0ZXJQYXRoKG51bGwpOwotCWFzc2VydFRydWUoIjo0OiIsIGRpckRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWFzc2VydFRydWUoIjoxOiIsIGRpckRpYWxvZy5nZXRNZXNzYWdlKCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQlkaXJEaWFsb2cuc2V0TWVzc2FnZSh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCI6MjoiLCBkaXJEaWFsb2cuZ2V0TWVzc2FnZSgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZGlyRGlhbG9nLnNldE1lc3NhZ2UoIiIpOwotCWFzc2VydFRydWUoIjozOiIsIGRpckRpYWxvZy5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSk7Ci0JdHJ5IHsKLQkJZGlyRGlhbG9nLnNldE1lc3NhZ2UobnVsbCk7Ci0JCWZhaWwgKCJudWxsIGFyZ3VtZW50IGRpZCBub3QgdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlyZWN0b3J5RGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZpbHRlclBhdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lc3NhZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWx0ZXJQYXRoIikpIHRlc3RfZ2V0RmlsdGVyUGF0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVzc2FnZSIpKSB0ZXN0X2dldE1lc3NhZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLURpcmVjdG9yeURpYWxvZyBkaXJEaWFsb2c7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkYmRjNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0JLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lIERpc3BsYXkgb2JqZWN0IHBlciB0aHJlYWQuCi0JLy8gSWYgYSBzZWNvbmQgRGlzcGxheSBpcyBjcmVhdGVkIG9uIHRoZSBzYW1lIHRocmVhZCwgYW4gCi0JLy8gSW52YWxpZFRocmVhZEFjY2Vzc0V4Y2VwdGlvbiBpcyB0aHJvd24uCi0JLy8KLQkvLyBFYWNoIHRlc3Qgd2lsbCBjcmVhdGUgaXRzIG93biBEaXNwbGF5IGFuZCBtdXN0IGRpc3Bvc2Ugb2YgaXQgCi0JLy8gYmVmb3JlIGNvbXBsZXRpbmcuCi19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCURpc3BsYXkgZGlzcCA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKSB7Ci0JRGlzcGxheSBkaXNwOwotCWRpc3AgPSBuZXcgRGlzcGxheShudWxsKTsKLQlkaXNwLmRpc3Bvc2UoKTsKLQkKLQlkaXNwID0gbmV3IERpc3BsYXkobmV3IERldmljZURhdGEoKSk7Ci0JZGlzcC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRmlsdGVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQlmaW5hbCBpbnQgQ0xPU0VfQ0FMTEJBQ0sgPSAwOwotCWZpbmFsIGludCBESVNQT1NFX0NBTExCQUNLID0gMTsKLQlmaW5hbCBib29sZWFuW10gY2FsbGJhY2tSZWNlaXZlZCA9IG5ldyBib29sZWFuW10ge2ZhbHNlLCBmYWxzZX07Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWlmIChlLnR5cGUgPT0gU1dULkNsb3NlKQotCQkJCWNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUudHlwZSA9PSBTV1QuRGlzcG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQl0cnkgewotCQkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULkRpc3Bvc2UsIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkRmlsdGVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWRkRmlsdGVyIHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJZGlzcGxheS5hZGRGaWx0ZXIoU1dULkNsb3NlLCBsaXN0ZW5lcik7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5jbG9zZSgpOwotCX0KLQlhc3NlcnRUcnVlKGNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdKTsKLQlhc3NlcnRGYWxzZShjYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JZmluYWwgaW50IENMT1NFX0NBTExCQUNLID0gMDsKLQlmaW5hbCBpbnQgRElTUE9TRV9DQUxMQkFDSyA9IDE7Ci0JZmluYWwgYm9vbGVhbltdIGNhbGxiYWNrUmVjZWl2ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5DbG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCQllbHNlIGlmIChlLnR5cGUgPT0gU1dULkRpc3Bvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCX0KLQl9OwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkuYWRkTGlzdGVuZXIoU1dULkNsb3NlLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgYWRkTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5jbG9zZSgpOwotCX0KLQlhc3NlcnRGYWxzZSgiOmE6IiwgY2FsbGJhY2tSZWNlaXZlZFtDTE9TRV9DQUxMQkFDS10pOwotCWFzc2VydFRydWUoIjpiOiIsIGNhbGxiYWNrUmVjZWl2ZWRbRElTUE9TRV9DQUxMQkFDS10pOwotCi0JZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5hZGRMaXN0ZW5lcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydFRydWUoIjpjOiIsIGNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3BsYXkuYmVlcCgpOwotCQkJfQotCQl9KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYmVlcCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuYmVlcCgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWRpc3BsYXkuY2xvc2UoKTsKLQlhc3NlcnRUcnVlKGRpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JLy8gQWxzbyB0ZXN0cyBkaXNwb3NlIGFuZCBpc0Rpc3Bvc2VkCi0JRGlzcGxheSB0ZXN0RGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JZGlzcG9zZUV4ZWNSYW4gPSBmYWxzZTsKLQl0ZXN0RGlzcGxheS5kaXNwb3NlRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWRpc3Bvc2VFeGVjUmFuID0gdHJ1ZTsKLQkJfQotCX0pOwotCWFzc2VydEVxdWFscygiRGlzcGxheSBzaG91bGQgbm90IGJlIGRpc3Bvc2VkIiwgZmFsc2UsIHRlc3REaXNwbGF5LmlzRGlzcG9zZWQoKSk7Ci0JdGVzdERpc3BsYXkuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoIkRpc3BsYXkgc2hvdWxkIGJlIGRpc3Bvc2VkIiwgdGVzdERpc3BsYXkuaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRUcnVlKCJEaXNwb3NlRXhlYyBSdW5uYWJsZSBkaWQgbm90IHJ1biIsIGRpc3Bvc2VFeGVjUmFuKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkKCkgewotCWFzc2VydE51bGwoRGlzcGxheS5maW5kRGlzcGxheShuZXcgVGhyZWFkKCkpKTsKLQkKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWFzc2VydEVxdWFscyhkaXNwbGF5LCBEaXNwbGF5LmZpbmREaXNwbGF5KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZmluZFdpZGdldEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2ZpbmRXaWRnZXRJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWN0aXZlU2hlbGwoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwub3BlbigpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKSA9PSBzaGVsbCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlhc3NlcnROb3ROdWxsKHJlY3QpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBkaXNwbGF5LmdldENsaWVudEFyZWEoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWN0KTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3VycmVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q3Vyc29yQ29udHJvbCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuZ2V0Q3Vyc29yQ29udHJvbCgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDdXJzb3JMb2NhdGlvbigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVBvaW50IHB0ID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOwotCQlhc3NlcnROb3ROdWxsKHB0KTsKLQkJYXNzZXJ0VHJ1ZShwdC54ID49IDApOwotCQlhc3NlcnRUcnVlKHB0LnkgPj0gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEN1cnNvclNpemUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEN1cnNvclNpemUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhKCkgewotCS8vIHRlc3RlZCBpbiBzZXREYXRhKE9iamVjdCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCS8vIHRlc3RlZCBpbiBzZXREYXRhKFN0cmluZywgT2JqZWN0KSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZWZhdWx0KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJYXNzZXJ0Tm90TnVsbChEaXNwbGF5LmdldERlZmF1bHQoKSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERpc21pc3NhbEFsaWdubWVudCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBhbGlnbm1lbnQgPSBkaXNwbGF5LmdldERpc21pc3NhbEFsaWdubWVudCgpOwotCQlhc3NlcnRUcnVlKCJnZXREaXNtaXNzYWxBbGlnbm1lbnQgc2hvdWxkIHJldHVybiBTV1QuTEVGVCBvciBTV1QuUklHSFQiLAotCQkJYWxpZ25tZW50ID09IFNXVC5MRUZUIHx8IGFsaWdubWVudCA9PSBTV1QuUklHSFQpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREb3VibGVDbGlja1RpbWUoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlpbnQgdGltZSA9IGRpc3BsYXkuZ2V0RG91YmxlQ2xpY2tUaW1lKCk7Ci0JCWFzc2VydFRydWUodGltZSA+IDApOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb2N1c0NvbnRyb2woKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LmdldEZvY3VzQ29udHJvbCgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJY29uRGVwdGgoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlpbnQgZGVwdGggPSBkaXNwbGF5LmdldEljb25EZXB0aCgpOwotCQlhc3NlcnRUcnVlKGRlcHRoID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1vbml0b3JzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JTW9uaXRvcltdIG1vbml0b3JzID0gZGlzcGxheS5nZXRNb25pdG9ycygpOwotCWFzc2VydE5vdE51bGwobW9uaXRvcnMpOwotCWFzc2VydFRydWUoImF0IGxlYXN0IG9uZSBtb25pdG9yIHNob3VsZCBiZSByZXR1cm5lZCIsIG1vbml0b3JzLmxlbmd0aCA+PSAxKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKQotCQlhc3NlcnRUcnVlKCJtb25pdG9yIGF0IGluZGV4ICIraSsiIHNob3VsZCBub3QgYmUgbnVsbCIsIG1vbml0b3JzW2ldICE9IG51bGwpOwotCWRpc3BsYXkuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlNb25pdG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JTW9uaXRvciBtb25pdG9yID0gZGlzcGxheS5nZXRQcmltYXJ5TW9uaXRvcigpOwotCWFzc2VydE5vdE51bGwobW9uaXRvcik7Ci0JZGlzcGxheS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGxzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJU2hlbGwgc2hlbGwxID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRTaGVsbHMoKS5sZW5ndGggPT0gMik7Ci0JCXNoZWxsMS5kaXNwb3NlKCk7Ci0JCXNoZWxsMi5kaXNwb3NlKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5bmNUaHJlYWQoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlmaW5hbCBib29sZWFuW10gdGhyZWFkUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQlUaHJlYWQgbm9uVUlUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkvLyBBc3N1bWUgbm8gc3luY0V4ZWMgcnVubmFibGUgaXMgY3VycmVudGx5IGJlaW5nIGludm9rZWQuCi0JCQkJYXNzZXJ0TnVsbChkaXNwbGF5LmdldFN5bmNUaHJlYWQoKSk7Ci0JCQkJCi0JCQkJLy8gQ3JlYXRlIGEgcnVubmFibGUgYW5kIGludm9rZSB3aXRoIHN5bmNFeGVjIHRvIHZlcmlmeSB0aGF0Ci0JCQkJLy8gdGhlIGludm9raW5nIHRocmVhZCBpcyB0aGUgc3luY1RocmVhZC4KLQkJCQlmaW5hbCBUaHJlYWQgaW52b2tpbmdUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlhc3NlcnRFcXVhbHMoaW52b2tpbmdUaHJlYWQsIGRpc3BsYXkuZ2V0U3luY1RocmVhZCgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCQotCQkJCS8vIENyZWF0ZSBhIHJ1bm5hYmxlIGFuZCBpbnZva2Ugd2l0aCBhc3luY0V4ZWMgdG8gdmVyaWZ5IHRoYXQKLQkJCQkvLyB0aGUgc3luY1RocmVhZCBpcyBudWxsIHdoaWxlIGl0J3MgcnVubmluZy4KLQkJCQlmaW5hbCBib29sZWFuW10gYXN5bmNFeGVjUmFuID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJYXNzZXJ0TnVsbChkaXNwbGF5LmdldFN5bmNUaHJlYWQoKSk7Ci0JCQkJCQlhc3luY0V4ZWNSYW5bMF0gPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKCFhc3luY0V4ZWNSYW5bMF0pIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQkJdGhyZWFkUmFuWzBdID0gdHJ1ZTsKLQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCX0KLQkJfSk7Ci0JCW5vblVJVGhyZWFkLnN0YXJ0KCk7Ci0JCQotCQl3aGlsZSAoIXRocmVhZFJhblswXSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwICgpOwotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN5c3RlbUNvbG9ySSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBbXSBjb2xvcklkcyA9IHsKLQkJCVNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1csIFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVywKLQkJCVNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XLCBTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1csCi0JCQlTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQsIFNXVC5DT0xPUl9XSURHRVRfQk9SREVSLAotCQkJU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5ELCBTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5ELAotCQkJU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCwgU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OLAotCQkJU1dULkNPTE9SX0xJU1RfU0VMRUNUSU9OX1RFWFQsCi0JCX07Ci0JCWZvciAoaW50IGk9MDsgaSA8IGNvbG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnROb3ROdWxsKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoY29sb3JJZHNbaV0pKTsKLQkJfQotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTeXN0ZW1Gb250KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJRm9udCBmb250ID0gZGlzcGxheS5nZXRTeXN0ZW1Gb250KCk7Ci0JCWFzc2VydE5vdE51bGwoZm9udCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRocmVhZCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBBUEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpIHsKLQkvLyBkbyBub3QgdGVzdCBpbnRlcm5hbCBBUEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCVBvaW50IHJlc3VsdDsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDAsLTEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIC0xMCwgLTIwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjEwLC0xMjApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAzMCwgNDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0xNzAsLTYwKSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIDAsIDApOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAtNSwgLTE1KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgxOTUsODUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAyNSwgMzUpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIyNSwxMzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMCwgMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCAtMiwgLTQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDIgLSBzaGVsbE9mZnNldC54LC0xMDQgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgNiwgOCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE5NCAtIHNoZWxsT2Zmc2V0LngsLTkyIC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjAwLHNoZWxsT2Zmc2V0LnkgKyAxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAtMywgLTYpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgOSwgMTIpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KHNoZWxsT2Zmc2V0LnggKyAyMDksc2hlbGxPZmZzZXQueSArIDExMiksIHJlc3VsdCk7Ci0JCQotCQlidXR0b24xLmRpc3Bvc2UoKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIDAsIDApOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgMCwgMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJSUkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlQb2ludCBzaGVsbE9mZnNldCA9IHNoZWxsLmdldExvY2F0aW9uKCk7Ci0JCVJlY3RhbmdsZSByZXN1bHQ7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDAsLTEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgLTEwLCAtMjAsIDEzMCwgMTQwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIxMCwtMTIwLDEzMCwxNDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCA1MCwgNjAsIDE3MCwgMTgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE1MCwtNDAsMTcwLDE4MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDIwMCwxMDAsMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIC01LCAtMTUsIDEyNSwgMTM1KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMTk1LDg1LDEyNSwxMzUpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCA0NSwgNTUsIDE2NSwgMTc1KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjQ1LDE1NSwxNjUsMTc1KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIDAsIDAsIDEwMCwgMTAwKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnksMTAwLDEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIC0yLCAtNCwgMTA2LCAxMDgpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSwxMDYsMTA4KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgMTAsIDEyLCAxMTQsIDExNik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0xOTAgLSBzaGVsbE9mZnNldC54LC04OCAtIHNoZWxsT2Zmc2V0LnksMTE0LDExNiksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgLTMsIC02LCAxMDksIDExMik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0LDEwOSwxMTIpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCAxNSwgMTgsIDEyMSwgMTI0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIxNSxzaGVsbE9mZnNldC55ICsgMTE4LDEyMSwxMjQpLCByZXN1bHQpOwotCQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgZnJvbSBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCAwLCAwLCAxMDAsIDEwMCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBtYXAgdG8gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24xLnNldEJvdW5kcygwLDAsMTAwLDEwMCk7Ci0JCUJ1dHRvbiBidXR0b24yID0gbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotCQlidXR0b24yLnNldEJvdW5kcygyMDAsMTAwLDEwMCwxMDApOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwwLDQwMCw0MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JCQotCQlQb2ludCByZXN1bHQ7Ci0JCVBvaW50IHBvaW50ID0gbmV3IFBvaW50KDAsMCk7Ci0JCVBvaW50IHNoZWxsT2Zmc2V0ID0gc2hlbGwuZ2V0TG9jYXRpb24oKTsKLQotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KC0yMDAsLTEwMCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjEsIGJ1dHRvbjIsIG5ldyBQb2ludCgtMTAsLTIwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIxMCwtMTIwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFBvaW50KDMwLDQwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTE3MCwtNjApLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcG9pbnQpOwotCQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCBuZXcgUG9pbnQoLTUsLTE1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMTk1LDg1KSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFBvaW50KDI1LDM1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMjI1LDEzNSksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCBwb2ludCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoLTIwMCAtIHNoZWxsT2Zmc2V0LngsLTEwMCAtIHNoZWxsT2Zmc2V0LnkpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCBuZXcgUG9pbnQoLTIsLTQpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMjAyIC0gc2hlbGxPZmZzZXQueCwtMTA0IC0gc2hlbGxPZmZzZXQueSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBQb2ludCg2LDgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCgtMTk0IC0gc2hlbGxPZmZzZXQueCwtOTIgLSBzaGVsbE9mZnNldC55KSwgcmVzdWx0KTsKLQkJCi0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIHBvaW50KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMjAwLHNoZWxsT2Zmc2V0LnkgKyAxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUG9pbnQoLTMsLTYpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBQb2ludChzaGVsbE9mZnNldC54ICsgMTk3LHNoZWxsT2Zmc2V0LnkgKyA5NCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIG51bGwsIG5ldyBQb2ludCg5LDEyKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoc2hlbGxPZmZzZXQueCArIDIwOSxzaGVsbE9mZnNldC55ICsgMTEyKSwgcmVzdWx0KTsKLQkJCi0JCWJ1dHRvbjEuZGlzcG9zZSgpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgcG9pbnQpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIGZyb20gY29udHJvbCBiZWluZyBkaXNwb3NlZCIsIFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5ULCBlKTsKLQkJfQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgcG9pbnQpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgKFBvaW50KSBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG51bGwgcG9pbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvaW50IGJlaW5nIG51bGwiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCXNoZWxsLmRpc3Bvc2UoKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotCQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uMS5zZXRCb3VuZHMoMCwwLDEwMCwxMDApOwotCQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQkJYnV0dG9uMi5zZXRCb3VuZHMoMjAwLDEwMCwxMDAsMTAwKTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsMCw0MDAsNDAwKTsKLQkJc2hlbGwub3BlbigpOwotCQkKLQkJUmVjdGFuZ2xlIHJlc3VsdDsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKDAsMCwxMDAsMTAwKTsKLQkJUG9pbnQgc2hlbGxPZmZzZXQgPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgcmVjdCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDAsLTEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMSwgYnV0dG9uMiwgbmV3IFJlY3RhbmdsZSgtMTAsIC0yMCwgMTMwLCAxNDApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIxMCwtMTIwLDEzMCwxNDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKDUwLCA2MCwgMTcwLCAxODApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTE1MCwtNDAsMTcwLDE4MCksIHJlc3VsdCk7Ci0JCQotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBidXR0b24xLCByZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMjAwLDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgbmV3IFJlY3RhbmdsZSgtNSwgLTE1LCAxMjUsIDEzNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgxOTUsODUsMTI1LDEzNSksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIG5ldyBSZWN0YW5nbGUoNDUsIDU1LCAxNjUsIDE3NSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgyNDUsMTU1LDE2NSwxNzUpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAobnVsbCwgYnV0dG9uMiwgcmVjdCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKC0yMDAgLSBzaGVsbE9mZnNldC54LC0xMDAgLSBzaGVsbE9mZnNldC55LDEwMCwxMDApLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChudWxsLCBidXR0b24yLCBuZXcgUmVjdGFuZ2xlKC0yLCAtNCwgMTA2LCAxMDgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoLTIwMiAtIHNoZWxsT2Zmc2V0LngsLTEwNCAtIHNoZWxsT2Zmc2V0LnksMTA2LDEwOCksIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGRpc3BsYXkubWFwKG51bGwsIGJ1dHRvbjIsIG5ldyBSZWN0YW5nbGUoMTAsIDEyLCAxMTQsIDExNikpOwotCQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgtMTkwIC0gc2hlbGxPZmZzZXQueCwtODggLSBzaGVsbE9mZnNldC55LDExNCwxMTYpLCByZXN1bHQpOwotCQkKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgcmVjdCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAyMDAsc2hlbGxPZmZzZXQueSArIDEwMCwxMDAsMTAwKSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgbnVsbCwgbmV3IFJlY3RhbmdsZSgtMywgLTYsIDEwOSwgMTEyKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKHNoZWxsT2Zmc2V0LnggKyAxOTcsc2hlbGxPZmZzZXQueSArIDk0LDEwOSwxMTIpLCByZXN1bHQpOwotCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24yLCBudWxsLCBuZXcgUmVjdGFuZ2xlKDE1LCAxOCwgMTIxLCAxMjQpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoc2hlbGxPZmZzZXQueCArIDIxNSxzaGVsbE9mZnNldC55ICsgMTE4LDEyMSwxMjQpLCByZXN1bHQpOwotCQkKLQkKLQkJYnV0dG9uMS5kaXNwb3NlKCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBkaXNwbGF5Lm1hcChidXR0b24xLCBidXR0b24yLCByZWN0KTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCBmcm9tIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiLCBTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRpc3BsYXkubWFwKGJ1dHRvbjIsIGJ1dHRvbjEsIHJlY3QpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgbWFwIHRvIGNvbnRyb2wgYmVpbmcgZGlzcG9zZWQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIG1hcCB0byBjb250cm9sIGJlaW5nIGRpc3Bvc2VkIiwgU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmVzdWx0ID0gZGlzcGxheS5tYXAoYnV0dG9uMiwgYnV0dG9uMSwgKFJlY3RhbmdsZSkgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIHBvaW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciByZWN0YW5nbGUgYmVpbmcgbnVsbCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCkgewotCWZpbmFsIGludCBLRVlDT0RFID0gU1dULlNISUZUOwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkucG9zdChudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBvc3Qgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBwb3N0IHdpdGggbnVsbCBhcmd1bWVudCIsIFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5ULCBlKTsKLQkJfQotCQkKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgU1dULk5PX1RSSU0pOwotCQlzaGVsbC5zZXRCb3VuZHMoZGlzcGxheS5nZXRCb3VuZHMoKSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQotCQlFdmVudCBldmVudDsKLQkJCi0JCS8vIFRlc3Qga2V5IGV2ZW50cyAoZG93bi91cCkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQlldmVudC5rZXlDb2RlID0gLTE7ICAJCQkJLy8gYm9ndXMga2V5IGNvZGUKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsJLy8gdXNlcyBkZWZhdWx0IDAgY2hhcmFjdGVyCi0JCS8vIGRvbid0IHRlc3QgS2V5RG93bi9LZXlVcCB3aXRoIGEgY2hhcmFjdGVyIHRvIGF2b2lkIHNlbmRpbmcgdG8gCi0JCS8vIHJhbmRvbSB3aW5kb3cgaWYgdGVzdCBzaGVsbCBsb29zZXMgZm9jdXMKLQkJCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuS2V5VXA7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0KLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlEb3duOwotCQlldmVudC5rZXlDb2RlID0gS0VZQ09ERTsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5LZXlVcDsKLQkJc2hlbGwuc2V0Rm9jdXMoKTsKLQkJYXNzZXJ0VHJ1ZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsKLQkJCi0JCS8vIFRlc3QgbW91c2UgZXZlbnRzIChkb3duL3VwL21vdmUpCi0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VNb3ZlOwotCQlSZWN0YW5nbGUgYm91bmRzID0gc2hlbGwuZ2V0Qm91bmRzKCk7Ci0JCWV2ZW50LnggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aC8yOwotCQlldmVudC55ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0LzI7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlldmVudCA9IG5ldyBFdmVudCgpOwotCQlldmVudC50eXBlID0gU1dULk1vdXNlRG93bjsKLQkJYXNzZXJ0RmFsc2UoZGlzcGxheS5wb3N0KGV2ZW50KSk7ICAvLyBtaXNzaW5nIGJ1dHRvbgotCQlldmVudC5idXR0b24gPSAxOwotCQlzaGVsbC5zZXRGb2N1cygpOwotCQlhc3NlcnRUcnVlKGRpc3BsYXkucG9zdChldmVudCkpOwotCQkKLQkJZXZlbnQgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQudHlwZSA9IFNXVC5Nb3VzZVVwOwotCQlhc3NlcnRGYWxzZShkaXNwbGF5LnBvc3QoZXZlbnQpKTsgIC8vIG1pc3NpbmcgYnV0dG9uCi0JCWV2ZW50LmJ1dHRvbiA9IDE7Ci0JCXNoZWxsLnNldEZvY3VzKCk7Ci0JCWFzc2VydFRydWUoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQkvLyBUZXN0IHVuc3VwcG9ydGVkIGV2ZW50Ci0JCWV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LnR5cGUgPSBTV1QuTW91c2VEb3VibGVDbGljazsKLQkJYXNzZXJ0RmFsc2UoZGlzcGxheS5wb3N0KGV2ZW50KSk7Ci0JCQotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQotCQkvLyBjYW4ndCB2ZXJpZnkgdGhhdCB0aGUgZXZlbnRzIHdlcmUgYWN0dWFsbHkgc2VudCB0byBhIGxpc3RlbmVyLgotCQkvLyB0aGUgdGVzdCBzaGVsbCB3b24ndCByZWNlaXZlIGFueSBldmVudHMgaWYgaXQgaGFzIGxvc3QgZm9jdXMsIAotCQkvLyBlLmcuLCBkdWUgdG8gdXNlciBpbnRlcnZlbnRpb24gb3IgYW5vdGhlciBwcm9jZXNzIHBvcHBpbmcgdXAgCi0JCS8vIGEgd2luZG93LiAKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVhZEFuZERpc3BhdGNoKCkgewotCS8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgcmVseSBvbiByZWFkQW5kRGlzcGF0Y2ggaW4gb3JkZXIgdG8gc3VjY2VlZCwKLQkvLyB0aHVzIG5vIHRlc3QgaXMgbmVlZGVkIGhlcmUuCi0JLy8gICAgdGVzdF9nZXRTeW5jVGhyZWFkKCkKLQkvLyAgICB0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JZmluYWwgaW50IENMT1NFX0NBTExCQUNLID0gMDsKLQlmaW5hbCBpbnQgRElTUE9TRV9DQUxMQkFDSyA9IDE7Ci0JZmluYWwgYm9vbGVhbltdIGNhbGxiYWNrUmVjZWl2ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5DbG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCQllbHNlIGlmIChlLnR5cGUgPT0gU1dULkRpc3Bvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCX0KLQl9OwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkucmVtb3ZlRmlsdGVyKFNXVC5EaXNwb3NlLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUZpbHRlciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUZpbHRlciB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkuYWRkRmlsdGVyKFNXVC5DbG9zZSwgbGlzdGVuZXIpOwotCQlkaXNwbGF5LnJlbW92ZUZpbHRlcihTV1QuQ2xvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdKTsKLQlhc3NlcnRGYWxzZShjYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKSB7Ci0JZmluYWwgaW50IENMT1NFX0NBTExCQUNLID0gMDsKLQlmaW5hbCBpbnQgRElTUE9TRV9DQUxMQkFDSyA9IDE7Ci0JZmluYWwgYm9vbGVhbltdIGNhbGxiYWNrUmVjZWl2ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgZmFsc2V9OwotCQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlpZiAoZS50eXBlID09IFNXVC5DbG9zZSkKLQkJCQljYWxsYmFja1JlY2VpdmVkW0NMT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCQllbHNlIGlmIChlLnR5cGUgPT0gU1dULkRpc3Bvc2UpCi0JCQkJY2FsbGJhY2tSZWNlaXZlZFtESVNQT1NFX0NBTExCQUNLXSA9IHRydWU7Ci0JCX0KLQl9OwotCQotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkucmVtb3ZlTGlzdGVuZXIoU1dULkNsb3NlLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgZXhjZXB0aW9uIHRocm93biBmb3IgcmVtb3ZlTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQlkaXNwbGF5LmFkZExpc3RlbmVyKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0JCWRpc3BsYXkucmVtb3ZlTGlzdGVuZXIoU1dULkRpc3Bvc2UsIGxpc3RlbmVyKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmNsb3NlKCk7Ci0JfQotCWFzc2VydEZhbHNlKGNhbGxiYWNrUmVjZWl2ZWRbQ0xPU0VfQ0FMTEJBQ0tdKTsKLQlhc3NlcnRGYWxzZShjYWxsYmFja1JlY2VpdmVkW0RJU1BPU0VfQ0FMTEJBQ0tdKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZWxlYXNlKCkgewotCS8vIE92ZXJyaWRpbmcgdGVzdF9yZWxlYXNlIGZyb20gRGV2aWNlLgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFwcE5hbWVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlEaXNwbGF5LnNldEFwcE5hbWUoIk15IEFwcGxpY2F0aW9uIE5hbWUiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDdXJzb3JMb2NhdGlvbklJKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXRDdXJzb3JMb2NhdGlvbigwLDApOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDdXJzb3JMb2NhdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnNldEN1cnNvckxvY2F0aW9uKG5ldyBQb2ludCgwLDApKTsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkuc2V0Q3Vyc29yTG9jYXRpb24obnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBleGNlcHRpb24gdGhyb3duIGZvciBzZXRDdXJzb3JMb2NhdGlvbiB3aXRoIG51bGwgYXJndW1lbnQiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5zZXREYXRhKG5ldyBJbnRlZ2VyKDEwKSk7Ci0JCUludGVnZXIgaSA9IChJbnRlZ2VyKWRpc3BsYXkuZ2V0RGF0YSgpOwotCQlhc3NlcnROb3ROdWxsKGkpOwotCQlhc3NlcnRUcnVlKGkuZXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSkpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0RGF0YSgiSW50ZWdlciIsIG5ldyBJbnRlZ2VyKDEwKSk7Ci0JCWRpc3BsYXkuc2V0RGF0YSgiU3RyaW5nIiwgInh5eiIpOwotCQlJbnRlZ2VyIGkgPSAoSW50ZWdlcilkaXNwbGF5LmdldERhdGEoIkludGVnZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpKTsKLQkJYXNzZXJ0VHJ1ZShpLmVxdWFscyhuZXcgSW50ZWdlcigxMCkpKTsKLQkJU3RyaW5nIHMgPSAoU3RyaW5nKWRpc3BsYXkuZ2V0RGF0YSgiU3RyaW5nIik7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydFRydWUocy5lcXVhbHMoInh5eiIpKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3luY2hyb25pemVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcigpIHsKLQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCWZpbmFsIGJvb2xlYW5bXSBhc3luY0V4ZWNSYW4gPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JCi0JdHJ5IHsKLQkJdHJ5IHsKLQkJCWRpc3BsYXkuc2V0U3luY2hyb25pemVyKG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcG9zdCB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNldCBzeW5jaHJvbml6ZXIgd2l0aCBudWxsIGFyZ3VtZW50IiwgU1dULkVSUk9SX05VTExfQVJHVU1FTlQsIGUpOwotCQl9Ci0JCQotCQljbGFzcyBNeVN5bmNocm9uaXplciBleHRlbmRzIFN5bmNocm9uaXplciB7Ci0JCQlib29sZWFuIGludm9rZWQgPSBmYWxzZTsKLQkJCU15U3luY2hyb25pemVyKERpc3BsYXkgZCkgewotCQkJCXN1cGVyKGQpOwotCQkJfQotCQkJcHJvdGVjdGVkIHZvaWQgYXN5bmNFeGVjIChSdW5uYWJsZSBydW5uYWJsZSkgewotCQkJCWludm9rZWQgPSB0cnVlOwotCQkJCXN1cGVyLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU15U3luY2hyb25pemVyIG15U3luY2hyb25pemVyID0gbmV3IE15U3luY2hyb25pemVyKGRpc3BsYXkpOwotCQlkaXNwbGF5LnNldFN5bmNocm9uaXplcihteVN5bmNocm9uaXplcik7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhc3luY0V4ZWNSYW5bMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJd2hpbGUgKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9Ci0JCWFzc2VydFRydWUobXlTeW5jaHJvbml6ZXIuaW52b2tlZCk7Ci0JCWFzc2VydFRydWUoYXN5bmNFeGVjUmFuWzBdKTsKLQl9IGZpbmFsbHkgewotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2xlZXAoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlUaHJlYWQgdGhyZWFkOwotCQlib29sZWFuIGV2ZW50UXVldWVkOwotCQkKLQkJLy8gRW5zdXJlIGV2ZW50IHF1ZXVlIGlzIGVtcHR5LCBvdGhlcndpc2Ugc2xlZXAoKSB3aWxsIGp1c3QgcmV0dXJuLgotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSB7fQotCQl0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIERlbGF5IHRvIGVuc3VyZSB0aGUgVUkgdGhyZWFkIGhhcyBiZWVuIHB1dCB0byBzbGVlcC4KLQkJCQkJc2xlZXAoMzAwMCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQkJLy8gVXNlIHdha2UoKSB0byByZXZpdmUgZnJvbSBzbGVlcCgpLgotCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJfQotCQl9OwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJLy8gTm90ZSB0aGF0IHNsZWVwIHNlZW1zIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSwgYXQgbGVhc3QKLQkJLy8gb24gV2luZG93cywgc2luY2Ugd2FrZSgpIHVzZXMgYSBudWxsIGV2ZW50LiAKLQkJZXZlbnRRdWV1ZWQgPSBkaXNwbGF5LnNsZWVwKCk7Ci0JCQotCQkvLyBFbnN1cmUgZXZlbnQgcXVldWUgaXMgZW1wdHksIG90aGVyd2lzZSBzbGVlcCgpIHdpbGwganVzdCByZXR1cm4uCi0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIHt9Ci0JCXRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRGVsYXkgdG8gZW5zdXJlIHRoZSBVSSB0aHJlYWQgaGFzIGJlZW4gcHV0IHRvIHNsZWVwLgotCQkJCQlzbGVlcCgzMDAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCQkvLyBDYXVzZSBPUyB0byBnZW5lcmF0ZSBhbiBldmVudCB0byByZXZpdmUgZnJvbSBzbGVlcCgpLgotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlTaGVsbCBzID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCQkJcy5vcGVuKCk7Ci0JCQkJCQlzLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJZXZlbnRRdWV1ZWQgPSBkaXNwbGF5LnNsZWVwKCk7Ci0JCWFzc2VydFRydWUoZXZlbnRRdWV1ZWQpOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUoKSB7Ci0JZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQl0cnkgewotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkaXNwbGF5LmJlZXAoKTsKLQkJCX0KLQkJfSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlKCkgewotCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVyRXhlY1JhbiA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJZmluYWwgYm9vbGVhbltdIHRocmVhZFJhbiA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJCi0JCXRyeSB7Ci0JCQlkaXNwbGF5LnRpbWVyRXhlYygwLCBudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRpbWVyRXhlYyB3aXRoIG51bGwgcnVubmFibGUiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRpbWVyRXhlYyB3aXRoIG51bGwgcnVubmFibGUiLCBTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCwgZSk7Ci0JCX0KLQkJCi0JCWRpc3BsYXkudGltZXJFeGVjKC0xMDAsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0aW1lckV4ZWNSYW5bMF0gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJCQkKLQkJZmluYWwgaW50IGRlbGF5ID0gMzAwMDsKLQkJZmluYWwgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZGlzcGxheS50aW1lckV4ZWMoZGVsYXksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkvLyBkZWJ1ZyBpbnRlcm1pdHRlbnQgdGVzdCBmYWlsdXJlCi0JCQkJaWYgKGVuZFRpbWUgPCAoc3RhcnRUaW1lICsgZGVsYXkpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGlzcGxheS50aW1lckV4ZWMgcmFuIGVhcmx5ICIgKyAoKHN0YXJ0VGltZSArIGRlbGF5KSAtIGVuZFRpbWUpKTsKLQkJCQl9Ci0JCQkJLy9hc3NlcnRUcnVlKCJUaW1lciByYW4gZWFybHkhIG1zIGVhcmx5OiAiLCBlbmRUaW1lID49IChzdGFydFRpbWUgKyBkZWxheSkpOwotCQkJCXRocmVhZFJhblswXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl3aGlsZSAoIXRocmVhZFJhblswXSkgewotCQkJLy8gVGhlIHJlYWQgYW5kIGRpc3BhdGNoIGxvb3AgbXVzdCBiZSBydW5uaW5nIGluIG9yZGVyCi0JCQkvLyBmb3IgdGhlIHJ1bm5hYmxlIGluIHRoZSB0aW1lciBleGVjIHRvIGJlIGV4ZWN1dGVkLgotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCQotCQkvLyBWZXJpZnkgdGhlIHRpbWVyRXhlYyB3aXRoIGxlc3MgdGhhbiB6ZXJvIG1pbGxpc2Vjb25kcyBkaWRuJ3QgZXhlY3V0ZS4KLQkJYXNzZXJ0RmFsc2UoIjwgMCBtcyB0aW1lciBkaWQgZXhlY3V0ZSIsIHRpbWVyRXhlY1JhblswXSk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3VwZGF0ZSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkudXBkYXRlKCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3dha2UoKSB7Ci0JLy8gdGVzdGVkIGluIHNsZWVwKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYXN5bmNFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYmVlcCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmluZERpc3BsYXlMamF2YV9sYW5nX1RocmVhZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZmluZFdpZGdldEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFjdGl2ZVNoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEN1cnJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEN1cnNvckNvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEN1cnNvckxvY2F0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDdXJzb3JTaXplIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERpc21pc3NhbEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RG91YmxlQ2xpY2tUaW1lIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb2N1c0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEljb25EZXB0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TW9uaXRvcnMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFByaW1hcnlNb25pdG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN5bmNUaHJlYWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFN5c3RlbUNvbG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3lzdGVtRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGhyZWFkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUlJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcG9zdExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVhZEFuZERpc3BhdGNoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFwcE5hbWVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zbGVlcCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF90aW1lckV4ZWNJTGphdmFfbGFuZ19SdW5uYWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfdXBkYXRlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93YWtlIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19EZXZpY2VEYXRhIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0RldmljZURhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9hZGRGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9hZGRMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FzeW5jRXhlY0xqYXZhX2xhbmdfUnVubmFibGUiKSkgdGVzdF9hc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9iZWVwIikpIHRlc3RfYmVlcCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY2xvc2UiKSkgdGVzdF9jbG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3RfZGlzcG9zZUV4ZWNMamF2YV9sYW5nX1J1bm5hYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9maW5kRGlzcGxheUxqYXZhX2xhbmdfVGhyZWFkIikpIHRlc3RfZmluZERpc3BsYXlMamF2YV9sYW5nX1RocmVhZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmluZFdpZGdldEkiKSkgdGVzdF9maW5kV2lkZ2V0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWN0aXZlU2hlbGwiKSkgdGVzdF9nZXRBY3RpdmVTaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzIikpIHRlc3RfZ2V0Qm91bmRzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q3VycmVudCIpKSB0ZXN0X2dldEN1cnJlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEN1cnNvckNvbnRyb2wiKSkgdGVzdF9nZXRDdXJzb3JDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDdXJzb3JMb2NhdGlvbiIpKSB0ZXN0X2dldEN1cnNvckxvY2F0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDdXJzb3JTaXplIikpIHRlc3RfZ2V0Q3Vyc29yU2l6ZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGF0YSIpKSB0ZXN0X2dldERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2dldERhdGFMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RGVmYXVsdCIpKSB0ZXN0X2dldERlZmF1bHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc21pc3NhbEFsaWdubWVudCIpKSB0ZXN0X2dldERpc21pc3NhbEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RG91YmxlQ2xpY2tUaW1lIikpIHRlc3RfZ2V0RG91YmxlQ2xpY2tUaW1lKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb2N1c0NvbnRyb2wiKSkgdGVzdF9nZXRGb2N1c0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEljb25EZXB0aCIpKSB0ZXN0X2dldEljb25EZXB0aCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TW9uaXRvcnMiKSkgdGVzdF9nZXRNb25pdG9ycygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UHJpbWFyeU1vbml0b3IiKSkgdGVzdF9nZXRQcmltYXJ5TW9uaXRvcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGxzIikpIHRlc3RfZ2V0U2hlbGxzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeW5jVGhyZWFkIikpIHRlc3RfZ2V0U3luY1RocmVhZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U3lzdGVtQ29sb3JJIikpIHRlc3RfZ2V0U3lzdGVtQ29sb3JJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTeXN0ZW1Gb250IikpIHRlc3RfZ2V0U3lzdGVtRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGhyZWFkIikpIHRlc3RfZ2V0VGhyZWFkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbnRlcm5hbF9kaXNwb3NlX0dDSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfR0NEYXRhIikpIHRlc3RfaW50ZXJuYWxfZGlzcG9zZV9HQ0lMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW50ZXJuYWxfbmV3X0dDTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19HQ0RhdGEiKSkgdGVzdF9pbnRlcm5hbF9uZXdfR0NMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0dDRGF0YSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJIikpIHRlc3RfbWFwTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sSUlJSSIpKSB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X21hcExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9tYXBMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Bvc3RMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKSkgdGVzdF9wb3N0TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZWFkQW5kRGlzcGF0Y2giKSkgdGVzdF9yZWFkQW5kRGlzcGF0Y2goKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUZpbHRlcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVGaWx0ZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEFwcE5hbWVMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEFwcE5hbWVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Q3Vyc29yTG9jYXRpb25JSSIpKSB0ZXN0X3NldEN1cnNvckxvY2F0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEN1cnNvckxvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldEN1cnNvckxvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19TdHJpbmdMamF2YV9sYW5nX09iamVjdCIpKSB0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyIikpIHRlc3Rfc2V0U3luY2hyb25pemVyTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2xlZXAiKSkgdGVzdF9zbGVlcCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlIikpIHRlc3Rfc3luY0V4ZWNMamF2YV9sYW5nX1J1bm5hYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF90aW1lckV4ZWNJTGphdmFfbGFuZ19SdW5uYWJsZSIpKSB0ZXN0X3RpbWVyRXhlY0lMamF2YV9sYW5nX1J1bm5hYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF91cGRhdGUiKSkgdGVzdF91cGRhdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dha2UiKSkgdGVzdF93YWtlKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotYm9vbGVhbiBkaXNwb3NlRXhlY1JhbjsKLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCS8vIHRlc3RlZCBpbiB2aXJ0dWFsbHkgZXZlcnkgbWV0aG9kIGFuZCBpbiBwYXJ0aWN1bGFyCi0JLy8gICB0ZXN0X2Rpc3Bvc2VFeGVjTGphdmFfbGFuZ19SdW5uYWJsZQotfQotCi0vKiBPdmVybG9hZGVkIHRlc3RzIGZyb20gVGVzdF9vcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRGV2aWNlICovCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERQSSgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCVBvaW50IHAgPSBkaXNwbGF5LmdldERQSSgpOwotCQlhc3NlcnRUcnVlKCJob3Jpem9udGFsIERQSSBub3QgZ3JlYXRlciB0aGFuIHplcm8iLCBwLnggPiAwKTsKLQkJYXNzZXJ0VHJ1ZSgidmVydGljYWwgRFBJIG5vdCBncmVhdGVyIHRoYW4gemVybyIsIHAueSA+IDApOwotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREZXB0aCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWludCBkID0gZGlzcGxheS5nZXREZXB0aCgpOwotCQlhc3NlcnRUcnVlKCJkZXB0aCBub3QgZ3JlYXRlciB0aGFuIHplcm8iLCBkID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRMaXN0TGphdmFfbGFuZ19TdHJpbmdaKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJRm9udERhdGFbXSBzY2FsYWJsZSA9IGRpc3BsYXkuZ2V0Rm9udExpc3QobnVsbCwgdHJ1ZSk7Ci0JCUZvbnREYXRhW10gbm9uX3NjYWxhYmxlID0gZGlzcGxheS5nZXRGb250TGlzdChudWxsLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIm5vIGZvbnRzIGRldGVjdGVkIiwgKHNjYWxhYmxlLmxlbmd0aCArIG5vbl9zY2FsYWJsZS5sZW5ndGgpID4gMCk7Ci0JfSBmaW5hbGx5IHsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdhcm5pbmdzKCkgewotCURpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JdHJ5IHsKLQkJZGlzcGxheS5nZXRXYXJuaW5ncygpOwotCQkvLyBTaW5jZSB0aGUgYmVoYXZpb3IgaXMgcGxhdGZvcm0gc3BlY2lmaWMsIHRoZXJlJ3MKLQkJLy8gbm8gZ29vZCB0ZXN0IGZvciB0aGUgcmVzdWx0IHZhbHVlLgotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0Rpc3Bvc2VkKCkgewotCURpc3BsYXkgZGlzcCA9IG5ldyBEaXNwbGF5KCk7Ci0JYXNzZXJ0RmFsc2UoZGlzcC5pc0Rpc3Bvc2VkKCkpOwotCWRpc3AuZGlzcG9zZSgpOwotCWFzc2VydFRydWUoZGlzcC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdhcm5pbmdzWigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCXRyeSB7Ci0JCWRpc3BsYXkuc2V0V2FybmluZ3ModHJ1ZSk7Ci0JCWRpc3BsYXkuc2V0V2FybmluZ3MoZmFsc2UpOwotCQkvLyBTaW5jZSB0aGUgYmVoYXZpb3IgaXMgcGxhdGZvcm0gc3BlY2lmaWMsIHRoZXJlJ3MKLQkJLy8gbm8gZ29vZCB0ZXN0IGZvciBpbnZva2luZyB0aGlzIG1ldGhvZC4KLQkJLy8gTm90ZSB0aGF0IG9uIFdpbmRvd3MsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLgotCX0gZmluYWxseSB7Ci0JCWRpc3BsYXkuZGlzcG9zZSgpOwotCX0KLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTUwN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yKCkgewotCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JYXNzZXJ0Tm90TnVsbChldmVudCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF90b1N0cmluZygpIHsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCWFzc2VydE5vdE51bGwoZXZlbnQudG9TdHJpbmcoKSk7Ci0JYXNzZXJ0VHJ1ZShldmVudC50b1N0cmluZygpLmxlbmd0aCgpID4gMCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yIikpIHRlc3RfQ29uc3RydWN0b3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKSkgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfdG9TdHJpbmciKSkgdGVzdF90b1N0cmluZygpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWFhNzQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRXhwYW5kRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5FeHBhbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FeHBhbmRCYXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV4cGFuZEJhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRCYXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZXhwYW5kQmFyID0gbmV3IEV4cGFuZEJhcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KGV4cGFuZEJhcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lcigpIHsKLQlmaW5hbCBib29sZWFuW10gbGlzdGVuZXJDYWxsZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZX07Ci0JRXhwYW5kTGlzdGVuZXIgZXhwYW5kTGlzdGVuZXIgPSBuZXcgRXhwYW5kTGlzdGVuZXIoKSB7CQkKLQkJcHVibGljIHZvaWQgaXRlbUNvbGxhcHNlZChFeHBhbmRFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZFswXSA9IHRydWU7CQkJCi0JCX0KLQkJcHVibGljIHZvaWQgaXRlbUV4cGFuZGVkKEV4cGFuZEV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkWzBdID0gdHJ1ZTsJCQkKLQkJfQotCX07Ci0KLQl0cnkgewotCQlleHBhbmRCYXIuYWRkRXhwYW5kTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEV4cGFuZExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWV4cGFuZEJhci5hZGRFeHBhbmRMaXN0ZW5lcihleHBhbmRMaXN0ZW5lcik7Ci0JZXhwYW5kQmFyLm5vdGlmeUxpc3RlbmVycyhTV1QuRXhwYW5kLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWRbMF0pOwotCi0JbGlzdGVuZXJDYWxsZWRbMF0gPSBmYWxzZTsKLQlleHBhbmRCYXIubm90aWZ5TGlzdGVuZXJzKFNXVC5Db2xsYXBzZSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoIjpiOiIsIGxpc3RlbmVyQ2FsbGVkWzBdKTsKLQkKLQl0cnkgewotCQlleHBhbmRCYXIucmVtb3ZlRXhwYW5kTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUV4cGFuZExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3RlbmVyQ2FsbGVkWzBdID0gZmFsc2U7Ci0JZXhwYW5kQmFyLnJlbW92ZUV4cGFuZExpc3RlbmVyKGV4cGFuZExpc3RlbmVyKTsKLQlleHBhbmRCYXIubm90aWZ5TGlzdGVuZXJzKFNXVC5FeHBhbmQsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZFswXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQluZXcgRXhwYW5kQmFyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBleHBhbmRCYXIuZ2V0SXRlbUNvdW50KCkgPT0gaSk7Ci0JICAJbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JRXhwYW5kSXRlbVtdIGl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgZXhwYW5kQmFyLmdldEl0ZW0oaSk9PWl0ZW1zW2ldKTsKLQl9Ci0KLQlleHBhbmRCYXIgPSBuZXcgRXhwYW5kQmFyKHNoZWxsLCAwKTsKLQludW1iZXIgPSA1OwotCWl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JdHJ5IHsKLQkJZXhwYW5kQmFyLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JRXhwYW5kSXRlbVtdIGl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspIHsKLQkgIAlpdGVtc1tpXSA9IG5ldyBFeHBhbmRJdGVtKGV4cGFuZEJhciwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhpdGVtcywgZXhwYW5kQmFyLmdldEl0ZW1zKCkpOwotCQotCWV4cGFuZEJhci5nZXRJdGVtcygpWzBdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IEV4cGFuZEl0ZW1bXSB7aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCBleHBhbmRCYXIuZ2V0SXRlbXMoKSk7Ci0KLQlleHBhbmRCYXIuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBFeHBhbmRJdGVtW10ge2l0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCBleHBhbmRCYXIuZ2V0SXRlbXMoKSk7Ci0KLQlleHBhbmRCYXIuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBFeHBhbmRJdGVtW10ge2l0ZW1zWzFdLCBpdGVtc1szXX0sIGV4cGFuZEJhci5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTcGFjaW5nKCkgewotLy90ZXN0ZWQgaW4gdGVzdF9zZXRTcGFjaW5nSQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMTA7Ci0JRXhwYW5kSXRlbVtdIGl0ZW1zID0gbmV3IEV4cGFuZEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JICAJaXRlbXNbaV0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCBleHBhbmRCYXIuaW5kZXhPZihpdGVtc1tpXSApID09IGkpOwotCX0KLQkKLQlpdGVtcyA9IG5ldyBFeHBhbmRJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCSAgCWl0ZW1zW2ldID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0cnkgewotCQkJZXhwYW5kQmFyLmluZGV4T2YobnVsbCk7CQkKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGV4cGFuZEl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X2FkZEV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIgCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U3BhY2luZ0koKSB7Ci0JZXhwYW5kQmFyLnNldFNwYWNpbmcoMCk7Ci0JYXNzZXJ0RXF1YWxzKGV4cGFuZEJhci5nZXRTcGFjaW5nKCksIDApOwotCQotCWV4cGFuZEJhci5zZXRTcGFjaW5nKDMpOwotCWFzc2VydEVxdWFscyhleHBhbmRCYXIuZ2V0U3BhY2luZygpLCAzKTsKLQkKLQlleHBhbmRCYXIuc2V0U3BhY2luZygtNCk7Ci0JYXNzZXJ0RXF1YWxzKGV4cGFuZEJhci5nZXRTcGFjaW5nKCksIDMpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3BhY2luZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U3BhY2luZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkRXhwYW5kTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19FeHBhbmRMaXN0ZW5lciIpKSB0ZXN0X2FkZEV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNwYWNpbmciKSkgdGVzdF9nZXRTcGFjaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTcGFjaW5nSSIpKSB0ZXN0X3NldFNwYWNpbmdJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUV4cGFuZExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRXhwYW5kTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVFeHBhbmRMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0V4cGFuZExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZUV4cGFuZEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0JZXhwYW5kQmFyID0gbmV3IEV4cGFuZEJhcihzaGVsbCwgU1dULlZfU0NST0xMKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlFeHBhbmRJdGVtIGl0ZW0gPSBuZXcgRXhwYW5kSXRlbShleHBhbmRCYXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJFeHBhbmRCYXIiICsgaSk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLQlzZXRXaWRnZXQoZXhwYW5kQmFyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZUV4cGFuZEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVFeHBhbmRCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAxNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlRXhwYW5kQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgzMCwgMjAsIDUwLCAyMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcsIGV2ZW50cyk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIEV4cGFuZEJhciBleHBhbmRCYXI7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NGE3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZXhwYW5kQmFyID0gbmV3IEV4cGFuZEJhcihzaGVsbCwgMCk7Ci0JZXhwYW5kSXRlbSA9IG5ldyBFeHBhbmRJdGVtKGV4cGFuZEJhciwgMCk7IAotCXNldFdpZGdldChleHBhbmRJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSSgpIHsKLQl0cnkgewotCQluZXcgRXhwYW5kSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSUkoKSB7Ci0JRXhwYW5kSXRlbSBpdGVtID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCBTV1QuTlVMTCwgMCk7IC8vY3JlYXRlIGFuIGV4cGFuZCBpdGVtIGF0IGluZGV4IDAKLQlhc3NlcnROb3ROdWxsKGl0ZW0pOwotCWFzc2VydFRydWUoZXhwYW5kQmFyLmdldEl0ZW0oMCkuZXF1YWxzKGl0ZW0pKTsKLQlpdGVtID0gbmV3IEV4cGFuZEl0ZW0oZXhwYW5kQmFyLCBTV1QuTlVMTCwgMSk7Ci0JYXNzZXJ0Tm90TnVsbChpdGVtKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEJhci5nZXRJdGVtKDEpLmVxdWFscyhpdGVtKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29udHJvbCgpIHsKLQlhc3NlcnROdWxsKGV4cGFuZEl0ZW0uZ2V0Q29udHJvbCgpKTsKLQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGV4cGFuZEJhciwgU1dULlBVU0gpOwotCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCUNvbnRyb2wgY29udHJvbCA9IGV4cGFuZEl0ZW0uZ2V0Q29udHJvbCgpOwotCWFzc2VydEVxdWFscyhidXR0b24sIGNvbnRyb2wpOwotCi0JYnV0dG9uID0gbmV3IEJ1dHRvbihleHBhbmRCYXIsIFNXVC5QVVNIKTsKLQlleHBhbmRJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQljb250cm9sID0gZXhwYW5kSXRlbS5nZXRDb250cm9sKCk7Ci0JYXNzZXJ0RXF1YWxzKGJ1dHRvbiwgY29udHJvbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhwYW5kZWQoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X3NldEV4cGFuZGVkWigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRIZWFkZXJIZWlnaHQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWlnaHQoKSB7Ci0vL3Rlc3RlZCBpbiB0ZXN0X3NldEhlaWdodEkoKQkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7CQotCWFzc2VydEVxdWFscyhleHBhbmRJdGVtLmdldFBhcmVudCgpLCBleHBhbmRCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpIHsKLQlleHBhbmRJdGVtLnNldENvbnRyb2wobnVsbCk7CQotCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGV4cGFuZEJhciwgU1dULlBVU0gpOwotCWV4cGFuZEl0ZW0uc2V0Q29udHJvbChidXR0b24pOwotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oZXhwYW5kQmFyLCBTV1QuUFVTSCk7Ci0JYnV0dG9uLmRpc3Bvc2UoKTsKLQl0cnkgewotCQlleHBhbmRJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHdoZW4gY29udHJvbC5pc0Rpc3Bvc2VkKCkiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWJ1dHRvbiA9IG5ldyBCdXR0b24oc2hlbGwsIFNXVC5QVVNIKTsKLQl0cnkgewotCQlleHBhbmRJdGVtLnNldENvbnRyb2woYnV0dG9uKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biB3aGVuIGNvbnRyb2wgaGFzIHdyb25nIHBhcmVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhwYW5kZWRaKCkgewotCWV4cGFuZEl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRJdGVtLmdldEV4cGFuZGVkKCkpOwotCWV4cGFuZEl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhleHBhbmRJdGVtLmdldEV4cGFuZGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWlnaHRJKCkgewotCWV4cGFuZEl0ZW0uc2V0SGVpZ2h0KDMwKTsKLQlhc3NlcnRFcXVhbHMoZXhwYW5kSXRlbS5nZXRIZWlnaHQoKSwgMzApOwotCWV4cGFuZEl0ZW0uc2V0SGVpZ2h0KC04KTsKLQlhc3NlcnRFcXVhbHMoZXhwYW5kSXRlbS5nZXRIZWlnaHQoKSwgMzApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKGV4cGFuZEl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JZXhwYW5kSXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIGV4cGFuZEl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRJdGVtLmdldEltYWdlKCkgIT0gaW1hZ2VzWzFdKTsKLQlleHBhbmRJdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoZXhwYW5kSXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZXhwYW5kSXRlbS5zZXRUZXh0KCJBQkNERUZHIik7Ci0JYXNzZXJ0VHJ1ZShleHBhbmRJdGVtLmdldFRleHQoKS5lcXVhbHMoIkFCQ0RFRkciKSk7Ci0JdHJ5IHsKLQkJZXhwYW5kSXRlbS5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlleHBhbmRJdGVtLnNldFRleHQoIkFCQ0RFRkciKTsKLQlhc3NlcnRUcnVlKGV4cGFuZEl0ZW0uZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoIkFCQ0RFRkciKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kSXRlbUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFeHBhbmRlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVySGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFeHBhbmRlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhlaWdodEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V4cGFuZEJhckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXhwYW5kQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FeHBhbmRJdGVtSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFeHBhbmRlZCIpKSB0ZXN0X2dldEV4cGFuZGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRIZWFkZXJIZWlnaHQiKSkgdGVzdF9nZXRIZWFkZXJIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlaWdodCIpKSB0ZXN0X2dldEhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEV4cGFuZGVkWiIpKSB0ZXN0X3NldEV4cGFuZGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVpZ2h0SSIpKSB0ZXN0X3NldEhlaWdodEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0Jc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUV4cGFuZEJhciBleHBhbmRCYXI7Ci1FeHBhbmRJdGVtIGV4cGFuZEl0ZW07Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTIzOTMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19GaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGZpbGVEaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCS8vIFRlc3QgRmlsZURpYWxvZyhTaGVsbCkKLQluZXcgRmlsZURpYWxvZyhzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IEZpbGVEaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JLy8gVGVzdCBGaWxlRGlhbG9nKFNoZWxsLCBpbnQpCi0JRmlsZURpYWxvZyBmZDsKLQlmZCA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0JYXNzZXJ0VHJ1ZShmZC5nZXRTdHlsZSgpPT1TV1QuTlVMTCk7Ci0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQlhc3NlcnRUcnVlKGZkLmdldFN0eWxlKCk9PVNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JZmQgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULlBSSU1BUllfTU9EQUwpOwotCWFzc2VydFRydWUoZmQuZ2V0U3R5bGUoKT09U1dULlBSSU1BUllfTU9EQUwpOwotCWZkID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5TWVNURU1fTU9EQUwpOwotCWFzc2VydFRydWUoZmQuZ2V0U3R5bGUoKT09U1dULlNZU1RFTV9NT0RBTCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbGVOYW1lKCkgewotCS8vCXRlc3RlZCBpbiB0ZXN0X3NldEZpbGVOYW1lTGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbGVOYW1lcygpIHsKLQlTdHJpbmdbXSBuYW1lcyA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lcy5sZW5ndGg9PTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlckV4dGVuc2lvbnMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyTmFtZXMoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZpbHRlclBhdGgoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RmlsdGVyUGF0aExqYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQlpZiAoZlRlc3REaWFsb2dPcGVuKQotCQlmaWxlRGlhbG9nLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbGVEaWFsb2cuc2V0RmlsZU5hbWUoIiIpOwotCVN0cmluZyBuYW1lID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCWFzc2VydFRydWUobmFtZS5lcXVhbHMoIiIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbGVOYW1lKG51bGwpOwotCW5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JYXNzZXJ0VHJ1ZShuYW1lPT1udWxsKTsKLQlmaWxlRGlhbG9nLnNldEZpbGVOYW1lKCJzb21lZmlsZS50ZXN0Iik7Ci0JbmFtZSA9IGZpbGVEaWFsb2cuZ2V0RmlsZU5hbWUoKTsKLQlhc3NlcnRUcnVlKG5hbWUuZXF1YWxzKCJzb21lZmlsZS50ZXN0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7InR4dCIsImphdmEifSk7Ci0JU3RyaW5nIGZpbHRlcnNbXSA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzBdLmVxdWFscygidHh0IikpOwotCWFzc2VydFRydWUoZmlsdGVyc1sxXS5lcXVhbHMoImphdmEiKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IiJ9KTsKLQlmaWx0ZXJzID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJFeHRlbnNpb25zKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzLmxlbmd0aCA9PSAxKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobnVsbCk7Ci0JZmlsdGVycyA9IGZpbGVEaWFsb2cuZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWFzc2VydFRydWUoZmlsdGVycz09bnVsbCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyJhLnR4dCIsImIuamF2YSJ9KTsKLQlTdHJpbmcgZmlsdGVyc1tdID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJOYW1lcygpOwotCWFzc2VydFRydWUoZmlsdGVycy5sZW5ndGggPT0gMik7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzBdLmVxdWFscygiYS50eHQiKSk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzWzFdLmVxdWFscygiYi5qYXZhIikpOwotCWZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsiIn0pOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlck5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzLmxlbmd0aCA9PSAxKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG51bGwpOwotCWZpbHRlcnMgPSBmaWxlRGlhbG9nLmdldEZpbHRlck5hbWVzKCk7Ci0JYXNzZXJ0VHJ1ZShmaWx0ZXJzPT1udWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGaWx0ZXJQYXRoTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOjE6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gIi4vKiI7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKHRlc3RTdHIpOwotCWFzc2VydFRydWUoIjoyOiIsIGZpbGVEaWFsb2cuZ2V0RmlsdGVyUGF0aCgpLmVxdWFscyh0ZXN0U3RyKSk7Ci0JZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKCIiKTsKLQlhc3NlcnRUcnVlKCI6MzoiLCBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKS5lcXVhbHMoIiIpKTsKLQlmaWxlRGlhbG9nLnNldEZpbHRlclBhdGgobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOjQ6IiwgZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCkgPT0gbnVsbCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRmlsZURpYWxvZygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWxlTmFtZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsZU5hbWVzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGaWx0ZXJOYW1lcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RmlsdGVyUGF0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZy5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsZU5hbWUiKSkgdGVzdF9nZXRGaWxlTmFtZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsZU5hbWVzIikpIHRlc3RfZ2V0RmlsZU5hbWVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGaWx0ZXJFeHRlbnNpb25zIikpIHRlc3RfZ2V0RmlsdGVyRXh0ZW5zaW9ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyTmFtZXMiKSkgdGVzdF9nZXRGaWx0ZXJOYW1lcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RmlsdGVyUGF0aCIpKSB0ZXN0X2dldEZpbHRlclBhdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGaWxlTmFtZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsZU5hbWVMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RmlsdGVyRXh0ZW5zaW9ucyRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlckV4dGVuc2lvbnMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlck5hbWVzJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0RmlsdGVyTmFtZXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEZpbHRlclBhdGhMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLUZpbGVEaWFsb2cgZmlsZURpYWxvZzsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk1ZjY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZvbnREaWFsb2cKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZvbnREaWFsb2cKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZyBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRm9udERpYWxvZyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZm9udERpYWxvZyA9IG5ldyBGb250RGlhbG9nKHNoZWxsLCBTV1QuTlVMTCk7Ci0Jc2V0RGlhbG9nKGZvbnREaWFsb2cpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpIHsKLQluZXcgRm9udERpYWxvZyhzaGVsbCk7Ci0JdHJ5IHsKLQkJbmV3IEZvbnREaWFsb2cobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKSB7Ci0JdHJ5IHsKLQkJbmV3IEZvbnREaWFsb2cobnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udERhdGEoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udERhdGFMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udExpc3QoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEZvbnRMaXN0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UkdCKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnREYXRhTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250RGF0YSgpIHsKLQlGb250RGF0YSBbXSBmb250RGF0YSA9IG5ldyBGb250RGF0YSBbMV07Ci0JZm9udERhdGEgWzBdID0gbmV3IEZvbnREYXRhICgpOwotCi0JYXNzZXJ0TnVsbChmb250RGlhbG9nLmdldEZvbnRMaXN0KCkpOwkKLQkJCi0JZm9udERpYWxvZy5zZXRGb250TGlzdChmb250RGF0YSk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnREaWFsb2cuZ2V0Rm9udExpc3QoKSwgZm9udERhdGEpOwotCi0JZm9udERpYWxvZy5zZXRGb250TGlzdChudWxsKTsKLQlhc3NlcnROdWxsKGZvbnREaWFsb2cuZ2V0Rm9udExpc3QoKSk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQigpIHsKLQlSR0IgcmdiID0gbmV3IFJHQigyNTUsIDAsIDApOwotCWZvbnREaWFsb2cuc2V0UkdCKHJnYik7Ci0JUkdCIHJnYjIgPSBmb250RGlhbG9nLmdldFJHQigpOwotCWFzc2VydEVxdWFscyhyZ2IsIHJnYjIpOwkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Gb250RGlhbG9nKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnREYXRhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250TGlzdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9vcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250RGF0YSIpKSB0ZXN0X2dldEZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250TGlzdCIpKSB0ZXN0X2dldEZvbnRMaXN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSR0IiKSkgdGVzdF9nZXRSR0IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9zZXRGb250RGF0YUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMaXN0JExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udERhdGEiKSkgdGVzdF9zZXRGb250TGlzdCRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSR0JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JHQiIpKSB0ZXN0X3NldFJHQkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUkdCKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotRm9udERpYWxvZyBmb250RGlhbG9nOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzN2Q2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXAKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Hcm91cChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JZ3JvdXAgPSBuZXcgR3JvdXAoc2hlbGwsIDApOwotCXNldFdpZGdldChncm91cCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlncm91cCA9IG5ldyBHcm91cChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7U1dULlNIQURPV19JTiwgU1dULlNIQURPV19PVVQsIFNXVC5TSEFET1dfRVRDSEVEX0lOLCBTV1QuU0hBRE9XX0VUQ0hFRF9PVVR9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCWdyb3VwID0gbmV3IEdyb3VwKHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gY2FzZXMgPSB7IiIsICJzb21lIHRleHQiLCAibGRrYXNoZG9laHVmd2VvdmNuaHNsdmhyZWdvamViY2tyZWF2Ymt1aHhiaXVmdmN5aGJpZnV5ZXd2Yml1cmV5ZC4sY21uZXNsamxpZXdqZmNodmJ3b2lmaXZiZXdvcml4dWlldXJ2Yml1dmJvaGZsa3NqZWFoZmNsaXVyZWFmZ3ljaWFiZWxpdHZ5cnd0bGljdXlydGxpdXJleWJjbGl1eXJldWNleXZibGl1cmV5YmN0In07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlncm91cC5zZXRUZXh0KGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBncm91cC5nZXRUZXh0KCkuZXF1YWxzKGNhc2VzW2ldKSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0dyb3VwKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENsaWVudEFyZWEiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Hcm91cCBncm91cDsKLQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMCwgNSwgMjAsIDEwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ5OWY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbG9hZEltYWdlcygpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotCWZyZWVJbWFnZXMoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkoKSB7Ci0JLy8gYWJzdHJhY3QgY2xhc3MKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JaXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIGl0ZW0uZ2V0SW1hZ2UoKSk7Ci0JYXNzZXJ0VHJ1ZShpdGVtLmdldEltYWdlKCkgIT0gaW1hZ2VzWzFdKTsKLQlpdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwoaXRlbS5nZXRJbWFnZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nIHRlc3RTdHIgPSAidGVzdCBzdHJpbmciOwotCWl0ZW0uc2V0VGV4dCh0ZXN0U3RyKTsKLQlhc3NlcnRUcnVlKCJhIiwgaXRlbS5nZXRUZXh0KCkuZXF1YWxzKHRlc3RTdHIpKTsKLQlpdGVtLnNldFRleHQoIiIpOwotCWFzc2VydFRydWUoImIiLCBpdGVtLmdldFRleHQoKS5lcXVhbHMoIiIpKTsKLQl0cnkgewotCQlpdGVtLnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1JdGVtIGl0ZW07Ci1JbWFnZVtdIGltYWdlcyA9IG5ldyBJbWFnZSBbU3d0VGVzdENhc2UuaW1hZ2VGb3JtYXRzLmxlbmd0aCpTd3RUZXN0Q2FzZS5pbWFnZUZpbGVuYW1lcy5sZW5ndGhdOwotCi1wcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLQlpbnQgbnVtRm9ybWF0cyA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0cy5sZW5ndGg7Ci0JaW50IG51bUZpbGVzID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXMubGVuZ3RoOwotCWZvciAoaW50IGk9MDsgaTxudW1Gb3JtYXRzOyBpKyspIHsKLQkJU3RyaW5nIGZvcm1hdCA9IFN3dFRlc3RDYXNlLmltYWdlRm9ybWF0c1tpXTsKLQkJaW50IGluZGV4ID0gaSpudW1GaWxlczsKLQkJZm9yIChpbnQgaj0wOyBqPG51bUZpbGVzOyBqKyspewotCQkJU3RyaW5nIGZpbGVOYW1lID0gU3d0VGVzdENhc2UuaW1hZ2VGaWxlbmFtZXNbal07Ci0JCQlJbnB1dFN0cmVhbSAgcmVzb3VyY2UgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSArICIuIiArIGZvcm1hdCk7Ci0JCQlpbWFnZXMgW2luZGV4K2pdID0gbmV3IEltYWdlIChzaGVsbC5nZXREaXNwbGF5KCksIHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjb250aW51ZTsKLQkJCX0KLQkJfQotCX0KLX0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgd2lkZ2V0KSB7Ci0JaXRlbSA9IChJdGVtKSB3aWRnZXQ7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHdpZGdldCk7Ci19Ci0KLXByaXZhdGUgdm9pZCBmcmVlSW1hZ2VzKCkgewotCWZvciAoaW50IGk9MDsgaTxpbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGltYWdlc1tpXSAhPSBudWxsKQotCQkJaW1hZ2VzW2ldLmRpc3Bvc2UoKTsKLQl9Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2MwMDYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWwKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYWJlbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIDApOwotCXNldFdpZGdldChsYWJlbCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotLy8Jc3VwZXIudGVhckRvd24oKTsKLQotCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCWFzc2VydEVxdWFscyhzaGVsbC5pc0Rpc3Bvc2VkKCksIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLmlzRGlzcG9zZWQoKSwgZmFsc2UpOwotCX0KLQotCXNoZWxsLmRpc3Bvc2UoKTsKLQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQlhc3NlcnRUcnVlKHNoZWxsLmlzRGlzcG9zZWQoKSk7Ci0JCWFzc2VydFRydWUobGFiZWwuaXNEaXNwb3NlZCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpewotCXRyeSB7Ci0JCWxhYmVsID0gbmV3IExhYmVsKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWxhYmVsID0gbmV3IExhYmVsKHNoZWxsLCAwKTsKLQotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVIsIFNXVC5TRVBBUkFUT1IsIFNXVC5IT1JJWk9OVEFMLCBTV1QuVkVSVElDQUwsIFNXVC5TSEFET1dfSU4sIFNXVC5TSEFET1dfT1VUfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlsYWJlbCA9IG5ldyBMYWJlbChzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCS8vIHN1cGVyIGNsYXNzIHRlc3QgaXMgc3VmZmljaWVudAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpewotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0gCSAgbGFiZWwgPSBuZXcgTGFiZWwoc2hlbGwsIGNhc2VzW2ldKTsKLQkgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRBbGlnbm1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2UoKXsKLQlJbWFnZVtdIGNhc2VzID0ge251bGwsIG5ldyBJbWFnZShudWxsLCAxMDAsIDEwMCl9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkgbGFiZWwuc2V0SW1hZ2UoY2FzZXNbaV0pOwotCSBhc3NlcnRFcXVhbHMobGFiZWwuZ2V0SW1hZ2UoKSwgY2FzZXNbaV0pOwotCSBpZiAoY2FzZXNbaV0hPW51bGwpCi0JICBjYXNlc1tpXS5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKXsKLQlTdHJpbmdbXSBjYXNlcyA9IHsiIiwgInNvbWUgbmFtZSIsICJzZGFzZGxranNoY2Rhc2NlY29ld2N3ZSJ9OwotCWZvcihpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKXsKLQkgbGFiZWwuc2V0VGV4dChjYXNlc1tpXSk7Ci0JIGFzc2VydEVxdWFscyhsYWJlbC5nZXRUZXh0KCksIGNhc2VzW2ldKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWxpZ25tZW50SSgpewotCWludFtdIGNhc2VzID0ge1NXVC5MRUZULCBTV1QuUklHSFQsIFNXVC5DRU5URVJ9OwotCWZvciAoaW50IGk9MDsgaTxjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0gCSAgbGFiZWwuc2V0QWxpZ25tZW50KGNhc2VzW2ldKTsKLQkgIGFzc2VydEVxdWFscyhsYWJlbC5nZXRBbGlnbm1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9jdXMoKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCS8vIHRlc3RlZCBpbiBnZXRJbWFnZSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKXsKLQl0cnkgewotCQlsYWJlbC5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGFiZWwoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEZvY3VzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QWxpZ25tZW50IikpIHRlc3RfZ2V0QWxpZ25tZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZSIpKSB0ZXN0X2dldEltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1MYWJlbCBsYWJlbDsKLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc1NzgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGF5b3V0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCVNoZWxsIHNoZWxsOwotCUNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzaGVsbCA9IG5ldyBTaGVsbCgpOwotCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIDApOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0JaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfQ29uc3RydWN0b3Igbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MYXlvdXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvciIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkMzUwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpbmsgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi0JTGluayBsaW5rOwotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaW5rKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlsaW5rID0gbmV3IExpbmsoc2hlbGwsIFNXVC5OT05FKTsKLQlzZXRXaWRnZXQobGluayk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQkvLyBUZXN0IExpbmsoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5VTEwpOwotCWxpbmsuZGlzcG9zZSgpOwotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULk5PTkUpOwotCWxpbmsuZGlzcG9zZSgpOwotCWxpbmsgPSBuZXcgTGluayhzaGVsbCwgU1dULkJPUkRFUik7Ci0JbGluay5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJbGluayA9IG5ldyBMaW5rKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGluay5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUobGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCWxpbmsucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbGluay5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGluay5ub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbiwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQlsaW5rLmNvbXB1dGVTaXplKDAsIDApOwotCi0JbGluay5jb21wdXRlU2l6ZSgwLCAwLCBmYWxzZSk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKC0xMCwgLTEwKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoLTEwLCAtMTAsIGZhbHNlKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMTAsIDEwKTsKLQotCWxpbmsuY29tcHV0ZVNpemUoMTAsIDEwLCBmYWxzZSk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDEwMDAwLCAxMDAwMCk7Ci0KLQlsaW5rLmNvbXB1dGVTaXplKDEwMDAwLCAxMDAwMCwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JLy8gdGVzdGVkIGluICB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gY2FzZXMgPSB7Ci0JCQkiIiwKLQkJCSJhIiwKLQkJCSJhYSIsCi0JCQkiYWFhYWFhYWFhYSIsCi0JCQkiYSYiLAotCQkJIiYiLAotCQkJIiZhIiwKLQkJCSImYSYiLAotCQkJIiZhIiwKLQkJCSImPGE+IiwKLQkJCSI8YT4iLAotCQkJIiZhPGE+IiwKLQkJCSI8YT48L2E+IiwKLQkJCSI8YT48L2E+JiIsCi0JCQkiPGE+PC9hPmEmIiwKLQkJCSI8YT48L2E+JmEiLAotCQkJIiZhPGE+YTwvYT4mYSIsCi0JCQkiJmE8YT4mYTwvYT4mYSIsCi0JCQkiVGV4dCA8YSBocmVmPVwidXJsLmNvbVwiPkxpbms8L2E+IHRleHQgPEEgY29sb3I9IzIxMjEyMT5MaW5rIDI8L0E+ICIsCi0JCQkiVGV4dDxhICBcdCAgIHh4eD1cInl5eSAgXCIgICAgICAgIGlkPVwiaWRzXCIgaHJlZj1cIkhSRUZcIiAgICAgPkxpbms8IC9hPkVuZCIsCi0JCQkiVGUmJnh0ICZ0ZXh0ICYmIDxhPkwmaW5rPC9hPiBoJmkgPGE+ZmUmJmxpcGU8L2E+ICZsICZlbmQmJiIsCi0JCQkiVGV4dCA8YSBpZD1cIjFcIj5MaW5rPC9hPiBzb21ldGhpbmcgPGEgaHJlZj1cImJsYSBibGEyXCIgPkxpbmsyPC9hPiBzb21ldGhpbmdlbHNlIDxhPkxpbmszIGxhcmdlIGxhcmdlPC9hPi4gc29tZSB0ZXh0IHRvIHRlc3QgdGhpcyB3cmFwcGluZyB0aGluZyA8QSBocmVmPVwibGFzdFwiPnRoaXMgaXMgc3VwcG9zZSB0byBiZSBhIHZlcnkgbG9uZyBsaW5rIHRleHQgdGhlIHNwcmF3cyBvdmVyIHNldmVyYWwgbGluZXMgaW4gdGhlIHRleHQgbGF5b3V0PC9hPi5lbmQiLAotCQkJIlRoZSBTV1QgY29tcG9uZW50IGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgPEE+ZWZmaWNpZW50PC9BPiwgPEE+cG9ydGFibGU8L0E+IDxBPmFjY2VzcyB0byB0aGUgdXNlci1pbnRlcmZhY2UgZmFjaWxpdGllcyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbXM8L0E+IG9uIHdoaWNoIGl0IGlzIGltcGxlbWVudGVkLiIsCi0JCQkic29tZSB0ZXh0IiwgCi0JCQkibGRrYXNoZG9laHVmd2VvdmNuaHNsdmhyZWdvamViY2tyZWF2Ymt1aHhiaXVmdmN5aGJpZnV5ZXd2Yml1cmV5ZC4sY21uZXNsamxpZXdqZmNodmJ3b2lmaXZiZXdvcml4dWlldXJ2Yml1dmJvaGZsa3NqZWFoZmNsaXVyZWFmZ3ljaWFiZWxpdHZ5cnd0bGljdXlydGxpdXJleWJjbGl1eXJldWNleXZibGl1cmV5YmN0IiwgCi0JCQkiXG4gXG4gXGIgXHQgIiwgCi0JCQkiXDAifTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspewotCQlsaW5rLnNldFRleHQoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMobGluay5nZXRUZXh0KCkgLCBjYXNlc1tpXSk7Ci0JfQotCXRyeSB7Ci0JCWxpbmsuc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGV4dCA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGluaygoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dCIpKSB0ZXN0X2dldFRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NmQ4ZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbGlzdCA9IG5ldyBMaXN0KHNoZWxsLCBTV1QuTVVMVEkpOwotCi0Jc2V0V2lkZ2V0KGxpc3QpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJbGlzdCA9IG5ldyBMaXN0KG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7IC8vc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9Ci0JCXsKLQkJCTAsCi0JCQlTV1QuU0lOR0xFLAotCQkJU1dULk1VTFRJLAotCQkJU1dULk1VTFRJIHwgU1dULlZfU0NST0xMLAotCQkJU1dULk1VTFRJIHwgU1dULkhfU0NST0xMLAotCQkJU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJbGlzdCA9IG5ldyBMaXN0KHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0LmFkZCgiIik7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbmV3IFN0cmluZ1tdIHsiIn0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgXG4gdGV4dCIpOwotCWFzc2VydFNhbWUoIjpiOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSB0ZXh0Iik7Ci0JYXNzZXJ0U2FtZSgiOmM6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCIsICJzb21lIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gbGlzdAotCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JdHJ5IHsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LmFkZCgiIik7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbmV3IFN0cmluZ1tdIHsiIn0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgXG4gdGV4dCIpOwotCWFzc2VydFNhbWUoIjpiOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSB0ZXh0Iik7Ci0JYXNzZXJ0U2FtZSgiOmM6IiwgbmV3IFN0cmluZ1tdIHsiIiwgInNvbWUgXG4gdGV4dCIsICJzb21lIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKSB7Ci0JdHJ5IHsKLQkJbGlzdC5hZGQoInNvbWUgdGV4dCIsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JbGlzdC5hZGQoIiIsIDApOwotCWFzc2VydFNhbWUoIjphOiIsIG5ldyBTdHJpbmdbXSB7IiJ9LCBsaXN0LmdldEl0ZW1zKCkpOwotCWxpc3QuYWRkKCJzb21lIFxuIHRleHQiLCAxKTsKLQlhc3NlcnRTYW1lKCI6YjoiLCBuZXcgU3RyaW5nW10geyIiLCAic29tZSBcbiB0ZXh0In0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgdGV4dCIsIDApOwotCWFzc2VydFNhbWUoIjpjOiIsIG5ldyBTdHJpbmdbXSB7InNvbWUgdGV4dCIsICIiLCAic29tZSBcbiB0ZXh0IiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotCXRyeSB7Ci0JCWxpc3QuYWRkKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIHN0cmluZyA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LmFkZCgic3RyaW5nIiwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0Ci0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQl0cnkgewotCQlsaXN0LmFkZCgic29tZSB0ZXh0IiwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkKLQlsaXN0LmFkZCgiIiwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmE6IiwgbmV3IFN0cmluZ1tdIHsiIn0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JbGlzdC5hZGQoInNvbWUgXG4gdGV4dCIsIDEpOwotCWFzc2VydFNhbWUoIjpiOiIsIG5ldyBTdHJpbmdbXSB7IiIsICJzb21lIFxuIHRleHQifSwgbGlzdC5nZXRJdGVtcygpKTsKLQlsaXN0LmFkZCgic29tZSB0ZXh0IiwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmM6IiwgbmV3IFN0cmluZ1tdIHsic29tZSB0ZXh0IiwgIiIsICJzb21lIFxuIHRleHQiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JCi0JdHJ5IHsKLQkJbGlzdC5hZGQobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gc3RyaW5nID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWxpc3QuYWRkKCJzdHJpbmciLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCWxpc3QucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIGxpc3QKLQotCXNldFNpbmdsZUxpc3QoKTsKLQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCWxpc3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JbGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCWxpc3QucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biBmb3IgbGlzdGVuZXIgPT0gbnVsbCIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0JLy8gc3VwZXIgY2xhc3MgdGVzdCBpcyBzdWZmaWNpZW50Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3QkSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBsaXN0LmdldFNlbGVjdGlvbigpLCBpdGVtcyk7Ci0JdHJ5IHsKLQkJbGlzdC5kZXNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgaXRlbXMpOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsKLQl9KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIGl0ZW1zKTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaXNTZWxlY3RlZCgwKSwgZmFsc2UpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDIsIDAsIDAgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMyB9KTsKLQkvKglhc3NlcnQoIjpkOiIsICFsaXN0LmlzU2VsZWN0ZWQoMCkpOwotCWFzc2VydCgiOmRkOiIsICFsaXN0LmlzU2VsZWN0ZWQoMikpOwotCWFzc2VydCgiOmRkZDoiLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWFzc2VydCgiOmRkZDoiLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOyovCi0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQl0cnkgewotCQlsaXN0LmRlc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQlsaXN0LmRlc2VsZWN0KG5ldyBpbnRbXSB7IDAgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAzIH0pOwotCWxpc3QuZGVzZWxlY3QobmV3IGludFtdIHsgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JbGlzdC5kZXNlbGVjdChuZXcgaW50W10geyAyLCAwLCAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JU3RyaW5nW10gZW1wdHkgPSB7Ci0JfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShpdGVtcywgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhlbXB0eSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJKCkgewotCWludCBudW1iZXIgPSA1OwotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gImZyZWQiICsgaTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWFzc2VydFNhbWUoaXRlbXMyLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDUpOwotCWFzc2VydFNhbWUoaXRlbXMyLCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQlsaXN0LmRlc2VsZWN0KDEpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDEpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQlsaXN0LmRlc2VsZWN0KDUpOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0sIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoMik7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMikpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCWxpc3QuZGVzZWxlY3QoMSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmlzU2VsZWN0ZWQoMSkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0SUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSAiZnJlZCIgKyBpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQotCS8vIHRlc3RzIGlmIGRlc2VsZWN0KGksIGopIGlzIHRoZSBzYW1lIGFzIGZvciAoaT0wOyBpPD1qOyArK2kpIGRlc2VsZWN0KGkpOwotCWludFtdW10gY2FzZXMgPSB7IHsgMywgMSB9LCB7Ci0JCQktMywgLTIgfSwgewotCQkJLTIsIC0xIH0sIHsKLQkJCS0xLCAtMSB9LCB7Ci0JCQkxMCwgMSB9Ci0JfTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyArK2kpIHsKLQkJZGVzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIGNhc2VzW2ldWzBdLCBjYXNlc1tpXVsxXSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQl9Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDMsIG5ldyBpbnRbXSB7IDQgfSk7Ci0JCWRlc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMzAsIG5ldyBpbnRbXSB7Ci0JCX0pOwotCX0KLQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMywgbmV3IGludFtdIHsgMCwgNCB9KTsKLQlkZXNlbGVjdElJX2hlbHBlcihpdGVtcywgMSwgMSwgbmV3IGludFtdIHsgMCwgMiwgMywgNCB9KTsKLQkvLyBkb25lCi0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMyKTsKLQlhc3NlcnRTYW1lKCI6YToiLCBpdGVtczIsIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCWxpc3QuZGVzZWxlY3QoMCwgMCk7Ci0JYXNzZXJ0U2FtZSgiOmI6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0JbGlzdC5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRTYW1lKCI6YmJiOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCWxpc3QuZGVzZWxlY3QoMiwgMyk7Ci0JYXNzZXJ0RXF1YWxzKCI6YmI6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtczIpOwotCWxpc3QuZGVzZWxlY3QoMCwgMik7Ci0JYXNzZXJ0RXF1YWxzKCI6ZGRkZDoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zMik7Ci0JbGlzdC5kZXNlbGVjdCgyLCAwKTsKLQlhc3NlcnRTYW1lKAotCQkiOmRkZGRkOiIsCi0JCWxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwLCAxLCAyLCAzIH0pOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JCi0JbGlzdC5zZWxlY3QoMCk7Ci0KLQlsaXN0LmRlc2VsZWN0KC0zLCAtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgtMiwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3QuZGVzZWxlY3QoLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMoIjplOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQotCWxpc3QuZGVzZWxlY3QoMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCi0JbGlzdC5kZXNlbGVjdCgzLCAzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdCgxLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsgIml0ZW0zIiB9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJpdGVtMyIgfSk7Ci0JbGlzdC5kZXNlbGVjdCgwLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAiaXRlbTMiIH0pOwotCWxpc3QuZGVzZWxlY3QoMSwgMyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvY3VzSW5kZXgoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiJ9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEZvY3VzSW5kZXgoKSk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKDIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmUoMik7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JbGlzdC5yZW1vdmUoMik7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQlGb250RGF0YSBmb250RGF0YSA9IGxpc3QuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JaW50IGxpbmVIZWlnaHQ7Ci0JRm9udCBmb250OwotCQotCWZvbnQgPSBuZXcgRm9udChsaXN0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCA4LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQlsaXN0LnNldEZvbnQoZm9udCk7Ci0JbGluZUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpOwotCWxpc3Quc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbmV3IEZvbnQobGlzdC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMTIsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCWxpc3Quc2V0Rm9udChmb250KTsKLQlpbnQgbmV3TGluZUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpOwotCWFzc2VydFRydWUoIjphOiIsIG5ld0xpbmVIZWlnaHQgPiBsaW5lSGVpZ2h0KTsKLQlsaXN0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQl0cnkgewotCQlsaXN0LmdldEl0ZW0oNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCWxpc3QuZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMyksICJpdGVtMyIpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCXRyeSB7Ci0JCWxpc3QuZ2V0SXRlbSg1KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCWxpc3QuZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IDwgMCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCS8vYXNzZXJ0KCI6YToiLCBsaXN0LmdldEl0ZW0oNSk9PW51bGwpOwotCWFzc2VydEVxdWFscygiaXRlbTMiLCBsaXN0LmdldEl0ZW0oMykpOwotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JU3RyaW5nW11bXSBjYXNlcyA9IHsgewotCQl9LCB7Ci0JCQkiIiB9LCB7Ci0JCQkiIiwgIiIgfSwgewotCQkJInRleHQxIiwgInRleHQyIiB9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWxpc3Quc2V0SXRlbXMoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoImNhc2U6ICIgKyBpLCBjYXNlc1tpXSwgbGlzdC5nZXRJdGVtcygpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCVN0cmluZ1tdW10gY2FzZXMgPSB7IHsKLQkJfSwgewotCQkJIiIgfSwgewotCQkJIiIsICIiIH0sIHsKLQkJCSJ0ZXh0MSIsICJ0ZXh0MiIgfQotCX07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJsb29wOiIgKyBpKTsKLQkJbGlzdC5zZXRJdGVtcyhjYXNlc1tpXSk7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKGNhc2VzW2ldKTsKLQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigibGlzdDoiICsgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImNhc2U6IiArIGkgKyBjYXNlc1tpXSk7Ci0JCWFzc2VydFNhbWUoImNhc2U6ICIgKyBpLCBjYXNlc1tpXSwgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDE7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldEl0ZW1zKGNhc2VzW2ldKTsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCWFzc2VydEVxdWFscygKLQkJCSJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksCi0JCQlsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyBjYXNlc1tpXVswXSB9KTsKLQl9Ci0KLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWludFtdIHNlbCA9IHsgMCwgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoLCAyKTsKLQlTdHJpbmdbXSBzZWxJdGVtcyA9IG5ldyBTdHJpbmdbXSB7aXRlbXNbMF0sIGl0ZW1zWzJdfTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uKCksIHNlbEl0ZW1zKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCwgMik7Ci0Jc2VsSXRlbXMgPSBuZXcgU3RyaW5nW10ge2l0ZW1zWzBdLCBpdGVtc1sxXX07Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBzZWxJdGVtcyk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKVswXSwgaXRlbXNbMV0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMSwgMCk7Ci0JU3RyaW5nW10gZW1wdHkgPSB7Ci0JfTsKLQlhc3NlcnRFcXVhbHMoZW1wdHksIGxpc3QuZ2V0U2VsZWN0aW9uKCkpOwotCi0JU3RyaW5nW10gYm9ndXNfaXRlbXMgPSB7ICJib2d1c190ZXh0MSIsICJib2d1c190ZXh0MiIsICJib2d1c190ZXh0MyIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihib2d1c19pdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGVtcHR5LCBsaXN0LmdldFNlbGVjdGlvbigpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiBsaXN0cyAKLQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCXNlbCA9IG5ldyBpbnRbXSB7IDAgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zWzBdLCBsaXN0LmdldFNlbGVjdGlvbigpWzBdKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDEpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbigpLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zWzFdLCBsaXN0LmdldFNlbGVjdGlvbigpWzBdKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMgY29udGFpbmVkIGluIHRoZSByZWNlaXZlci4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEVycm9yIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfR0VUX0NPVU5UIC0gaWYgdGhlIG9wZXJhdGlvbiBmYWlscyBiZWNhdXNlIG9mIGFuIG9wZXJhdGluZyBzeXN0ZW0gZmFpbHVyZTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDMiIH07Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkNvdW50KCksIDApOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQyIiB9KTsKLQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JLy8gbm90IHByb3Blcmx5IHNwZWMnZCBmb3IgbXVsdGktc2VsZWN0IGxpc3RzCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MSIgfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nW10geyAidGV4dDIiIH0pOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZ1tdIHsgInRleHQzIiB9KTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JaW50W10gc2VsID0geyAwLCAxLCAyIH07Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDAgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAxIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDMgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAtMSwgMCwgMSwgMiwgMyB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10geyAwLCAxLCAyIH0sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsgMSwgMiB9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDAgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUoc2VsLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlzZWwgPSBuZXcgaW50W10geyAxIH07Ci0JbGlzdC5zZXRTZWxlY3Rpb24oc2VsKTsKLQlhc3NlcnRTYW1lKHNlbCwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0Jc2VsID0gbmV3IGludFtdIHsgMiB9OwotCWxpc3Quc2V0U2VsZWN0aW9uKHNlbCk7Ci0JYXNzZXJ0U2FtZShzZWwsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXNlbCA9IG5ldyBpbnRbXSB7IDMgfTsKLQlsaXN0LnNldFNlbGVjdGlvbihzZWwpOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9wSW5kZXgoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQzIiksIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmluZGV4T2YoInRleHQ0IiksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3QuaW5kZXhPZihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaXRlbSA9PSBudWxsIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlTdHJpbmdbXSBpdGVtczIgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MiIgfTsgLy90d28gaWRlbnRpY2FsCi0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaW5kZXhPZigidGV4dDIiKSwgMSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoLTEsIGxpc3QuaW5kZXhPZigidGV4dDMiLCA0KSk7Ci0KLQkKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5pbmRleE9mKCJ0ZXh0MyIpKTsKLQotCQotCWFzc2VydEVxdWFscygtMSwgbGlzdC5pbmRleE9mKCJ0ZXh0NCIpKTsKLQotCQotCXRyeSB7Ci0JCWxpc3QuaW5kZXhPZihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JCi0JYXNzZXJ0RXF1YWxzKDEsIGxpc3QuaW5kZXhPZigidGV4dDIiKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCBsaXN0LmluZGV4T2YoInRleHQzIiwgNCkpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmluZGV4T2YoInRleHQzIiwgMikpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMCkpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMSkpOwotCWFzc2VydEVxdWFscygtMSwgbGlzdC5pbmRleE9mKCJ0ZXh0MiIsIDIpKTsKLQotCVN0cmluZ1tdIGl0ZW1zMiA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQyIiB9OyAvL3R3byBpZGVudGljYWwKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuaW5kZXhPZigidGV4dDIiLCAyKSwgMik7Ci0KLQl0cnkgewotCQkgbGlzdC5pbmRleE9mKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMyKTsKLQkvLwlhc3NlcnQoImxpc3QuaW5kZXhPZihcInRleHQyXCIsIC0xKT09MSIsIGxpc3QuaW5kZXhPZigidGV4dDIiLCAtMSk9PTEpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMCkpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMSkpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmluZGV4T2YoInRleHQyIiwgMikpOwotCi0JdHJ5IHsKLQkJbGlzdC5pbmRleE9mKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzU2VsZWN0ZWRJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAidGV4dDEiLCAidGV4dDIiLCAidGV4dDIiIH07IC8vdHdvIGlkZW50aWNhbAotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFRydWUobGlzdC5pc1NlbGVjdGVkKDApKTsKLQlhc3NlcnRUcnVlKGxpc3QuaXNTZWxlY3RlZCgxKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMikpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDMpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KSB7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDApKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmlzU2VsZWN0ZWQoMSkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGxpc3QuaXNTZWxlY3RlZCgyKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5pc1NlbGVjdGVkKDMpKTsKLQl9Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmUkSSgpIHsKLQl0cnkgewotCQlsaXN0LnJlbW92ZSgoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRpY2VzID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQwIiwgInRleHQxIiwgInRleHQyIiwgInRleHQzIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMSwgMCwgMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCS8vIGluZGV4ID4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIGxpc3QKLQl0cnkgewotCQlsaXN0LnJlbW92ZShuZXcgaW50W10geyA0LCAxfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMywgMSwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgLTEsIC0xIH0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IC0yLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygiOmM6IiwgbGlzdC5nZXRJdGVtcygpLCBpdGVtcyk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAxLCAxLCAxIH0pOwotCWFzc2VydEVxdWFscygKLQkJIjpkOiIsCi0JCWxpc3QuZ2V0SXRlbXMoKSwgbmV3IFN0cmluZ1tdIHsgInRleHQwIiwgInRleHQyIiwgInRleHQzIiB9KTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZToiLCBsaXN0LmdldEl0ZW1zKCksIG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIgfSk7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0KLQl0cnkgewotCQlpbnRbXSBpbmRpY2VzID0gbnVsbDsKLQkJbGlzdC5yZW1vdmUoaW5kaWNlcyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGljZXMgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDMgfSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ZjoiLCBsaXN0LmdldEl0ZW1zKCksIG5ldyBTdHJpbmdbXSB7ICJ0ZXh0MCIsICJ0ZXh0MiIgfSk7Ci0KLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZShuZXcgaW50W10geyAzLCAxIH0pOwotCWFzc2VydEVxdWFscygiOmc6IiwgbGlzdC5nZXRJdGVtcygpLCBuZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiIH0pOwotCi0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDQsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JLy8gaW5kZXggPiBudW1iZXIgb2YgZWxlbWVudHMgaW4gbGlzdAotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDQsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQlhc3NlcnRFcXVhbHMoIjpoOiIsIGxpc3QuZ2V0SXRlbXMoKSwgaXRlbXMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUobmV3IGludFtdIHsgMywgMSwgLTEgfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0JYXNzZXJ0RXF1YWxzKCI6aDoiLCBsaXN0LmdldEl0ZW1zKCksIGl0ZW1zKTsKLQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IC0xLCAtMSB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JYXNzZXJ0RXF1YWxzKCI6aToiLCBpdGVtcywgbGlzdC5nZXRJdGVtcygpKTsKLQotCQotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKG5ldyBpbnRbXSB7IDEsIDEsIDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKCI6ajoiLAotCQluZXcgU3RyaW5nW10geyAidGV4dDAiLCAidGV4dDIiLCAidGV4dDMiIH0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVBbGwoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIsICJ0ZXN0MiIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlsaXN0LnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JbGlzdC5yZW1vdmUoMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMSksICJ0ZXh0MyIpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMyk7Ci0KLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMik7Ci0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW0oMCksICJ0ZXh0MyIpOwotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQkKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnJlbW92ZSgxLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbSgwKSwgInRleHQxIik7Ci0KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9IAotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCWxpc3QucmVtb3ZlKDEpOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlhc3NlcnRUcnVlKGxpc3QuZ2V0SXRlbSgxKS5lcXVhbHMoInRleHQzIikpOwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDMpOwotCi0JbGlzdC5yZW1vdmUoMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDIpOwotCWxpc3QucmVtb3ZlKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtKDApLCAidGV4dDMiKTsKLQlsaXN0LnJlbW92ZSgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJ0ZXh0MSIsICJ0ZXh0MiIsICJ0ZXh0MyIgfTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCAzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKDAsIDApOwotCWFzc2VydEVxdWFscygyLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoInRleHQzIiwgbGlzdC5nZXRJdGVtKDEpKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKC0xLCAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RhcnQgaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgNCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgwLCAyKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgzLCAzKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCWxpc3QucmVtb3ZlKDIsIDApOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDMsIDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoMywgMyk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKC0xLCAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RhcnQgaW5kZXggPCAwIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDMsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCQotCWxpc3QucmVtb3ZlKDEsIDIpOwotCWFzc2VydEVxdWFscygxLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoInRleHQxIiwgbGlzdC5nZXRJdGVtKDApKTsKLQotCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCXRyeSB7Ci0JCWxpc3QucmVtb3ZlKDIsIDEwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoInRleHQyIiwgbGlzdC5nZXRJdGVtKDEpKTsKLQotCWxpc3QucmVtb3ZlKDIsIDApOwotCWFzc2VydEVxdWFscygzLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVMamF2YV9sYW5nX1N0cmluZygpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiwgInRlc3QyIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDQpOwotCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoKFN0cmluZykgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgNCk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgiaXRlbXM5ODkiKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCA0KTsKLQotCWxpc3QucmVtb3ZlKCJ0ZXh0MyIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAzKTsKLQotCWxpc3QucmVtb3ZlKCJ0ZXh0MiIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAyKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cnkgewotCQlsaXN0LnJlbW92ZSgoU3RyaW5nKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyg0LCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JdHJ5IHsKLQkJbGlzdC5yZW1vdmUoIml0ZW1zOTg5Iik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQkKLQlhc3NlcnRFcXVhbHMoNCwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgidGV4dDMiKTsKLQlhc3NlcnRFcXVhbHMoMywgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLQlsaXN0LnJlbW92ZSgidGV4dDIiKTsKLQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5nZXRJdGVtQ291bnQoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3QkSSgpIHsKLQl0cnkgewotCQlsaXN0LnNlbGVjdCgoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDAsIDIgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMiB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEsIDMgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEsIDMgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCWxpc3QuYWRkKCJpdGVtNCIpOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgLTEsIDAsIDEsIDIsIDMgfSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlpbnRbXSBpbmQgPSBuZXcgaW50WzMyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGluZC5sZW5ndGg7IGkrKykgaW5kW2ldID0gaTsKLQlsaXN0LnNlbGVjdChpbmQpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQgfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50W10ge30pOwotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludFtdIHt9KTsKLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAtMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JaXRlbXMgPSBsaXN0LmdldEl0ZW1zKCk7Ci0KLQlzZWxlY3QkSV9oZWxwZXIoaXRlbXMsIDAsIDMsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMgfSk7Ci0Jc2VsZWN0JElfaGVscGVyKGl0ZW1zLCAtMSwgMywgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQlzZWxlY3QkSV9oZWxwZXIoaXRlbXMsIC0xLCAzMCwgbmV3IGludFtdIHsgMCwgMSwgMiwgMywgNCB9KTsKLQotCQotCS8qLS0tIFNpbmdsZS1zZWxlY3QgLS0tKi8KLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JCi0JdHJ5IHsKLQkJbGlzdC5zZWxlY3QoKGludFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdeyAtMSB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAwIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDEgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxIH0pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdIHsgMiB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDIgfSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyAzIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQkKLQlsaXN0LnNlbGVjdChuZXcgaW50W10geyA0IH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgNCB9KTsKLQotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXSB7IDUgfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyA0IH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KG5ldyBpbnRbXXsgMCwgMSwgMiwgMyB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdChuZXcgaW50W117IC0xLCAwLCAxLCAyLCAzIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWludFtdIHNlbGVjdGlvbiA9IG5ldyBpbnRbMzJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSBzZWxlY3Rpb25baV0gPSBpOwotCWxpc3Quc2VsZWN0KHNlbGVjdGlvbik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QobmV3IGludFtdeyAxLCAxLCAxIH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtde30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgInRleHQxIiwgInRleHQyIiwgInRleHQzIiwgInRlc3QyIiB9OwotCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSwgMCk7Ci0JbGlzdC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpLCA0KTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWxpc3Quc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlsaXN0LnNlbGVjdCgyKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgyKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDEpOwotCWFzc2VydFNhbWUoInNlbGVjdCgxKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDMpOwotCWFzc2VydFNhbWUoCi0JCSJzZWxlY3QoMyk6IiwKLQkJbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCg1KTsKLQlhc3NlcnRTYW1lKAotCQkic2VsZWN0KDUpOiIsCi0JCWxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzIH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygic2VsZWN0KDApOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoLTEpOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KC0yKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgtMik6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoNCk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoNCk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlzZXRTaW5nbGVMaXN0KCk7Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0KLQlsaXN0LnNlbGVjdCgyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDIgfSk7Ci0KLQlsaXN0LnNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEgfSk7Ci0KLQlsaXN0LnNlbGVjdCgzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCg1KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDMgfSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoMCk7Ci0JYXNzZXJ0RXF1YWxzKCJzZWxlY3QoMCk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0JCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWxpc3Quc2VsZWN0KC0xKTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCgtMSk6IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JbGlzdC5zZWxlY3QoLTIpOwotCWFzc2VydEVxdWFscygic2VsZWN0KC0yKToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCg0KTsKLQlhc3NlcnRFcXVhbHMoInNlbGVjdCg0KToiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJSSgpIHsKLQlsaXN0LnNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMoImVtcHR5IGxpc3QiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2VsZWN0KDAsIDEpOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoLTEsIDApOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JaW50IG51bWJlciA9IDU7Ci0KLQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlpbnRbXSBlbXB0eSA9IHt9OwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSAiaXRlbSIgKyBpOwotCi0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxMCwgMSwgZW1wdHkpOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMywgMSwgZW1wdHkpOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIC0xLCBlbXB0eSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCA1LCA1LCBlbXB0eSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCA0LCA1LCBuZXcgaW50W10geyA0IH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgLTEsIDAsIG5ldyBpbnRbXSB7IDAgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAyLCA0LCBuZXcgaW50W10geyAyLCAzLCA0IH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMCwgMywgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDEsIDEsIG5ldyBpbnRbXSB7IDEgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMzAsIG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQgfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAtMSwgMywgbmV3IGludFtdIHsgMCwgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3Quc2VsZWN0KC0xMCwgLTkpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0KLQlsaXN0LnNlbGVjdCgxMDAwLCAyMDAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpLCAwKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCgxLCAyKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyIH0pOwotCi0JbGlzdC5zZWxlY3QoMSwgMyk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSwgMiwgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDIsIDIpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDEsIDIsIDMgfSk7Ci0KLQlsaXN0LnNlbGVjdCgzLCA1KTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAxLCAyLCAzLCA0IH0pOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygiZW1wdHkgbGlzdCIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JbGlzdC5zZWxlY3QoMCwgMSk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgtMSwgMCk7Ci0JYXNzZXJ0RXF1YWxzKCJlbXB0eSBsaXN0IiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNldEl0ZW1zKGl0ZW1zKTsKLQlsaXN0LnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7IDAgfSk7Ci0JbGlzdC5zZWxlY3QoLTEwLCAtOSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10geyAwIH0pOwotCi0JbGlzdC5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCWxpc3Quc2VsZWN0KDEwMDAsIDIwMDApOwotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCWxpc3Quc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMCB9KTsKLQotCWxpc3Quc2VsZWN0KDEsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMSB9KTsKLQotCWxpc3Quc2VsZWN0KDIsIDIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMiB9KTsKLQotCWxpc3Quc2VsZWN0KDMsIDMpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgMyB9KTsKLQotCWxpc3Quc2VsZWN0KDQsIDQpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgNCB9KTsKLQotCWxpc3Quc2VsZWN0KDUsIDUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsgNCB9KTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlsaXN0LnNlbGVjdCg1LCA1KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgxLCAyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgxLCAzKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNlbGVjdCgzLCA1KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDAsIDAsIG5ldyBpbnRbXXswfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCAxLCAxLCBuZXcgaW50W117MX0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMiwgMiwgbmV3IGludFtdezJ9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDMsIDMsIG5ldyBpbnRbXXszfSk7Ci0Jc2VsZWN0SUlfaGVscGVyKGl0ZW1zLCA0LCA0LCBuZXcgaW50W117NH0pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgNSwgNSwgbmV3IGludFtde30pOwotCXNlbGVjdElJX2hlbHBlcihpdGVtcywgMTAsIDEsIG5ldyBpbnRbXXt9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIDMsIDEsIG5ldyBpbnRbXXt9KTsKLQlzZWxlY3RJSV9oZWxwZXIoaXRlbXMsIC0xLCAtMSwgbmV3IGludFtde30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRm9udERhdGEgZm9udERhdGEgPSBsaXN0LmdldEZvbnQoKS5nZXRGb250RGF0YSgpWzBdOwotCWludCBsaW5lSGVpZ2h0OwotCUZvbnQgZm9udDsKLQkKLQlmb250ID0gbmV3IEZvbnQobGlzdC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgOCwgZm9udERhdGEuZ2V0U3R5bGUoKSk7Ci0JbGlzdC5zZXRGb250KGZvbnQpOwotCWxpbmVIZWlnaHQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKTsKLQlsaXN0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udCA9IG5ldyBGb250KGxpc3QuZ2V0RGlzcGxheSgpLCBmb250RGF0YS5nZXROYW1lKCksIDEyLCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQlsaXN0LnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0RXF1YWxzKGZvbnQsIGxpc3QuZ2V0Rm9udCgpKTsKLQlhc3NlcnRUcnVlKCJpdGVtSGVpZ2h0PSIgKyBsaXN0LmdldEl0ZW1IZWlnaHQoKSArICIsIGxpbmVIZWlnaHQ9IiArIGxpbmVIZWlnaHQsIGxpc3QuZ2V0SXRlbUhlaWdodCgpID4gbGluZUhlaWdodCk7Ci0JbGlzdC5zZXRGb250KG51bGwpOwotCWZvbnQuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JU3RyaW5nW10gaXRlbXMgPSB7ICJpdGVtMCIsICJpdGVtMSIsICJpdGVtMiIsICJpdGVtMyIgfTsKLQkKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRJdGVtQ291bnQoKSwgMCk7Ci0JaW50W10gY2FzZXMgPSB7IC0xMCwgMCwgMTAgfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXNbaV0sIG51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlc1tpXSwgIiIpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCWFzc2VydEVxdWFscyhsaXN0LmdldEl0ZW1Db3VudCgpLCAwKTsKLQotCWludCBjYXNlczJbXSA9IHsgMTAsIDE1LCAwIH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlczIubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlczJbaV0sICJmcmVkIik7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0SXRlbUNvdW50KCksIDApOwotCX0KLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0SXRlbSgxLCAibmV3MSIpOwotCWFzc2VydEVxdWFscyhuZXcgU3RyaW5nW10geyAiaXRlbTAiLCAibmV3MSIsICJpdGVtMiIsICJpdGVtMyIgfSwgbGlzdC5nZXRJdGVtcygpKTsKLQkKLQlzZXRTaW5nbGVMaXN0KCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SXRlbUNvdW50KCkpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJdHJ5IHsKLQkJCWxpc3Quc2V0SXRlbShjYXNlc1tpXSwgbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCX0KLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQlsaXN0LnNldEl0ZW0oY2FzZXNbaV0sICIiKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzMi5sZW5ndGg7IGkrKykgewotCQl0cnkgewotCQkJbGlzdC5zZXRJdGVtKGNhc2VzMltpXSwgImZyZWQiKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCWFzc2VydEVxdWFscygwLCBsaXN0LmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0JCi0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JbGlzdC5zZXRJdGVtKDEsICJuZXcxIik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJpdGVtMCIsICJuZXcxIiwgIml0ZW0yIiwgIml0ZW0zIiB9LCBsaXN0LmdldEl0ZW1zKCkpOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCXRyeSB7Ci0JCWxpc3Quc2V0SXRlbXMobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIFRPRE8gQW4gU1dURXJyb3Igc2hvdWxkIG5ldmVyIGhhcHBlbiBhbmQgc2hvdWxkIG5vdAotCS8vIGJlIHBhcnQgb2YgdGhlIHRlc3QgY2FzZS4gIExpc3Qgc2hvdWxkIHRocm93IGFuIAotCS8vIFNXVEV4Y2VwdGlvbi4KLS8vCVN0cmluZ1tdW10gY2FzZXMgPSB7IHsgbnVsbCB9LCB7Ci0vLwkJCSJkc2FkYSIsIG51bGwsICJkc2Rhc2Rhc2QiIH0KLS8vCX07Ci0vLwlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJbGlzdC5zZXRJdGVtcyhjYXNlc1tpXSk7Ci0vLwkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zIG5vdCBmb3VuZCIpOwotLy8JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLS8vCQl9Ci0vLwl9Ci0KLQlTdHJpbmdbXVtdIGl0ZW1BcnIgPSB7IHsKLQkJfSwgewotCQkJIiIgfSwgewotCQkJInNkYXNkIiB9LCB7Ci0JCQkic2Rhc2QiLCAiMzIzNDM0IiB9Ci0JfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1BcnIubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRJdGVtcyhpdGVtQXJyW2ldKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1BcnJbaV0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JfQotCi0JdHJ5IHsKLQkJbGlzdC5zZXRJdGVtcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUFyci5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldEl0ZW1zKGl0ZW1BcnJbaV0pOwotCQlhc3NlcnRFcXVhbHMoImNhc2U6IiArIGksIGl0ZW1BcnJbaV0sIGxpc3QuZ2V0SXRlbXMoKSk7Ci0JfQotCi0JCi0JdHJ5IHsKLQkJbGlzdC5zZXRJdGVtcyhudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRJKCkgewotCWludCBudW1iZXIgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWxpc3QuYWRkKCJmcmVkIiArIGkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbMF0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBNVUxUSTogc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCkiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7Mn0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAyKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlcn0pOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHszLCAxLCA1LCAyfSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHszLCAxLCA1LCAyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsxLCAyLCAzLCA1fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsxLCAwfSk7Ci0JYXNzZXJ0U2FtZSgiTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsxLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswLCAxfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMSwgMiwgMywgNX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KTsKLQotCWludFtdIGluZGljZXMgPSBuZXcgaW50IFtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaW5kaWNlc1tpXSA9IGk7Ci0JfQotCWxpc3Quc2V0U2VsZWN0aW9uKGluZGljZXMpOwotCWFzc2VydFNhbWUoIk1VTFRJOiBzZXRTZWxlY3Rpb24oaW5kaWNlcykiLCBpbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyLCBudW1iZXJ9KSIsIG5ldyBpbnRbMF0sIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlciAtIDF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgbnVtYmVyIC0gMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCBudW1iZXIsIDF9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIG51bWJlciwgMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MCwgMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIDAsIG51bWJlciAtIDJ9KTsKLQlhc3NlcnRTYW1lKCJNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIDAsIG51bWJlciAtIDJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezAsIG51bWJlciAtIDIsIG51bWJlciAtIDF9KTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbMF0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24oKGludFtdKSBudWxsKSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBNVUxUSTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAwfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgTVVMVEk6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIE1VTFRJOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlsaXN0LmFkZCgiZnJlZCIgKyBpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgWzBdKSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIFNJTkdMRTogc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCkiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsyfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsxLCAwfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHsxLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIDEsIDIsIDMsIDV9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50IFtdIHt9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10ge251bWJlciAtIDEsIG51bWJlcn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWluZGljZXMgPSBuZXcgaW50IFtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaW5kaWNlc1tpXSA9IGk7Ci0JfQotCWxpc3Quc2V0U2VsZWN0aW9uKGluZGljZXMpOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24oaW5kaWNlcykiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIsIG51bWJlcn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyLCBudW1iZXJ9KSIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHtudW1iZXIgLSAxLCBudW1iZXIgLSAxfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCBudW1iZXIsIDF9KTsKLQlhc3NlcnRFcXVhbHMoIlNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIG51bWJlciwgMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgMCwgbnVtYmVyIC0gMn0pOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7bnVtYmVyIC0gMSwgMCwgbnVtYmVyIC0gMn0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFswXSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCXRyeSB7Ci0JCWxpc3Quc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIEVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKChpbnRbXSkgbnVsbCkiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswfSkgZ2V0Rm9jdXNJbmRleCgpIiwgbGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xfSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMX0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTF9KSBnZXRGb2N1c0luZGV4KCkiLCBsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pIiwgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscygiRU1QVFkgU0lOR0xFOiBzZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgMH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7LTEsIDB9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gey0xLCAwfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHstMSwgMH0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IGludCBbXSB7MCwgLTF9KTsKLQlhc3NlcnRFcXVhbHMoIkVNUFRZIFNJTkdMRTogc2V0U2VsZWN0aW9uKG5ldyBpbnQgW10gezAsIC0xfSkiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKCJFTVBUWSBTSU5HTEU6IHNldFNlbGVjdGlvbihuZXcgaW50IFtdIHswLCAtMX0pIGdldEZvY3VzSW5kZXgoKSIsIGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWludCBudW1iZXIgPSA4OwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWxpc3QuYWRkKCJmcmVkICIgKyBpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQl9Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMiJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbXSB7ImZyZWQgMiJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMSIsICJmcmVkIDAifSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgMSJ9KTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIC0xIiwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgIiArIChudW1iZXIgLSAxKSwgImZyZWQgIiArIG51bWJlcn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAtMSIsICJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmcgW10geyJmcmVkIDAifSk7Ci0JCi0JU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nIFtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSAiZnJlZCAiICsgaTsKLQl9Ci0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb24oKSwgaXRlbXMpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyBudW1iZXIsICJmcmVkICIgKyBudW1iZXJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZyBbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSksICJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkICIgKyBudW1iZXIsICJmcmVkIDEifSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10geyJmcmVkIDAiLCAiZnJlZCAxIn0pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWxpc3QuYWRkKCJmcmVkICIgKyBpKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgWzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1swXSk7Ci0KLQl0cnkgewotCQlsaXN0LnNldFNlbGVjdGlvbigoU3RyaW5nW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMiJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsiZnJlZCAyIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0KLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDEiLCAiZnJlZCAwIn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbigpLCBuZXcgU3RyaW5nW10ge30pOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgLTEiLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHsiZnJlZCAiICsgKG51bWJlciAtIDEpfSk7Ci0KLQlpdGVtcyA9IG5ldyBTdHJpbmdbbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gImZyZWQgIiArIGk7Ci0JfQotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAiICsgbnVtYmVyLCAiZnJlZCAiICsgbnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkICIgKyAobnVtYmVyIC0gMSksICJmcmVkICIgKyAobnVtYmVyIC0gMSl9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFtdIHsiZnJlZCAwIiwgImZyZWQgIiArIG51bWJlciwgImZyZWQgMSJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb24oKSwgbmV3IFN0cmluZ1tdIHt9KTsKLQkKLQlsaXN0LnJlbW92ZUFsbCgpOwotCQkKLQlsaXN0LnNldFNlbGVjdGlvbihuZXcgU3RyaW5nIFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JdHJ5IHsKLQkJbGlzdC5zZXRTZWxlY3Rpb24oKFN0cmluZ1tdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJpbmcgW10geyJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24obmV3IFN0cmluZyBbXSB7ImZyZWQgMCIsICJmcmVkIDAifSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uKCksIG5ldyBTdHJpbmdbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IG51bWJlciA9IDg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlsaXN0LmFkZCgiZnJlZCIgKyBpKTsKLQl9Ci0KLQlsaXN0LnNldFNlbGVjdGlvbigyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMik7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTUpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDApOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJbGlzdC5hZGQoImZyZWQiICsgaSk7Ci0JfQotCi0JbGlzdC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDIpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC01KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAwKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCQotCWxpc3QucmVtb3ZlQWxsKCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbklJKCkgewotCWludCBudW1iZXIgPSA4OwotCVN0cmluZ1tdIGl0ZW1zID0gbmV3IFN0cmluZ1tudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gImZyZWQiICsgaTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDIpOwotCWFzc2VydFNhbWUobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MSwgMn0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0zLCAtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRTYW1lKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezAsIDF9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMiwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMiwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0U2FtZShsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAyLCBudW1iZXIgLSAxfSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyICsgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigwLCAwKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMCk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oMiwgMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAxLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7bnVtYmVyIC0gMX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgbnVtYmVyIC0gMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCi0JbGlzdC5yZW1vdmVBbGwoKTsKLQotCWxpc3Quc2V0U2VsZWN0aW9uKC0yLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50WzBdKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIC0xKTsKLQkJCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKDEsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAtMSk7Ci0JCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIC0xKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbMF0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgLTEpOwotCi0JCi0Jc2V0U2luZ2xlTGlzdCgpOwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCAwKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigxLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7MX0pOwotCWFzc2VydEVxdWFscyhsaXN0LmdldEZvY3VzSW5kZXgoKSwgMSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10gezR9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIDQpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKG51bWJlciAtIDEsIG51bWJlciAtIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHtudW1iZXIgLSAxfSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0Rm9jdXNJbmRleCgpLCBudW1iZXIgLSAxKTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0zLCAtMik7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKDAsIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigtMiwgLTEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIgLSAyLCBudW1iZXIgLSAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24oLTEsIDApOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlciArIDEpOwotCWFzc2VydEVxdWFscyhsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQkKLQlsaXN0LnNldFNlbGVjdGlvbigyLCAxKTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCksIG5ldyBpbnRbXSB7fSk7Ci0JCi0JbGlzdC5zZXRTZWxlY3Rpb24obnVtYmVyIC0gMSwgbnVtYmVyIC0gMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge251bWJlciAtIDF9KTsKLQlhc3NlcnRFcXVhbHMobGlzdC5nZXRGb2N1c0luZGV4KCksIG51bWJlciAtIDEpOwotCQotCWxpc3Quc2V0U2VsZWN0aW9uKC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvcEluZGV4SSgpIHsKLQlsaXN0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydEVxdWFscygiTVVMVEk6IHNldFRvcEluZGV4KDMpIGluIGVtcHR5IGxpc3QiLCAwLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCVN0cmluZ1tdIGl0ZW1zID0geyAiaXRlbTAiLCAiaXRlbTEiLCAiaXRlbTIiLCAiaXRlbTMiIH07Ci0JbGlzdC5zZXRJdGVtcyhpdGVtcyk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQlsaXN0LnNldFRvcEluZGV4KGkpOwotCQlhc3NlcnRFcXVhbHMoIk1VTFRJOiBzZXRUb3BJbmRleChpPSIgKyBpICsgIikiLCBpLCBsaXN0LmdldFRvcEluZGV4KCkpOwotCX0KLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQlsaXN0LnNldFRvcEluZGV4KDMpOwotCWFzc2VydEVxdWFscygiU0lOR0xFOiBzZXRUb3BJbmRleCgzKSBpbiBlbXB0eSBsaXN0IiwgMCwgbGlzdC5nZXRUb3BJbmRleCgpKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJbGlzdC5zZXRUb3BJbmRleChpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTSU5HTEU6IHNldFRvcEluZGV4KGk9IiArIGkgKyAiKSIsIGksIGxpc3QuZ2V0VG9wSW5kZXgoKSk7Ci0JfQotCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQlTdHJpbmdbXSBpdGVtcyA9IHsgIml0ZW0wIiwgIml0ZW0xIiwgIml0ZW0yIiwgIml0ZW0zIiB9OwotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlsaXN0LnNob3dTZWxlY3Rpb24oKTsKLQotCQotCXNldFNpbmdsZUxpc3QoKTsKLQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlsaXN0LnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0KChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9kZXNlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb2N1c0luZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcEluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pbmRleE9mTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzU2VsZWN0ZWRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmUkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtSUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtcyRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvcEluZGV4SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2hvd1NlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2FkZExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0kiKSkgdGVzdF9hZGRMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdCRJIikpIHRlc3RfZGVzZWxlY3QkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RBbGwiKSkgdGVzdF9kZXNlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJIikpIHRlc3RfZGVzZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kZXNlbGVjdElJIikpIHRlc3RfZGVzZWxlY3RJSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9jdXNJbmRleCIpKSB0ZXN0X2dldEZvY3VzSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcyIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGljZXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcEluZGV4IikpIHRlc3RfZ2V0VG9wSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxqYXZhX2xhbmdfU3RyaW5nSSIpKSB0ZXN0X2luZGV4T2ZMamF2YV9sYW5nX1N0cmluZ0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzU2VsZWN0ZWRJIikpIHRlc3RfaXNTZWxlY3RlZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZSRJIikpIHRlc3RfcmVtb3ZlJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUxqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfcmVtb3ZlTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3QkSSIpKSB0ZXN0X3NlbGVjdCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEkiKSkgdGVzdF9zZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RJSSIpKSB0ZXN0X3NlbGVjdElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUlMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldEl0ZW1JTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEl0ZW1zJExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0SXRlbXMkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbiRJIikpIHRlc3Rfc2V0U2VsZWN0aW9uJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbiRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKSkgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotTGlzdCBsaXN0OwotLyoqCi0gKiBUZXN0IGlmICdkZXNlbGVjdCh1LCB2KScgaXMgdGhlIHNhbWUgYXMgJ2ZvciAoaT11OyBpPD12OyArK2kpIGRlc2VsZWN0KGkpOycKLSAqLwotcHJvdGVjdGVkIHZvaWQgZGVzZWxlY3RJSV9oZWxwZXIoCi0JU3RyaW5nW10gaXRlbXMsCi0JaW50IHN0YXJ0LAotCWludCBlbmQsCi0JaW50W10gZXhwZWN0ZWRJbmRpY2VzKSB7Ci0JCQotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQotCWxpc3QuZGVzZWxlY3Qoc3RhcnQsIGVuZCk7Ci0JYXNzZXJ0U2FtZSgKLQkJIjooIiArIHN0YXJ0ICsgIiwgIiArIGVuZCArICIpOiIsCi0JCWV4cGVjdGVkSW5kaWNlcywgbGlzdC5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JbGlzdC5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWlmICggMCAhPSAobGlzdC5nZXRTdHlsZSgpICYgU1dULk1VTFRJKSApIHsKLQkJYXNzZXJ0U2FtZSgic2V0U2VsZWN0aW9uKGl0ZW1zKToiLCBpdGVtcywgbGlzdC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgKytpKSB7Ci0JCWxpc3QuZGVzZWxlY3QoaSk7Ci0JfQotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLX0KLS8qKgotICogRGlzcG9zZSBvZiB0aGUgbWFpbiBsaXN0IGFuZCBjcmVhdGUgYSBuZXcsIHNpbmdsZS1zZWxlY3Rpb24gb25lLgotICovCi1wcm90ZWN0ZWQgTGlzdCBzZXRTaW5nbGVMaXN0KCkgewotCWxpc3QuZGlzcG9zZSgpOwotCWxpc3QgPSBuZXcgTGlzdChzaGVsbCwgU1dULlNJTkdMRSk7Ci0Jc2V0V2lkZ2V0KGxpc3QpOwotCXJldHVybiBsaXN0OwotfQotLyoqCi0gKiBTaW1pbGFyIHRvIGRlc2VsZWN0SUlfaGVscGVyLCBjaGVja3MgaWYgc2VsZWN0KHUsIHYpIGlzIHRoZSBzYW1lIGFzCi0gKiBmb3IgKGk9dTsgaTw9djsgKytpKSBzZWxlY3QoaSkKLSAqLwotcHJvdGVjdGVkIHZvaWQgc2VsZWN0SUlfaGVscGVyKAotCVN0cmluZ1tdIGl0ZW1zLAotCWludCBzdGFydCwKLQlpbnQgZW5kLAotCWludFtdIGV4cGVjdGVkSW5kaWNlcykgewotCWxpc3Quc2V0SXRlbXMoaXRlbXMpOwotCWxpc3Quc2VsZWN0KHN0YXJ0LCBlbmQpOwotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoImRlc2VsZWN0QWxsOiIsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpLCBuZXcgaW50W10ge30pOwotCi0JZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSAvLyA8PSBvbiBwdXJwb3NlCi0JCWxpc3Quc2VsZWN0KGkpOwotCi0JYXNzZXJ0U2FtZSgiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci19Ci0vKioKLSAqIFNpbWlsYXIgdG8gZGVzZWxlY3RJSV9oZWxwZXIsIGNoZWNrcyBpZiBzZWxlY3QoaW50IFtdYXJyKSBnaXZlcyB0aGUgc2FtZQotICogcmVzdWx0IGFzIHNldmVyYWwgaW5kaXZpZHVhbCBzZWxlY3QoaW50KSBjYWxscy4gVGhlIGludFtdIHVzZWQgZm9yIHNlbGVjdGlvbgotICogd2lsbCBiZSBmaWxsZWQgYWxsIGludGVnZXJzIGZyb20gc3RhcnQgdG8gZW5kIGluY2x1c2l2ZSwgaW4gb3JkZXIuCi0gKi8KLXByb3RlY3RlZCB2b2lkIHNlbGVjdCRJX2hlbHBlcigKLQlTdHJpbmdbXSBpdGVtcywKLQlpbnQgc3RhcnQsCi0JaW50IGVuZCwKLQlpbnRbXSBleHBlY3RlZEluZGljZXMpIHsKLQlpbnRbXSBzZWxlY3Rpb24gPSBuZXcgaW50W2VuZCAtIHN0YXJ0ICsgMV07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyArK2kpIHsKLQkJc2VsZWN0aW9uW2ldID0gaSArIHN0YXJ0OwotCX0KLQotCWxpc3Quc2VsZWN0KHNlbGVjdGlvbik7Ci0KLQlhc3NlcnRTYW1lKAotCQkiOigiICsgc3RhcnQgKyAiLCAiICsgZW5kICsgIik6IiwKLQkJZXhwZWN0ZWRJbmRpY2VzLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQlsaXN0LmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCJkZXNlbGVjdEFsbDoiLCBsaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKSwgbmV3IGludFtdIHt9KTsKLQotCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgLy8gPD0gb24gcHVycG9zZQotCQlsaXN0LnNlbGVjdChpKTsKLQotCWFzc2VydFNhbWUoCi0JCSI6KCIgKyBzdGFydCArICIsICIgKyBlbmQgKyAiKToiLAotCQlleHBlY3RlZEluZGljZXMsIGxpc3QuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCWxpc3QuZGVzZWxlY3RBbGwoKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGFkZCgpIHsKLSAgICBsaXN0LmFkZCgidGhpcyIpOwotICAgIGxpc3QuYWRkKCJpcyIpOwotICAgIGxpc3QuYWRkKCJTV1QiKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19ET1dOLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgnICcsIDMyLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgYWRkKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBhZGQoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCA1LCAzMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmVjNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9oYW5kbGVFdmVudExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50KCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjYjNkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudQotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltZW51ID0gbmV3IE1lbnUoc2hlbGwpOwotCXNldFdpZGdldChtZW51KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5VTEwpOwotCW5ldyBNZW51KGNvbXApOwotCWNvbXAuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RlY29yYXRpb25zSSgpIHsKLQlNZW51IG5ld01lbnU7Ci0JU2hlbGwgbnVsbFNoZWxsID0gbnVsbDsKLQl0cnkgewotCQluZXdNZW51ID0gbmV3IE1lbnUobnVsbFNoZWxsLCBTV1QuTlVMTCk7Ci0JCW5ld01lbnUuZGlzcG9zZSgpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULk5VTEwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKSB7Ci0JbmV3IE1lbnUobWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0JTWVudSBuZXdNZW51OwotCU1lbnVJdGVtIG1JdGVtID0gbnVsbDsKLQl0cnkgewotCQluZXdNZW51ID0gbmV3IE1lbnUobUl0ZW0pOwotCQluZXdNZW51LmRpc3Bvc2UoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JbmV3TWVudSA9IG5ldyBNZW51KG1JdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlIZWxwTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSGVscExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCW1lbnUuYWRkSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudS5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnUubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudS5yZW1vdmVIZWxwTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZUhlbHBMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnUucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IE1lbnVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JfTsKLQotCXRyeSB7Ci0JCW1lbnUuYWRkTWVudUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRNZW51TGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudS5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQltZW51Lm5vdGlmeUxpc3RlbmVycyhTV1QuU2hvdywgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkKTsKLQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudS5ub3RpZnlMaXN0ZW5lcnMoU1dULkhpZGUsIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudS5yZW1vdmVNZW51TGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZU1lbnVMaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnUucmVtb3ZlTWVudUxpc3RlbmVyKG1lbnVMaXN0ZW5lcik7Ci0JbWVudS5ub3RpZnlMaXN0ZW5lcnMoU1dULlNob3csIG5ldyBFdmVudCgpKTsKLQlhc3NlcnRGYWxzZShsaXN0ZW5lckNhbGxlZCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVmYXVsdEl0ZW0oKSB7Ci0JLy8gdGVzdGVkIGluIHNldERlZmF1bHRJdGVtIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEVuYWJsZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRFcXVhbHMobWVudS5nZXRJdGVtQ291bnQoKSwgaSk7Ci0JICAJbmV3IE1lbnVJdGVtKG1lbnUsIDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlNZW51SXRlbSBtSXRlbTAgPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCU1lbnVJdGVtIG1JdGVtMSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0SXRlbSgwKSwgbUl0ZW0wKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXRJdGVtKDEpLCBtSXRlbTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludCBudW1iZXIgPSA1OwotCU1lbnVJdGVtW10gaXRlbXMgPSBuZXcgTWVudUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IE1lbnVJdGVtKG1lbnUsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMoIjphOiIsIGl0ZW1zLCBtZW51LmdldEl0ZW1zKCkpOwotCQotCW1lbnUuZ2V0SXRlbXMoKVswXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKCI6YjoiLCBuZXcgTWVudUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIG1lbnUuZ2V0SXRlbXMoKSk7Ci0KLQltZW51LmdldEl0ZW1zKClbM10uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmM6IiwgbmV3IE1lbnVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIG1lbnUuZ2V0SXRlbXMoKSk7Ci0KLQltZW51LmdldEl0ZW1zKClbMV0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygiOmQ6IiwgbmV3IE1lbnVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzNdfSwgbWVudS5nZXRJdGVtcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0UGFyZW50KCksIHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRJdGVtKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlNZW51IG5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JYXNzZXJ0TnVsbChuZXdNZW51LmdldFBhcmVudEl0ZW0oKSk7Ci0JbUl0ZW0uc2V0TWVudShuZXdNZW51KTsKLQlhc3NlcnRFcXVhbHMobmV3TWVudS5nZXRQYXJlbnRJdGVtKCksIG1JdGVtKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnRNZW51KCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlNZW51IG5ld01lbnUgPSBuZXcgTWVudShzaGVsbCwgU1dULkRST1BfRE9XTik7Ci0JYXNzZXJ0TnVsbChuZXdNZW51LmdldFBhcmVudE1lbnUoKSk7Ci0JbUl0ZW0uc2V0TWVudShuZXdNZW51KTsKLQlhc3NlcnRFcXVhbHMobmV3TWVudS5nZXRQYXJlbnRNZW51KCksIG1lbnUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxsKCkgewotCWFzc2VydEVxdWFscyhtZW51LmdldFNoZWxsKCksIHNoZWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiBzZXRWaXNpYmxlIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCU1lbnVJdGVtW10gbWlzID0gbmV3IE1lbnVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAltaXNbaV0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5VTEwpOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRFcXVhbHMobWVudS5pbmRleE9mKG1pc1tpXSksIGkpOwotCQlpZiAoaT4xKQotCQkJYXNzZXJ0VHJ1ZShtZW51LmluZGV4T2YobWlzW2ktMV0pICE9IGkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc0VuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHNldEVuYWJsZWQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCS8vIFRoaXMgdGVzdCBjYW4gbm90IGJlIHJ1biBhcyBpdCBjdXJyZW50bHkgaXMgd3JpdHRlbi4gIE9uIFdpbmRvd3MsIGlmIGEgCi0JLy8gbWVudSBoYXMgbm8gbWVudSBpdGVtcywgaXQgd2lsbCBub3QgYmVjb21lIHZpc2libGUuCi0JLy8gSWYgd2UgYWRkIG1lbnUgaXRlbXMgdG8gdGhlIG1lbnUgdGhlbiBhIHNlY29uZCBwcm9ibGVtIGlzIGVuY291bnRlcmVkIAotCS8vIGJlY2F1c2UgbWVudS5zZXRWaXNpYmxlKCkgZW50ZXJzIGludG8gYSBtb2RhbCBsb29wIGFuZCBleGVjdXRpb24gb2YgCi0JLy8gdGhlIEpVbml0IHRlc3QgY2FzZSB3aWxsIG5vdCBjb250aW51ZSB1bnRpbCB0aGUgbWVudSBpcyBzZWxlY3RlZCBhbmQgY2xvc2VkLgotCWlmICh0cnVlKSByZXR1cm47Ci0JbWVudS5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUobWVudS5pc1Zpc2libGUoKSk7Ci0KLQkvLyBhcGkgbm90IGltcGxlbWVudGVkIHlldAotCWlmIChmQ2hlY2tWaXNpYmlsaXR5KSB7Ci0JCW1lbnUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtZW51LmlzVmlzaWJsZSgpLCBmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkSGVscExpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkTWVudUxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERlZmF1bHRJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKCkgewotCU1lbnVJdGVtIG1JdGVtMCA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTlVMTCk7Ci0JTWVudUl0ZW0gbUl0ZW0xID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQltZW51LnNldERlZmF1bHRJdGVtKG1JdGVtMCk7Ci0JYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0RGVmYXVsdEl0ZW0oKSwgbUl0ZW0wKTsKLQlhc3NlcnRUcnVlKCJBZnRlciBzZXREZWZhdWx0SXRlbShtSXRlbTApOiIsIG1lbnUuZ2V0RGVmYXVsdEl0ZW0oKSAhPSBtSXRlbTEpOwotCW1lbnUuc2V0RGVmYXVsdEl0ZW0obUl0ZW0xKTsKLQlhc3NlcnRFcXVhbHMobWVudS5nZXREZWZhdWx0SXRlbSgpLCBtSXRlbTEpOwotCWFzc2VydFRydWUoIkFmdGVyIHNldERlZmF1bHRJdGVtKG1JdGVtMSk6IiwgbWVudS5nZXREZWZhdWx0SXRlbSgpICE9IG1JdGVtMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0JbWVudS5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUobWVudS5nZXRFbmFibGVkKCkpOwotCW1lbnUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UobWVudS5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uSUkoKSB7Ci0JbWVudS5zZXRMb2NhdGlvbigwLDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpIHsKLQltZW51LnNldExvY2F0aW9uKG5ldyBQb2ludCgwLDApKTsKLQl0cnkgewotCQltZW51LnNldExvY2F0aW9uKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmlzaWJsZVooKSB7Ci0JLy8gVGhpcyB0ZXN0IGNhbiBub3QgYmUgcnVuIGFzIGl0IGN1cnJlbnRseSBpcyB3cml0dGVuLiAgT24gV2luZG93cywgaWYgYSAKLQkvLyBtZW51IGhhcyBubyBtZW51IGl0ZW1zLCBpdCB3aWxsIG5vdCBiZWNvbWUgdmlzaWJsZS4KLQkvLyBJZiB3ZSBhZGQgbWVudSBpdGVtcyB0byB0aGUgbWVudSB0aGVuIGEgc2Vjb25kIHByb2JsZW0gaXMgZW5jb3VudGVyZWQgCi0JLy8gYmVjYXVzZSBtZW51LnNldFZpc2libGUoKSBlbnRlcnMgaW50byBhIG1vZGFsIGxvb3AgYW5kIGV4ZWN1dGlvbiBvZiAKLQkvLyB0aGUgSlVuaXQgdGVzdCBjYXNlIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsIHRoZSBtZW51IGlzIHNlbGVjdGVkIGFuZCBjbG9zZWQuCi0JaWYgKHRydWUpIHJldHVybjsKLQltZW51LnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51LmdldFZpc2libGUoKSk7Ci0JLy8gQVBJIG5vdCBpbXBsZW1lbnRlZCB5ZXQgCi0JaWYgKGZDaGVja1Zpc2liaWxpdHkpIHsKLQkJbWVudS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbnUuZ2V0VmlzaWJsZSgpLCBmYWxzZSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldERlZmF1bHRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnRNZW51Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNFbmFibGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1Zpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlTWVudUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTWVudUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyIikpIHRlc3RfYWRkSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIiKSkgdGVzdF9hZGRNZW51TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19NZW51TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERlZmF1bHRJdGVtIikpIHRlc3RfZ2V0RGVmYXVsdEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50SXRlbSIpKSB0ZXN0X2dldFBhcmVudEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudE1lbnUiKSkgdGVzdF9nZXRQYXJlbnRNZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTaGVsbCIpKSB0ZXN0X2dldFNoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzRW5hYmxlZCIpKSB0ZXN0X2lzRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNWaXNpYmxlIikpIHRlc3RfaXNWaXNpYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZU1lbnVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01lbnVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RGVmYXVsdEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0iKSkgdGVzdF9zZXREZWZhdWx0SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RW5hYmxlZFoiKSkgdGVzdF9zZXRFbmFibGVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TG9jYXRpb25JSSIpKSB0ZXN0X3NldExvY2F0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpKSB0ZXN0X3NldExvY2F0aW9uTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmlzaWJsZVoiKSkgdGVzdF9zZXRWaXNpYmxlWigpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lbnUgbWVudTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjliNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWVudSA9IG5ldyBNZW51KHNoZWxsKTsKLQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCAwKTsKLQlzZXRXaWRnZXQobWVudUl0ZW0pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMKTsKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQkKLQl0cnkgewotCQluZXcgTWVudUl0ZW0obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5DSEVDSyk7Ci0JbUl0ZW0uZGlzcG9zZSgpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DQVNDQURFKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5DQVNDQURFKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci0JbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlBVU0gpOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlBVU0gpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKLQlhc3NlcnRUcnVlKG1JdGVtLmdldFN0eWxlKCk9PVNXVC5TRVBBUkFUT1IpOwotCW1JdGVtLmRpc3Bvc2UoKTsKLQltSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOwotCWFzc2VydFRydWUobUl0ZW0uZ2V0U3R5bGUoKT09U1dULlJBRElPKTsKLQltSXRlbS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVudUlJKCkgewotCU1lbnVJdGVtIG1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMLCAwKTsgLy9jcmVhdGUgYSBtZW51IGl0ZW0gYXQgaW5kZXggMAotCWFzc2VydE5vdE51bGwobUl0ZW0pOwotCWFzc2VydFRydWUobWVudS5nZXRJdGVtKDApLmVxdWFscyhtSXRlbSkpOwotCW1JdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OVUxMLCAxKTsKLQlhc3NlcnROb3ROdWxsKG1JdGVtKTsKLQlhc3NlcnRUcnVlKG1lbnUuZ2V0SXRlbSgxKS5lcXVhbHMobUl0ZW0pKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JQXJtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQXJtTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldEFybWVkKEFybUV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCX07Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0uYWRkQXJtTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGFkZEFybUxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnVJdGVtLmFkZEFybUxpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULkFybSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydFRydWUobGlzdGVuZXJDYWxsZWQpOwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLnJlbW92ZUFybUxpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCW1lbnVJdGVtLnJlbW92ZUFybUxpc3RlbmVyKGxpc3RlbmVyKTsKLQltZW51SXRlbS5ub3RpZnlMaXN0ZW5lcnMoU1dULkFybSwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlIZWxwTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSGVscExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoZWxwUmVxdWVzdGVkKEhlbHBFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCQotCXRyeSB7Ci0JCW1lbnVJdGVtLmFkZEhlbHBMaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkSGVscExpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCW1lbnVJdGVtLmFkZEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JbWVudUl0ZW0ubm90aWZ5TGlzdGVuZXJzKFNXVC5IZWxwLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlSGVscExpc3RlbmVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciByZW1vdmVIZWxwTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQltZW51SXRlbS5yZW1vdmVIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuSGVscCwgbmV3IEV2ZW50KCkpOwotCWFzc2VydEZhbHNlKGxpc3RlbmVyQ2FsbGVkKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9Ci0JfTsKLQkKLQl0cnkgewotCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgYWRkU2VsZWN0aW9uTGlzdGVuZXIgd2l0aCBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0VHJ1ZShsaXN0ZW5lckNhbGxlZCk7Ci0JCi0JdHJ5IHsKLQkJbWVudUl0ZW0ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIHdpdGggbnVsbCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JbWVudUl0ZW0ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCW1lbnVJdGVtLm5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uLCBuZXcgRXZlbnQoKSk7Ci0JYXNzZXJ0RmFsc2UobGlzdGVuZXJDYWxsZWQpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFjY2VsZXJhdG9yKCkgewotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QxICsgJ1gnKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULk1PRDEgKyAnWCcpOwotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QyICsgJ1knKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULk1PRDIgKyAnWScpOwotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5NT0QzICsgJ1onKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULk1PRDMgKyAnWicpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RW5hYmxlZFooKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1lbnUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRQYXJlbnQoKSwgbWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFNlbGVjdGlvblooKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQltZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUobWVudUl0ZW0uaXNFbmFibGVkKCkpOwotCW1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5pc0VuYWJsZWQoKSwgZmFsc2UpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkQXJtTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Bcm1MaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSGVscExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfSGVscExpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lcigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWNjZWxlcmF0b3JJKCkgewotCW1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKFNXVC5DVFJMICsgJ1onKTsKLQlhc3NlcnRFcXVhbHMobWVudUl0ZW0uZ2V0QWNjZWxlcmF0b3IoKSwgU1dULkNUUkwgKyAnWicpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCW1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShtZW51SXRlbS5nZXRFbmFibGVkKCkpOwotCW1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhtZW51SXRlbS5nZXRFbmFibGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbChtZW51SXRlbS5nZXRJbWFnZSgpKTsKLQltZW51SXRlbS5zZXRJbWFnZShpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMF0sIG1lbnVJdGVtLmdldEltYWdlKCkpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0SW1hZ2UoKSAhPSBpbWFnZXNbMV0pOwotCW1lbnVJdGVtLnNldEltYWdlKG51bGwpOwotCWFzc2VydE51bGwobWVudUl0ZW0uZ2V0SW1hZ2UoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCkgewotCWFzc2VydE51bGwobWVudUl0ZW0uZ2V0TWVudSgpKTsKLQlNZW51SXRlbSBtSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuQ0FTQ0FERSk7Ci0JTWVudSBuZXdNZW51ID0gbmV3IE1lbnUoc2hlbGwsIFNXVC5EUk9QX0RPV04pOwotCW1JdGVtLnNldE1lbnUobmV3TWVudSk7Ci0JYXNzZXJ0RXF1YWxzKG1JdGVtLmdldE1lbnUoKSwgbmV3TWVudSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uWigpIHsKLQotCWludFtdIGl0ZW1TdHlsZXMgPSB7U1dULkNIRUNLLCBTV1QuUkFESU99OwotCWZvciAoaW50IGk9MDsgaTxpdGVtU3R5bGVzLmxlbmd0aDsgaSsrKQotCXsKLQkJTWVudUl0ZW0gbUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgaXRlbVN0eWxlc1tpXSk7Ci0JCW1JdGVtLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhtSXRlbS5nZXRTZWxlY3Rpb24oKSwgZmFsc2UpOwotCQltSXRlbS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWFzc2VydFRydWUobUl0ZW0uZ2V0U2VsZWN0aW9uKCkpOwotCQltSXRlbS5kaXNwb3NlKCk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JbWVudUl0ZW0uc2V0VGV4dCgiQUJDREVGRyIpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0VGV4dCgpLmVxdWFscygiQUJDREVGRyIpKTsKLQl0cnkgewotCQltZW51SXRlbS5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBhZGRBcm1MaXN0ZW5lciB3aXRoIG51bGwgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQltZW51SXRlbS5zZXRUZXh0KCJBQkNERUZHIik7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoU1dULk1PRDEgKyAnQScpOwotCWFzc2VydFRydWUobWVudUl0ZW0uZ2V0VGV4dCgpLnN0YXJ0c1dpdGgoIkFCQ0RFRkciKSk7Ci0JbWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoMCk7Ci0JbWVudUl0ZW0uc2V0VGV4dCgiQUImQ0RFRkciKTsKLQlhc3NlcnRUcnVlKG1lbnVJdGVtLmdldFRleHQoKS5lcXVhbHMoIkFCJkNERUZHIikpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZEhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QWNjZWxlcmF0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUhlbHBMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0hlbHBMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWNjZWxlcmF0b3JJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNZW51TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbloiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lbnVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZEFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKSkgdGVzdF9hZGRBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9hZGRIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBY2NlbGVyYXRvciIpKSB0ZXN0X2dldEFjY2VsZXJhdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWVudSIpKSB0ZXN0X2dldE1lbnUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFybUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQXJtTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVBcm1MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0FybUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVIZWxwTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19IZWxwTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBY2NlbGVyYXRvckkiKSkgdGVzdF9zZXRBY2NlbGVyYXRvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51IikpIHRlc3Rfc2V0TWVudUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19NZW51KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25aIikpIHRlc3Rfc2V0U2VsZWN0aW9uWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotTWVudSBtZW51OwotTWVudUl0ZW0gbWVudUl0ZW07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiMWUyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTWVzc2FnZUJveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3ggZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0RpYWxvZyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3goU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChzaGVsbCwgU1dULk5VTEwpOwotCXNldERpYWxvZyhtZXNzYWdlQm94KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotLyoqCi0gKiBQb3NzaWJsZSBleGNlcHRpb25zOgotICogCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50PC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1NVQkNMQVNTIC0gaWYgdGhpcyBjbGFzcyBpcyBub3QgYW4gYWxsb3dlZCBzdWJjbGFzczwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCl7Ci0JbmV3IE1lc3NhZ2VCb3goc2hlbGwpOwotCXRyeSB7Ci0JCW5ldyBNZXNzYWdlQm94KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNZXNzYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLS8qKgotICogTWFrZXMgdGhlIGRpYWxvZyB2aXNpYmxlIGFuZCBicmluZ3MgaXQgdG8gdGhlIGZyb250Ci0gKiBvZiB0aGUgZGlzcGxheS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgd2FzIHNlbGVjdGVkIHRvIGRpc21pc3MgdGhlCi0gKiAgICAgICAgIG1lc3NhZ2UgYm94IChlLmcuIFNXVC5PSywgU1dULkNBTkNFTCwgZXRjLi4uKQotICovCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKXsKLQlpZiAoZlRlc3REaWFsb2dPcGVuKQotCQltZXNzYWdlQm94Lm9wZW4oKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBkaWFsb2cncyBtZXNzYWdlLCB3aGljaCBpcyBhIGRlc2NyaXB0aW9uIG9mCi0gKiB0aGUgcHVycG9zZSBmb3Igd2hpY2ggaXQgd2FzIG9wZW5lZC4gVGhpcyBtZXNzYWdlIHdpbGwgYmUKLSAqIHZpc2libGUgb24gdGhlIGRpYWxvZyB3aGlsZSBpdCBpcyBvcGVuLgotICovCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpewotCWFzc2VydEVxdWFscyhtZXNzYWdlQm94LmdldE1lc3NhZ2UoKSwgIiIpOwotCVN0cmluZyB0ZXN0U3RyID0gInRlc3Qgc3RyaW5nIjsKLQltZXNzYWdlQm94LnNldE1lc3NhZ2UodGVzdFN0cik7Ci0JYXNzZXJ0RXF1YWxzKG1lc3NhZ2VCb3guZ2V0TWVzc2FnZSgpLCB0ZXN0U3RyKTsKLQltZXNzYWdlQm94LnNldE1lc3NhZ2UoIiIpOwotCWFzc2VydEVxdWFscyhtZXNzYWdlQm94LmdldE1lc3NhZ2UoKSwgIiIpOwotCXRyeSB7Ci0JCW1lc3NhZ2VCb3guc2V0TWVzc2FnZShudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0gCi0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01lc3NhZ2VCb3goKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWVzc2FnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfb3BlbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWVzc2FnZUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlhbG9nLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGxJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNZXNzYWdlIikpIHRlc3RfZ2V0TWVzc2FnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfb3BlbiIpKSB0ZXN0X29wZW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldE1lc3NhZ2VMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLU1lc3NhZ2VCb3ggbWVzc2FnZUJveDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTg0YWE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Nb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1vbml0b3IKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTW9uaXRvciBleHRlbmRzIFN3dFRlc3RDYXNlIHsKLQkKLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JbW9uaXRvcnMgPSBkaXNwbGF5LmdldE1vbml0b3JzKCk7Ci0JcHJpbWFyeSA9IGRpc3BsYXkuZ2V0UHJpbWFyeU1vbml0b3IoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChwcmltYXJ5LmVxdWFscyhtb25pdG9yc1tpXSkpIGJyZWFrOwotCX0KLQlpZiAoaSA9PSBtb25pdG9ycy5sZW5ndGgpIGZhaWwoKTsKLQlmb3IgKGkgPSAwOyBpICA8IG1vbml0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCU1vbml0b3IgdGVzdCA9IG1vbml0b3JzW2ldOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG1vbml0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAodGVzdC5lcXVhbHMobW9uaXRvcnNbal0pKSB7Ci0JCQkJaWYgKGkgIT0gaikgZmFpbCgiTW9uaXRvcnMgIitpKyIgYW5kICIraisiIHNob3VsZCBub3QgYmUgZXF1YWwiKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCb3VuZHMoKSB7Ci0JUmVjdGFuZ2xlIGJvdW5kcyA9IHByaW1hcnkuZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJYm91bmRzID0gbW9uaXRvcnNbaV0uZ2V0Qm91bmRzKCk7Ci0JCWFzc2VydE5vdE51bGwoYm91bmRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlSZWN0YW5nbGUgYm91bmRzID0gcHJpbWFyeS5nZXRDbGllbnRBcmVhKCk7Ci0JYXNzZXJ0Tm90TnVsbChib3VuZHMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJYm91bmRzID0gbW9uaXRvcnNbaV0uZ2V0Q2xpZW50QXJlYSgpOwotCQlhc3NlcnROb3ROdWxsKGJvdW5kcyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2hhc2hDb2RlKCkgewotCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKHByaW1hcnkuZXF1YWxzKG1vbml0b3JzW2ldKSkgewotCQkJYXNzZXJ0VHJ1ZShwcmltYXJ5Lmhhc2hDb2RlKCkgPT0gbW9uaXRvcnNbaV0uaGFzaENvZGUoKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX01vbml0b3IoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9lcXVhbHNMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Qm91bmRzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9oYXNoQ29kZSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2VxdWFsc0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3RfZXF1YWxzTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2xpZW50QXJlYSIpKSB0ZXN0X2dldENsaWVudEFyZWEoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhc2hDb2RlIikpIHRlc3RfaGFzaENvZGUoKTsKLX0KLQotLyogY3VzdG9tICovCi1EaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotTW9uaXRvcltdIG1vbml0b3JzID0gbnVsbDsKLU1vbml0b3IgcHJpbWFyeSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDBiM2UxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0Jhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Qcm9ncmVzc0JhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuUHJvZ3Jlc3NCYXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Qcm9ncmVzc0JhcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoc2hlbGwsIDApOwotCXNldFdpZGdldChwcm9ncmVzc0Jhcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0JhcihzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNaW5pbXVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRTZWxlY3Rpb24gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb2N1cygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0Rm9jdXMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRNYXhpbXVtIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlwcm9ncmVzc0Jhci5zZXRNaW5pbXVtKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRNaW5pbXVtIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlwcm9ncmVzc0Jhci5zZXRTZWxlY3Rpb24oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldFNlbGVjdGlvbiIsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdKTsKLQl9Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfUHJvZ3Jlc3NCYXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1heGltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1pbmltdW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9jdXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvY3VzIikpIHRlc3Rfc2V0Rm9jdXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1Qcm9ncmVzc0JhciBwcm9ncmVzc0JhcjsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIGNhbGwsIGludCBzZXQsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLQkvLyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgYW5kIGNvbW1lbnQgb3V0IGNhbGwgdG8gY2hlY2soKSBpZiB5b3Ugd2FudCB0aGUgdGVzdCB0byByZXBvcnQgYWxsIGVycm9ycyB3aXRob3V0Ci0JLy8gc3RvcHBpbmcuCi0JCi0JLy9pZiAocHJvZ3Jlc3NCYXIuZ2V0TWluaW11bSgpICE9IG1pbkV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IE1pbmltdW0gRXhwZWN0ZWQ6ICIgKyBtaW5FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHByb2dyZXNzQmFyLmdldE1pbmltdW0oKSk7Ci0JLy9pZiAocHJvZ3Jlc3NCYXIuZ2V0TWF4aW11bSgpICE9IG1heEV4cGVjdGVkKQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIigiICsgc2V0ICsgIik6IE1heGltdW0gRXhwZWN0ZWQ6ICIgKyBtYXhFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHByb2dyZXNzQmFyLmdldE1heGltdW0oKSk7Ci0JLy9pZiAocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgIT0gc2VsZWN0aW9uRXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogU2VsZWN0aW9uIEV4cGVjdGVkOiAiICsgc2VsZWN0aW9uRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBwcm9ncmVzc0Jhci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQljaGVjayhtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKHByb2dyZXNzQmFyLmdldE1heGltdW0oKSwgbWF4RXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhwcm9ncmVzc0Jhci5nZXRNaW5pbXVtKCksIG1pbkV4cGVjdGVkKTsKLQlhc3NlcnRFcXVhbHMocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCksIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCB9LAotey0xNCwgMTAsIDEwMCwgNTAsIH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgfSwKLXstMTIsIDEwLCAxMDAsIDUwLCB9LAotey0xMSwgMTAsIDEwMCwgNTAsIH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgfSwKLXstOSwgMTAsIDEwMCwgNTAsIH0sCi17LTgsIDEwLCAxMDAsIDUwLCB9LAotey03LCAxMCwgMTAwLCA1MCwgfSwKLXstNiwgMTAsIDEwMCwgNTAsIH0sCi17LTUsIDEwLCAxMDAsIDUwLCB9LAotey00LCAxMCwgMTAwLCA1MCwgfSwKLXstMywgMTAsIDEwMCwgNTAsIH0sCi17LTIsIDEwLCAxMDAsIDUwLCB9LAotey0xLCAxMCwgMTAwLCA1MCwgfSwKLXswLCAwLCAxMDAsIDUwLCB9LAotezEsIDEsIDEwMCwgNTAsIH0sCi17MiwgMiwgMTAwLCA1MCwgfSwKLXszLCAzLCAxMDAsIDUwLCB9LAotezQsIDQsIDEwMCwgNTAsIH0sCi17NSwgNSwgMTAwLCA1MCwgfSwKLXs2LCA2LCAxMDAsIDUwLCB9LAotezcsIDcsIDEwMCwgNTAsIH0sCi17OCwgOCwgMTAwLCA1MCwgfSwKLXs5LCA5LCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTEsIDEwMCwgNTAsIH0sCi17MTIsIDEyLCAxMDAsIDUwLCB9LAotezEzLCAxMywgMTAwLCA1MCwgfSwKLXsxNCwgMTQsIDEwMCwgNTAsIH0sCi17MTUsIDE1LCAxMDAsIDUwLCB9LAotezE2LCAxNiwgMTAwLCA1MCwgfSwKLXsxNywgMTcsIDEwMCwgNTAsIH0sCi17MTgsIDE4LCAxMDAsIDUwLCB9LAotezE5LCAxOSwgMTAwLCA1MCwgfSwKLXsyMCwgMjAsIDEwMCwgNTAsIH0sCi17MjEsIDIxLCAxMDAsIDUwLCB9LAotezIyLCAyMiwgMTAwLCA1MCwgfSwKLXsyMywgMjMsIDEwMCwgNTAsIH0sCi17MjQsIDI0LCAxMDAsIDUwLCB9LAotezI1LCAyNSwgMTAwLCA1MCwgfSwKLXsyNiwgMjYsIDEwMCwgNTAsIH0sCi17MjcsIDI3LCAxMDAsIDUwLCB9LAotezI4LCAyOCwgMTAwLCA1MCwgfSwKLXsyOSwgMjksIDEwMCwgNTAsIH0sCi17MzAsIDMwLCAxMDAsIDUwLCB9LAotezMxLCAzMSwgMTAwLCA1MCwgfSwKLXszMiwgMzIsIDEwMCwgNTAsIH0sCi17MzMsIDMzLCAxMDAsIDUwLCB9LAotezM0LCAzNCwgMTAwLCA1MCwgfSwKLXszNSwgMzUsIDEwMCwgNTAsIH0sCi17MzYsIDM2LCAxMDAsIDUwLCB9LAotezM3LCAzNywgMTAwLCA1MCwgfSwKLXszOCwgMzgsIDEwMCwgNTAsIH0sCi17MzksIDM5LCAxMDAsIDUwLCB9LAotezQwLCA0MCwgMTAwLCA1MCwgfSwKLXs0MSwgNDEsIDEwMCwgNTAsIH0sCi17NDIsIDQyLCAxMDAsIDUwLCB9LAotezQzLCA0MywgMTAwLCA1MCwgfSwKLXs0NCwgNDQsIDEwMCwgNTAsIH0sCi17NDUsIDQ1LCAxMDAsIDUwLCB9LAotezQ2LCA0NiwgMTAwLCA1MCwgfSwKLXs0NywgNDcsIDEwMCwgNTAsIH0sCi17NDgsIDQ4LCAxMDAsIDUwLCB9LAotezQ5LCA0OSwgMTAwLCA1MCwgfSwKLXs1MCwgNTAsIDEwMCwgNTAsIH0sCi17NTEsIDUxLCAxMDAsIDUxLCB9LAotezUyLCA1MiwgMTAwLCA1MiwgfSwKLXs1MywgNTMsIDEwMCwgNTMsIH0sCi17NTQsIDU0LCAxMDAsIDU0LCB9LAotezU1LCA1NSwgMTAwLCA1NSwgfSwKLXs1NiwgNTYsIDEwMCwgNTYsIH0sCi17NTcsIDU3LCAxMDAsIDU3LCB9LAotezU4LCA1OCwgMTAwLCA1OCwgfSwKLXs1OSwgNTksIDEwMCwgNTksIH0sCi17NjAsIDYwLCAxMDAsIDYwLCB9LAotezYxLCA2MSwgMTAwLCA2MSwgfSwKLXs2MiwgNjIsIDEwMCwgNjIsIH0sCi17NjMsIDYzLCAxMDAsIDYzLCB9LAotezY0LCA2NCwgMTAwLCA2NCwgfSwKLXs2NSwgNjUsIDEwMCwgNjUsIH0sCi17NjYsIDY2LCAxMDAsIDY2LCB9LAotezY3LCA2NywgMTAwLCA2NywgfSwKLXs2OCwgNjgsIDEwMCwgNjgsIH0sCi17NjksIDY5LCAxMDAsIDY5LCB9LAotezcwLCA3MCwgMTAwLCA3MCwgfSwKLXs3MSwgNzEsIDEwMCwgNzEsIH0sCi17NzIsIDcyLCAxMDAsIDcyLCB9LAotezczLCA3MywgMTAwLCA3MywgfSwKLXs3NCwgNzQsIDEwMCwgNzQsIH0sCi17NzUsIDc1LCAxMDAsIDc1LCB9LAotezc2LCA3NiwgMTAwLCA3NiwgfSwKLXs3NywgNzcsIDEwMCwgNzcsIH0sCi17NzgsIDc4LCAxMDAsIDc4LCB9LAotezc5LCA3OSwgMTAwLCA3OSwgfSwKLXs4MCwgODAsIDEwMCwgODAsIH0sCi17ODEsIDgxLCAxMDAsIDgxLCB9LAotezgyLCA4MiwgMTAwLCA4MiwgfSwKLXs4MywgODMsIDEwMCwgODMsIH0sCi17ODQsIDg0LCAxMDAsIDg0LCB9LAotezg1LCA4NSwgMTAwLCA4NSwgfSwKLXs4NiwgODYsIDEwMCwgODYsIH0sCi17ODcsIDg3LCAxMDAsIDg3LCB9LAotezg4LCA4OCwgMTAwLCA4OCwgfSwKLXs4OSwgODksIDEwMCwgODksIH0sCi17OTAsIDkwLCAxMDAsIDkwLCB9LAotezkxLCA5MSwgMTAwLCA5MSwgfSwKLXs5MiwgOTIsIDEwMCwgOTIsIH0sCi17OTMsIDkzLCAxMDAsIDkzLCB9LAotezk0LCA5NCwgMTAwLCA5NCwgfSwKLXs5NSwgOTUsIDEwMCwgOTUsIH0sCi17OTYsIDk2LCAxMDAsIDk2LCB9LAotezk3LCA5NywgMTAwLCA5NywgfSwKLXs5OCwgOTgsIDEwMCwgOTgsIH0sCi17OTksIDk5LCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCB9LAotezEwMywgMTAsIDEwMCwgNTAsIH0sCi17MTA0LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCB9LAotezEwNiwgMTAsIDEwMCwgNTAsIH0sCi17MTA3LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCB9LAotezEwOSwgMTAsIDEwMCwgNTAsIH0sCi17MTEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCB9LAotezExMiwgMTAsIDEwMCwgNTAsIH0sCi17MTEzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCB9LAotezExNSwgMTAsIDEwMCwgNTAsIH0sCi17MTE2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCB9LAotezExOCwgMTAsIDEwMCwgNTAsIH0sCi17MTE5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCB9LAotezEyMSwgMTAsIDEwMCwgNTAsIH0sCi17MTIyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCB9LAotezEyNCwgMTAsIDEwMCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1heGltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDEwLCAxMDAsIDUwLCB9LAotezEsIDEwLCAxMDAsIDUwLCB9LAotezIsIDEwLCAxMDAsIDUwLCB9LAotezMsIDEwLCAxMDAsIDUwLCB9LAotezQsIDEwLCAxMDAsIDUwLCB9LAotezUsIDEwLCAxMDAsIDUwLCB9LAotezYsIDEwLCAxMDAsIDUwLCB9LAotezcsIDEwLCAxMDAsIDUwLCB9LAotezgsIDEwLCAxMDAsIDUwLCB9LAotezksIDEwLCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTAsIDExLCAxMSwgfSwKLXsxMiwgMTAsIDEyLCAxMiwgfSwKLXsxMywgMTAsIDEzLCAxMywgfSwKLXsxNCwgMTAsIDE0LCAxNCwgfSwKLXsxNSwgMTAsIDE1LCAxNSwgfSwKLXsxNiwgMTAsIDE2LCAxNiwgfSwKLXsxNywgMTAsIDE3LCAxNywgfSwKLXsxOCwgMTAsIDE4LCAxOCwgfSwKLXsxOSwgMTAsIDE5LCAxOSwgfSwKLXsyMCwgMTAsIDIwLCAyMCwgfSwKLXsyMSwgMTAsIDIxLCAyMSwgfSwKLXsyMiwgMTAsIDIyLCAyMiwgfSwKLXsyMywgMTAsIDIzLCAyMywgfSwKLXsyNCwgMTAsIDI0LCAyNCwgfSwKLXsyNSwgMTAsIDI1LCAyNSwgfSwKLXsyNiwgMTAsIDI2LCAyNiwgfSwKLXsyNywgMTAsIDI3LCAyNywgfSwKLXsyOCwgMTAsIDI4LCAyOCwgfSwKLXsyOSwgMTAsIDI5LCAyOSwgfSwKLXszMCwgMTAsIDMwLCAzMCwgfSwKLXszMSwgMTAsIDMxLCAzMSwgfSwKLXszMiwgMTAsIDMyLCAzMiwgfSwKLXszMywgMTAsIDMzLCAzMywgfSwKLXszNCwgMTAsIDM0LCAzNCwgfSwKLXszNSwgMTAsIDM1LCAzNSwgfSwKLXszNiwgMTAsIDM2LCAzNiwgfSwKLXszNywgMTAsIDM3LCAzNywgfSwKLXszOCwgMTAsIDM4LCAzOCwgfSwKLXszOSwgMTAsIDM5LCAzOSwgfSwKLXs0MCwgMTAsIDQwLCA0MCwgfSwKLXs0MSwgMTAsIDQxLCA0MSwgfSwKLXs0MiwgMTAsIDQyLCA0MiwgfSwKLXs0MywgMTAsIDQzLCA0MywgfSwKLXs0NCwgMTAsIDQ0LCA0NCwgfSwKLXs0NSwgMTAsIDQ1LCA0NSwgfSwKLXs0NiwgMTAsIDQ2LCA0NiwgfSwKLXs0NywgMTAsIDQ3LCA0NywgfSwKLXs0OCwgMTAsIDQ4LCA0OCwgfSwKLXs0OSwgMTAsIDQ5LCA0OSwgfSwKLXs1MCwgMTAsIDUwLCA1MCwgfSwKLXs1MSwgMTAsIDUxLCA1MCwgfSwKLXs1MiwgMTAsIDUyLCA1MCwgfSwKLXs1MywgMTAsIDUzLCA1MCwgfSwKLXs1NCwgMTAsIDU0LCA1MCwgfSwKLXs1NSwgMTAsIDU1LCA1MCwgfSwKLXs1NiwgMTAsIDU2LCA1MCwgfSwKLXs1NywgMTAsIDU3LCA1MCwgfSwKLXs1OCwgMTAsIDU4LCA1MCwgfSwKLXs1OSwgMTAsIDU5LCA1MCwgfSwKLXs2MCwgMTAsIDYwLCA1MCwgfSwKLXs2MSwgMTAsIDYxLCA1MCwgfSwKLXs2MiwgMTAsIDYyLCA1MCwgfSwKLXs2MywgMTAsIDYzLCA1MCwgfSwKLXs2NCwgMTAsIDY0LCA1MCwgfSwKLXs2NSwgMTAsIDY1LCA1MCwgfSwKLXs2NiwgMTAsIDY2LCA1MCwgfSwKLXs2NywgMTAsIDY3LCA1MCwgfSwKLXs2OCwgMTAsIDY4LCA1MCwgfSwKLXs2OSwgMTAsIDY5LCA1MCwgfSwKLXs3MCwgMTAsIDcwLCA1MCwgfSwKLXs3MSwgMTAsIDcxLCA1MCwgfSwKLXs3MiwgMTAsIDcyLCA1MCwgfSwKLXs3MywgMTAsIDczLCA1MCwgfSwKLXs3NCwgMTAsIDc0LCA1MCwgfSwKLXs3NSwgMTAsIDc1LCA1MCwgfSwKLXs3NiwgMTAsIDc2LCA1MCwgfSwKLXs3NywgMTAsIDc3LCA1MCwgfSwKLXs3OCwgMTAsIDc4LCA1MCwgfSwKLXs3OSwgMTAsIDc5LCA1MCwgfSwKLXs4MCwgMTAsIDgwLCA1MCwgfSwKLXs4MSwgMTAsIDgxLCA1MCwgfSwKLXs4MiwgMTAsIDgyLCA1MCwgfSwKLXs4MywgMTAsIDgzLCA1MCwgfSwKLXs4NCwgMTAsIDg0LCA1MCwgfSwKLXs4NSwgMTAsIDg1LCA1MCwgfSwKLXs4NiwgMTAsIDg2LCA1MCwgfSwKLXs4NywgMTAsIDg3LCA1MCwgfSwKLXs4OCwgMTAsIDg4LCA1MCwgfSwKLXs4OSwgMTAsIDg5LCA1MCwgfSwKLXs5MCwgMTAsIDkwLCA1MCwgfSwKLXs5MSwgMTAsIDkxLCA1MCwgfSwKLXs5MiwgMTAsIDkyLCA1MCwgfSwKLXs5MywgMTAsIDkzLCA1MCwgfSwKLXs5NCwgMTAsIDk0LCA1MCwgfSwKLXs5NSwgMTAsIDk1LCA1MCwgfSwKLXs5NiwgMTAsIDk2LCA1MCwgfSwKLXs5NywgMTAsIDk3LCA1MCwgfSwKLXs5OCwgMTAsIDk4LCA1MCwgfSwKLXs5OSwgMTAsIDk5LCA1MCwgfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCB9LAotezEwMSwgMTAsIDEwMSwgNTAsIH0sCi17MTAyLCAxMCwgMTAyLCA1MCwgfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCB9LAotezEwNCwgMTAsIDEwNCwgNTAsIH0sCi17MTA1LCAxMCwgMTA1LCA1MCwgfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCB9LAotezEwNywgMTAsIDEwNywgNTAsIH0sCi17MTA4LCAxMCwgMTA4LCA1MCwgfSwKLXsxMDksIDEwLCAxMDksIDUwLCB9LAotezExMCwgMTAsIDExMCwgNTAsIH0sCi17MTExLCAxMCwgMTExLCA1MCwgfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCB9LAotezExMywgMTAsIDExMywgNTAsIH0sCi17MTE0LCAxMCwgMTE0LCA1MCwgfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCB9LAotezExNiwgMTAsIDExNiwgNTAsIH0sCi17MTE3LCAxMCwgMTE3LCA1MCwgfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCB9LAotezExOSwgMTAsIDExOSwgNTAsIH0sCi17MTIwLCAxMCwgMTIwLCA1MCwgfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCB9LAotezEyMiwgMTAsIDEyMiwgNTAsIH0sCi17MTIzLCAxMCwgMTIzLCA1MCwgfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQlwcm9ncmVzc0Jhci5zZXRNYXhpbXVtKDEwMCk7Ci0JcHJvZ3Jlc3NCYXIuc2V0TWluaW11bSgxMCk7Ci0JcHJvZ3Jlc3NCYXIuc2V0U2VsZWN0aW9uKDUwKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgMTAsIH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgfSwKLXstMTMsIDEwLCAxMDAsIDEwLCB9LAotey0xMiwgMTAsIDEwMCwgMTAsIH0sCi17LTExLCAxMCwgMTAwLCAxMCwgfSwKLXstMTAsIDEwLCAxMDAsIDEwLCB9LAotey05LCAxMCwgMTAwLCAxMCwgfSwKLXstOCwgMTAsIDEwMCwgMTAsIH0sCi17LTcsIDEwLCAxMDAsIDEwLCB9LAotey02LCAxMCwgMTAwLCAxMCwgfSwKLXstNSwgMTAsIDEwMCwgMTAsIH0sCi17LTQsIDEwLCAxMDAsIDEwLCB9LAotey0zLCAxMCwgMTAwLCAxMCwgfSwKLXstMiwgMTAsIDEwMCwgMTAsIH0sCi17LTEsIDEwLCAxMDAsIDEwLCB9LAotezAsIDEwLCAxMDAsIDEwLCB9LAotezEsIDEwLCAxMDAsIDEwLCB9LAotezIsIDEwLCAxMDAsIDEwLCB9LAotezMsIDEwLCAxMDAsIDEwLCB9LAotezQsIDEwLCAxMDAsIDEwLCB9LAotezUsIDEwLCAxMDAsIDEwLCB9LAotezYsIDEwLCAxMDAsIDEwLCB9LAotezcsIDEwLCAxMDAsIDEwLCB9LAotezgsIDEwLCAxMDAsIDEwLCB9LAotezksIDEwLCAxMDAsIDEwLCB9LAotezEwLCAxMCwgMTAwLCAxMCwgfSwKLXsxMSwgMTAsIDEwMCwgMTEsIH0sCi17MTIsIDEwLCAxMDAsIDEyLCB9LAotezEzLCAxMCwgMTAwLCAxMywgfSwKLXsxNCwgMTAsIDEwMCwgMTQsIH0sCi17MTUsIDEwLCAxMDAsIDE1LCB9LAotezE2LCAxMCwgMTAwLCAxNiwgfSwKLXsxNywgMTAsIDEwMCwgMTcsIH0sCi17MTgsIDEwLCAxMDAsIDE4LCB9LAotezE5LCAxMCwgMTAwLCAxOSwgfSwKLXsyMCwgMTAsIDEwMCwgMjAsIH0sCi17MjEsIDEwLCAxMDAsIDIxLCB9LAotezIyLCAxMCwgMTAwLCAyMiwgfSwKLXsyMywgMTAsIDEwMCwgMjMsIH0sCi17MjQsIDEwLCAxMDAsIDI0LCB9LAotezI1LCAxMCwgMTAwLCAyNSwgfSwKLXsyNiwgMTAsIDEwMCwgMjYsIH0sCi17MjcsIDEwLCAxMDAsIDI3LCB9LAotezI4LCAxMCwgMTAwLCAyOCwgfSwKLXsyOSwgMTAsIDEwMCwgMjksIH0sCi17MzAsIDEwLCAxMDAsIDMwLCB9LAotezMxLCAxMCwgMTAwLCAzMSwgfSwKLXszMiwgMTAsIDEwMCwgMzIsIH0sCi17MzMsIDEwLCAxMDAsIDMzLCB9LAotezM0LCAxMCwgMTAwLCAzNCwgfSwKLXszNSwgMTAsIDEwMCwgMzUsIH0sCi17MzYsIDEwLCAxMDAsIDM2LCB9LAotezM3LCAxMCwgMTAwLCAzNywgfSwKLXszOCwgMTAsIDEwMCwgMzgsIH0sCi17MzksIDEwLCAxMDAsIDM5LCB9LAotezQwLCAxMCwgMTAwLCA0MCwgfSwKLXs0MSwgMTAsIDEwMCwgNDEsIH0sCi17NDIsIDEwLCAxMDAsIDQyLCB9LAotezQzLCAxMCwgMTAwLCA0MywgfSwKLXs0NCwgMTAsIDEwMCwgNDQsIH0sCi17NDUsIDEwLCAxMDAsIDQ1LCB9LAotezQ2LCAxMCwgMTAwLCA0NiwgfSwKLXs0NywgMTAsIDEwMCwgNDcsIH0sCi17NDgsIDEwLCAxMDAsIDQ4LCB9LAotezQ5LCAxMCwgMTAwLCA0OSwgfSwKLXs1MCwgMTAsIDEwMCwgNTAsIH0sCi17NTEsIDEwLCAxMDAsIDUxLCB9LAotezUyLCAxMCwgMTAwLCA1MiwgfSwKLXs1MywgMTAsIDEwMCwgNTMsIH0sCi17NTQsIDEwLCAxMDAsIDU0LCB9LAotezU1LCAxMCwgMTAwLCA1NSwgfSwKLXs1NiwgMTAsIDEwMCwgNTYsIH0sCi17NTcsIDEwLCAxMDAsIDU3LCB9LAotezU4LCAxMCwgMTAwLCA1OCwgfSwKLXs1OSwgMTAsIDEwMCwgNTksIH0sCi17NjAsIDEwLCAxMDAsIDYwLCB9LAotezYxLCAxMCwgMTAwLCA2MSwgfSwKLXs2MiwgMTAsIDEwMCwgNjIsIH0sCi17NjMsIDEwLCAxMDAsIDYzLCB9LAotezY0LCAxMCwgMTAwLCA2NCwgfSwKLXs2NSwgMTAsIDEwMCwgNjUsIH0sCi17NjYsIDEwLCAxMDAsIDY2LCB9LAotezY3LCAxMCwgMTAwLCA2NywgfSwKLXs2OCwgMTAsIDEwMCwgNjgsIH0sCi17NjksIDEwLCAxMDAsIDY5LCB9LAotezcwLCAxMCwgMTAwLCA3MCwgfSwKLXs3MSwgMTAsIDEwMCwgNzEsIH0sCi17NzIsIDEwLCAxMDAsIDcyLCB9LAotezczLCAxMCwgMTAwLCA3MywgfSwKLXs3NCwgMTAsIDEwMCwgNzQsIH0sCi17NzUsIDEwLCAxMDAsIDc1LCB9LAotezc2LCAxMCwgMTAwLCA3NiwgfSwKLXs3NywgMTAsIDEwMCwgNzcsIH0sCi17NzgsIDEwLCAxMDAsIDc4LCB9LAotezc5LCAxMCwgMTAwLCA3OSwgfSwKLXs4MCwgMTAsIDEwMCwgODAsIH0sCi17ODEsIDEwLCAxMDAsIDgxLCB9LAotezgyLCAxMCwgMTAwLCA4MiwgfSwKLXs4MywgMTAsIDEwMCwgODMsIH0sCi17ODQsIDEwLCAxMDAsIDg0LCB9LAotezg1LCAxMCwgMTAwLCA4NSwgfSwKLXs4NiwgMTAsIDEwMCwgODYsIH0sCi17ODcsIDEwLCAxMDAsIDg3LCB9LAotezg4LCAxMCwgMTAwLCA4OCwgfSwKLXs4OSwgMTAsIDEwMCwgODksIH0sCi17OTAsIDEwLCAxMDAsIDkwLCB9LAotezkxLCAxMCwgMTAwLCA5MSwgfSwKLXs5MiwgMTAsIDEwMCwgOTIsIH0sCi17OTMsIDEwLCAxMDAsIDkzLCB9LAotezk0LCAxMCwgMTAwLCA5NCwgfSwKLXs5NSwgMTAsIDEwMCwgOTUsIH0sCi17OTYsIDEwLCAxMDAsIDk2LCB9LAotezk3LCAxMCwgMTAwLCA5NywgfSwKLXs5OCwgMTAsIDEwMCwgOTgsIH0sCi17OTksIDEwLCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgMTAwLCB9LAotezEwMSwgMTAsIDEwMCwgMTAwLCB9LAotezEwMiwgMTAsIDEwMCwgMTAwLCB9LAotezEwMywgMTAsIDEwMCwgMTAwLCB9LAotezEwNCwgMTAsIDEwMCwgMTAwLCB9LAotezEwNSwgMTAsIDEwMCwgMTAwLCB9LAotezEwNiwgMTAsIDEwMCwgMTAwLCB9LAotezEwNywgMTAsIDEwMCwgMTAwLCB9LAotezEwOCwgMTAsIDEwMCwgMTAwLCB9LAotezEwOSwgMTAsIDEwMCwgMTAwLCB9LAotezExMCwgMTAsIDEwMCwgMTAwLCB9LAotezExMSwgMTAsIDEwMCwgMTAwLCB9LAotezExMiwgMTAsIDEwMCwgMTAwLCB9LAotezExMywgMTAsIDEwMCwgMTAwLCB9LAotezExNCwgMTAsIDEwMCwgMTAwLCB9LAotezExNSwgMTAsIDEwMCwgMTAwLCB9LAotezExNiwgMTAsIDEwMCwgMTAwLCB9LAotezExNywgMTAsIDEwMCwgMTAwLCB9LAotezExOCwgMTAsIDEwMCwgMTAwLCB9LAotezExOSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMCwgMTAsIDEwMCwgMTAwLCB9LAotezEyMSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMiwgMTAsIDEwMCwgMTAwLCB9LAotezEyMywgMTAsIDEwMCwgMTAwLCB9LAotezEyNCwgMTAsIDEwMCwgMTAwLCB9LAotfTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwZDg2NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2FzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Nhc2ggZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIDApOwotCXNldFdpZGdldChzYXNoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCXNhc2ggPSBuZXcgU2FzaChudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlzYXNoID0gbmV3IFNhc2goc2hlbGwsIGNhc2VzW2ldKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JLy8gb3ZlcnJpZGRlbiBmcm9tIENvbnRyb2wgYmVjYXVzZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JLy8gdG8gc2V0IHRoZSBmb250IG9mIGEgU2FzaC4KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TYXNoKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1TYXNoIHNhc2g7Ci0KLXByaXZhdGUgdm9pZCBjcmVhdGVTYXNoKCkgewotICAgIHRlYXJEb3duKCk7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICBuZXcgQnV0dG9uKHNoZWxsLCBTV1QuUFVTSCk7Ci0gICAgU2FzaCBzYXNoID0gbmV3IFNhc2goc2hlbGwsIFNXVC5WRVJUSUNBTCk7Ci0gICAgbmV3IEJ1dHRvbihzaGVsbCwgU1dULlBVU0gpOwotICAgIHNldFdpZGdldChzYXNoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBjcmVhdGVTYXNoKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCA1LCAzLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIGNyZWF0ZVNhc2goKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIDUsIDIwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIGNyZWF0ZVNhc2goKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDEyNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2NhbGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjYWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NjYWxlIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2NhbGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNjYWxlID0gbmV3IFNjYWxlKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQoc2NhbGUpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2NhbGUgPSBuZXcgU2NhbGUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiBvY2N1cnJlZCIpOyAvL3Nob3VsZCBuZXZlciBnZXQgaGVyZQotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuSE9SSVpPTlRBTCwgU1dULlZFUlRJQ0FMfTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzLmxlbmd0aDsgaSsrKQotCQlzY2FsZSA9IG5ldyBTY2FsZShzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmNyZW1lbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEluY3JlbWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldE1heGltdW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNaW5pbXVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRNaW5pbXVtIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0UGFnZUluY3JlbWVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0U2VsZWN0aW9uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluY3JlbWVudEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEluY3JlbWVudEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY2FsZS5zZXRNYXhpbXVtKGludEFycmF5WzBdKTsKLQkJcmVwb3J0KCJzZXRNYXhpbXVtIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCi0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldE1pbmltdW0oaW50QXJyYXlbMF0pOwotCQlyZXBvcnQoInNldE1pbmltdW0iLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbkkoKSB7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldFNlbGVjdGlvblZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjYWxlLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCXJlcG9ydCgic2V0U2VsZWN0aW9uIiwgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10pOwotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY2FsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYWdlSW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfVHJvdWdoU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluY3JlbWVudCIpKSB0ZXN0X2dldEluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYWdlSW5jcmVtZW50IikpIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5jcmVtZW50SSIpKSB0ZXN0X3NldEluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1heGltdW1JIikpIHRlc3Rfc2V0TWF4aW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldE1pbmltdW1JIikpIHRlc3Rfc2V0TWluaW11bUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFBhZ2VJbmNyZW1lbnRJIikpIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkkiKSkgdGVzdF9zZXRTZWxlY3Rpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQotCS8vIHRvIHNldCB0aGUgZm9udCBvZiBhIFNjYWxlLgotfQotCi1TY2FsZSBzY2FsZTsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCkgewotCSAvL1VuY29tbWVudCB0aGVzZSBsaW5lcyBhbmQgY29tbWVudCBvdXQgY2FsbCB0byBjaGVjaygpIGlmIHlvdSB3YW50IHRoZSB0ZXN0IHRvIHJlcG9ydCBhbGwgZXJyb3JzIHdpdGhvdXQKLQkgLy9zdG9wcGluZy4KLQkKLQkvL2lmICh0cmFja0Jhci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWluaW11bSBFeHBlY3RlZDogIiArIG1pbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0TWluaW11bSgpKTsKLQkvL2lmICh0cmFja0Jhci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiKCIgKyBzZXQgKyAiKTogTWF4aW11bSBFeHBlY3RlZDogIiArIG1heEV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgdHJhY2tCYXIuZ2V0TWF4aW11bSgpKTsKLQkvL2lmICh0cmFja0Jhci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIoIiArIHNldCArICIpOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHRyYWNrQmFyLmdldFNlbGVjdGlvbigpKTsKLQljaGVjayhtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkKSB7Ci0JYXNzZXJ0RXF1YWxzKHNjYWxlLmdldE1heGltdW0oKSwgbWF4RXhwZWN0ZWQpOwotCWFzc2VydEVxdWFscyhzY2FsZS5nZXRNaW5pbXVtKCksIG1pbkV4cGVjdGVkKTsKLQlhc3NlcnRFcXVhbHMoc2NhbGUuZ2V0U2VsZWN0aW9uKCksIHNlbGVjdGlvbkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCB9LAotey0xNCwgMTAsIDEwMCwgNTAsIH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgfSwKLXstMTIsIDEwLCAxMDAsIDUwLCB9LAotey0xMSwgMTAsIDEwMCwgNTAsIH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgfSwKLXstOSwgMTAsIDEwMCwgNTAsIH0sCi17LTgsIDEwLCAxMDAsIDUwLCB9LAotey03LCAxMCwgMTAwLCA1MCwgfSwKLXstNiwgMTAsIDEwMCwgNTAsIH0sCi17LTUsIDEwLCAxMDAsIDUwLCB9LAotey00LCAxMCwgMTAwLCA1MCwgfSwKLXstMywgMTAsIDEwMCwgNTAsIH0sCi17LTIsIDEwLCAxMDAsIDUwLCB9LAotey0xLCAxMCwgMTAwLCA1MCwgfSwKLXswLCAwLCAxMDAsIDUwLCB9LAotezEsIDEsIDEwMCwgNTAsIH0sCi17MiwgMiwgMTAwLCA1MCwgfSwKLXszLCAzLCAxMDAsIDUwLCB9LAotezQsIDQsIDEwMCwgNTAsIH0sCi17NSwgNSwgMTAwLCA1MCwgfSwKLXs2LCA2LCAxMDAsIDUwLCB9LAotezcsIDcsIDEwMCwgNTAsIH0sCi17OCwgOCwgMTAwLCA1MCwgfSwKLXs5LCA5LCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTEsIDEwMCwgNTAsIH0sCi17MTIsIDEyLCAxMDAsIDUwLCB9LAotezEzLCAxMywgMTAwLCA1MCwgfSwKLXsxNCwgMTQsIDEwMCwgNTAsIH0sCi17MTUsIDE1LCAxMDAsIDUwLCB9LAotezE2LCAxNiwgMTAwLCA1MCwgfSwKLXsxNywgMTcsIDEwMCwgNTAsIH0sCi17MTgsIDE4LCAxMDAsIDUwLCB9LAotezE5LCAxOSwgMTAwLCA1MCwgfSwKLXsyMCwgMjAsIDEwMCwgNTAsIH0sCi17MjEsIDIxLCAxMDAsIDUwLCB9LAotezIyLCAyMiwgMTAwLCA1MCwgfSwKLXsyMywgMjMsIDEwMCwgNTAsIH0sCi17MjQsIDI0LCAxMDAsIDUwLCB9LAotezI1LCAyNSwgMTAwLCA1MCwgfSwKLXsyNiwgMjYsIDEwMCwgNTAsIH0sCi17MjcsIDI3LCAxMDAsIDUwLCB9LAotezI4LCAyOCwgMTAwLCA1MCwgfSwKLXsyOSwgMjksIDEwMCwgNTAsIH0sCi17MzAsIDMwLCAxMDAsIDUwLCB9LAotezMxLCAzMSwgMTAwLCA1MCwgfSwKLXszMiwgMzIsIDEwMCwgNTAsIH0sCi17MzMsIDMzLCAxMDAsIDUwLCB9LAotezM0LCAzNCwgMTAwLCA1MCwgfSwKLXszNSwgMzUsIDEwMCwgNTAsIH0sCi17MzYsIDM2LCAxMDAsIDUwLCB9LAotezM3LCAzNywgMTAwLCA1MCwgfSwKLXszOCwgMzgsIDEwMCwgNTAsIH0sCi17MzksIDM5LCAxMDAsIDUwLCB9LAotezQwLCA0MCwgMTAwLCA1MCwgfSwKLXs0MSwgNDEsIDEwMCwgNTAsIH0sCi17NDIsIDQyLCAxMDAsIDUwLCB9LAotezQzLCA0MywgMTAwLCA1MCwgfSwKLXs0NCwgNDQsIDEwMCwgNTAsIH0sCi17NDUsIDQ1LCAxMDAsIDUwLCB9LAotezQ2LCA0NiwgMTAwLCA1MCwgfSwKLXs0NywgNDcsIDEwMCwgNTAsIH0sCi17NDgsIDQ4LCAxMDAsIDUwLCB9LAotezQ5LCA0OSwgMTAwLCA1MCwgfSwKLXs1MCwgNTAsIDEwMCwgNTAsIH0sCi17NTEsIDUxLCAxMDAsIDUxLCB9LAotezUyLCA1MiwgMTAwLCA1MiwgfSwKLXs1MywgNTMsIDEwMCwgNTMsIH0sCi17NTQsIDU0LCAxMDAsIDU0LCB9LAotezU1LCA1NSwgMTAwLCA1NSwgfSwKLXs1NiwgNTYsIDEwMCwgNTYsIH0sCi17NTcsIDU3LCAxMDAsIDU3LCB9LAotezU4LCA1OCwgMTAwLCA1OCwgfSwKLXs1OSwgNTksIDEwMCwgNTksIH0sCi17NjAsIDYwLCAxMDAsIDYwLCB9LAotezYxLCA2MSwgMTAwLCA2MSwgfSwKLXs2MiwgNjIsIDEwMCwgNjIsIH0sCi17NjMsIDYzLCAxMDAsIDYzLCB9LAotezY0LCA2NCwgMTAwLCA2NCwgfSwKLXs2NSwgNjUsIDEwMCwgNjUsIH0sCi17NjYsIDY2LCAxMDAsIDY2LCB9LAotezY3LCA2NywgMTAwLCA2NywgfSwKLXs2OCwgNjgsIDEwMCwgNjgsIH0sCi17NjksIDY5LCAxMDAsIDY5LCB9LAotezcwLCA3MCwgMTAwLCA3MCwgfSwKLXs3MSwgNzEsIDEwMCwgNzEsIH0sCi17NzIsIDcyLCAxMDAsIDcyLCB9LAotezczLCA3MywgMTAwLCA3MywgfSwKLXs3NCwgNzQsIDEwMCwgNzQsIH0sCi17NzUsIDc1LCAxMDAsIDc1LCB9LAotezc2LCA3NiwgMTAwLCA3NiwgfSwKLXs3NywgNzcsIDEwMCwgNzcsIH0sCi17NzgsIDc4LCAxMDAsIDc4LCB9LAotezc5LCA3OSwgMTAwLCA3OSwgfSwKLXs4MCwgODAsIDEwMCwgODAsIH0sCi17ODEsIDgxLCAxMDAsIDgxLCB9LAotezgyLCA4MiwgMTAwLCA4MiwgfSwKLXs4MywgODMsIDEwMCwgODMsIH0sCi17ODQsIDg0LCAxMDAsIDg0LCB9LAotezg1LCA4NSwgMTAwLCA4NSwgfSwKLXs4NiwgODYsIDEwMCwgODYsIH0sCi17ODcsIDg3LCAxMDAsIDg3LCB9LAotezg4LCA4OCwgMTAwLCA4OCwgfSwKLXs4OSwgODksIDEwMCwgODksIH0sCi17OTAsIDkwLCAxMDAsIDkwLCB9LAotezkxLCA5MSwgMTAwLCA5MSwgfSwKLXs5MiwgOTIsIDEwMCwgOTIsIH0sCi17OTMsIDkzLCAxMDAsIDkzLCB9LAotezk0LCA5NCwgMTAwLCA5NCwgfSwKLXs5NSwgOTUsIDEwMCwgOTUsIH0sCi17OTYsIDk2LCAxMDAsIDk2LCB9LAotezk3LCA5NywgMTAwLCA5NywgfSwKLXs5OCwgOTgsIDEwMCwgOTgsIH0sCi17OTksIDk5LCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgNTAsIH0sCi17MTAxLCAxMCwgMTAwLCA1MCwgfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCB9LAotezEwMywgMTAsIDEwMCwgNTAsIH0sCi17MTA0LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCB9LAotezEwNiwgMTAsIDEwMCwgNTAsIH0sCi17MTA3LCAxMCwgMTAwLCA1MCwgfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCB9LAotezEwOSwgMTAsIDEwMCwgNTAsIH0sCi17MTEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCB9LAotezExMiwgMTAsIDEwMCwgNTAsIH0sCi17MTEzLCAxMCwgMTAwLCA1MCwgfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCB9LAotezExNSwgMTAsIDEwMCwgNTAsIH0sCi17MTE2LCAxMCwgMTAwLCA1MCwgfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCB9LAotezExOCwgMTAsIDEwMCwgNTAsIH0sCi17MTE5LCAxMCwgMTAwLCA1MCwgfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCB9LAotezEyMSwgMTAsIDEwMCwgNTAsIH0sCi17MTIyLCAxMCwgMTAwLCA1MCwgfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCB9LAotezEyNCwgMTAsIDEwMCwgNTAsIH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1heGltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgfSwKLXstMTMsIDEwLCAxMDAsIDUwLCB9LAotey0xMiwgMTAsIDEwMCwgNTAsIH0sCi17LTExLCAxMCwgMTAwLCA1MCwgfSwKLXstMTAsIDEwLCAxMDAsIDUwLCB9LAotey05LCAxMCwgMTAwLCA1MCwgfSwKLXstOCwgMTAsIDEwMCwgNTAsIH0sCi17LTcsIDEwLCAxMDAsIDUwLCB9LAotey02LCAxMCwgMTAwLCA1MCwgfSwKLXstNSwgMTAsIDEwMCwgNTAsIH0sCi17LTQsIDEwLCAxMDAsIDUwLCB9LAotey0zLCAxMCwgMTAwLCA1MCwgfSwKLXstMiwgMTAsIDEwMCwgNTAsIH0sCi17LTEsIDEwLCAxMDAsIDUwLCB9LAotezAsIDEwLCAxMDAsIDUwLCB9LAotezEsIDEwLCAxMDAsIDUwLCB9LAotezIsIDEwLCAxMDAsIDUwLCB9LAotezMsIDEwLCAxMDAsIDUwLCB9LAotezQsIDEwLCAxMDAsIDUwLCB9LAotezUsIDEwLCAxMDAsIDUwLCB9LAotezYsIDEwLCAxMDAsIDUwLCB9LAotezcsIDEwLCAxMDAsIDUwLCB9LAotezgsIDEwLCAxMDAsIDUwLCB9LAotezksIDEwLCAxMDAsIDUwLCB9LAotezEwLCAxMCwgMTAwLCA1MCwgfSwKLXsxMSwgMTAsIDExLCAxMSwgfSwKLXsxMiwgMTAsIDEyLCAxMiwgfSwKLXsxMywgMTAsIDEzLCAxMywgfSwKLXsxNCwgMTAsIDE0LCAxNCwgfSwKLXsxNSwgMTAsIDE1LCAxNSwgfSwKLXsxNiwgMTAsIDE2LCAxNiwgfSwKLXsxNywgMTAsIDE3LCAxNywgfSwKLXsxOCwgMTAsIDE4LCAxOCwgfSwKLXsxOSwgMTAsIDE5LCAxOSwgfSwKLXsyMCwgMTAsIDIwLCAyMCwgfSwKLXsyMSwgMTAsIDIxLCAyMSwgfSwKLXsyMiwgMTAsIDIyLCAyMiwgfSwKLXsyMywgMTAsIDIzLCAyMywgfSwKLXsyNCwgMTAsIDI0LCAyNCwgfSwKLXsyNSwgMTAsIDI1LCAyNSwgfSwKLXsyNiwgMTAsIDI2LCAyNiwgfSwKLXsyNywgMTAsIDI3LCAyNywgfSwKLXsyOCwgMTAsIDI4LCAyOCwgfSwKLXsyOSwgMTAsIDI5LCAyOSwgfSwKLXszMCwgMTAsIDMwLCAzMCwgfSwKLXszMSwgMTAsIDMxLCAzMSwgfSwKLXszMiwgMTAsIDMyLCAzMiwgfSwKLXszMywgMTAsIDMzLCAzMywgfSwKLXszNCwgMTAsIDM0LCAzNCwgfSwKLXszNSwgMTAsIDM1LCAzNSwgfSwKLXszNiwgMTAsIDM2LCAzNiwgfSwKLXszNywgMTAsIDM3LCAzNywgfSwKLXszOCwgMTAsIDM4LCAzOCwgfSwKLXszOSwgMTAsIDM5LCAzOSwgfSwKLXs0MCwgMTAsIDQwLCA0MCwgfSwKLXs0MSwgMTAsIDQxLCA0MSwgfSwKLXs0MiwgMTAsIDQyLCA0MiwgfSwKLXs0MywgMTAsIDQzLCA0MywgfSwKLXs0NCwgMTAsIDQ0LCA0NCwgfSwKLXs0NSwgMTAsIDQ1LCA0NSwgfSwKLXs0NiwgMTAsIDQ2LCA0NiwgfSwKLXs0NywgMTAsIDQ3LCA0NywgfSwKLXs0OCwgMTAsIDQ4LCA0OCwgfSwKLXs0OSwgMTAsIDQ5LCA0OSwgfSwKLXs1MCwgMTAsIDUwLCA1MCwgfSwKLXs1MSwgMTAsIDUxLCA1MCwgfSwKLXs1MiwgMTAsIDUyLCA1MCwgfSwKLXs1MywgMTAsIDUzLCA1MCwgfSwKLXs1NCwgMTAsIDU0LCA1MCwgfSwKLXs1NSwgMTAsIDU1LCA1MCwgfSwKLXs1NiwgMTAsIDU2LCA1MCwgfSwKLXs1NywgMTAsIDU3LCA1MCwgfSwKLXs1OCwgMTAsIDU4LCA1MCwgfSwKLXs1OSwgMTAsIDU5LCA1MCwgfSwKLXs2MCwgMTAsIDYwLCA1MCwgfSwKLXs2MSwgMTAsIDYxLCA1MCwgfSwKLXs2MiwgMTAsIDYyLCA1MCwgfSwKLXs2MywgMTAsIDYzLCA1MCwgfSwKLXs2NCwgMTAsIDY0LCA1MCwgfSwKLXs2NSwgMTAsIDY1LCA1MCwgfSwKLXs2NiwgMTAsIDY2LCA1MCwgfSwKLXs2NywgMTAsIDY3LCA1MCwgfSwKLXs2OCwgMTAsIDY4LCA1MCwgfSwKLXs2OSwgMTAsIDY5LCA1MCwgfSwKLXs3MCwgMTAsIDcwLCA1MCwgfSwKLXs3MSwgMTAsIDcxLCA1MCwgfSwKLXs3MiwgMTAsIDcyLCA1MCwgfSwKLXs3MywgMTAsIDczLCA1MCwgfSwKLXs3NCwgMTAsIDc0LCA1MCwgfSwKLXs3NSwgMTAsIDc1LCA1MCwgfSwKLXs3NiwgMTAsIDc2LCA1MCwgfSwKLXs3NywgMTAsIDc3LCA1MCwgfSwKLXs3OCwgMTAsIDc4LCA1MCwgfSwKLXs3OSwgMTAsIDc5LCA1MCwgfSwKLXs4MCwgMTAsIDgwLCA1MCwgfSwKLXs4MSwgMTAsIDgxLCA1MCwgfSwKLXs4MiwgMTAsIDgyLCA1MCwgfSwKLXs4MywgMTAsIDgzLCA1MCwgfSwKLXs4NCwgMTAsIDg0LCA1MCwgfSwKLXs4NSwgMTAsIDg1LCA1MCwgfSwKLXs4NiwgMTAsIDg2LCA1MCwgfSwKLXs4NywgMTAsIDg3LCA1MCwgfSwKLXs4OCwgMTAsIDg4LCA1MCwgfSwKLXs4OSwgMTAsIDg5LCA1MCwgfSwKLXs5MCwgMTAsIDkwLCA1MCwgfSwKLXs5MSwgMTAsIDkxLCA1MCwgfSwKLXs5MiwgMTAsIDkyLCA1MCwgfSwKLXs5MywgMTAsIDkzLCA1MCwgfSwKLXs5NCwgMTAsIDk0LCA1MCwgfSwKLXs5NSwgMTAsIDk1LCA1MCwgfSwKLXs5NiwgMTAsIDk2LCA1MCwgfSwKLXs5NywgMTAsIDk3LCA1MCwgfSwKLXs5OCwgMTAsIDk4LCA1MCwgfSwKLXs5OSwgMTAsIDk5LCA1MCwgfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCB9LAotezEwMSwgMTAsIDEwMSwgNTAsIH0sCi17MTAyLCAxMCwgMTAyLCA1MCwgfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCB9LAotezEwNCwgMTAsIDEwNCwgNTAsIH0sCi17MTA1LCAxMCwgMTA1LCA1MCwgfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCB9LAotezEwNywgMTAsIDEwNywgNTAsIH0sCi17MTA4LCAxMCwgMTA4LCA1MCwgfSwKLXsxMDksIDEwLCAxMDksIDUwLCB9LAotezExMCwgMTAsIDExMCwgNTAsIH0sCi17MTExLCAxMCwgMTExLCA1MCwgfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCB9LAotezExMywgMTAsIDExMywgNTAsIH0sCi17MTE0LCAxMCwgMTE0LCA1MCwgfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCB9LAotezExNiwgMTAsIDExNiwgNTAsIH0sCi17MTE3LCAxMCwgMTE3LCA1MCwgfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCB9LAotezExOSwgMTAsIDExOSwgNTAsIH0sCi17MTIwLCAxMCwgMTIwLCA1MCwgfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCB9LAotezEyMiwgMTAsIDEyMiwgNTAsIH0sCi17MTIzLCAxMCwgMTIzLCA1MCwgfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQlzY2FsZS5zZXRNYXhpbXVtKDEwMCk7Ci0Jc2NhbGUuc2V0TWluaW11bSgxMCk7Ci0Jc2NhbGUuc2V0U2VsZWN0aW9uKDUwKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgMTAsIH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgfSwKLXstMTMsIDEwLCAxMDAsIDEwLCB9LAotey0xMiwgMTAsIDEwMCwgMTAsIH0sCi17LTExLCAxMCwgMTAwLCAxMCwgfSwKLXstMTAsIDEwLCAxMDAsIDEwLCB9LAotey05LCAxMCwgMTAwLCAxMCwgfSwKLXstOCwgMTAsIDEwMCwgMTAsIH0sCi17LTcsIDEwLCAxMDAsIDEwLCB9LAotey02LCAxMCwgMTAwLCAxMCwgfSwKLXstNSwgMTAsIDEwMCwgMTAsIH0sCi17LTQsIDEwLCAxMDAsIDEwLCB9LAotey0zLCAxMCwgMTAwLCAxMCwgfSwKLXstMiwgMTAsIDEwMCwgMTAsIH0sCi17LTEsIDEwLCAxMDAsIDEwLCB9LAotezAsIDEwLCAxMDAsIDEwLCB9LAotezEsIDEwLCAxMDAsIDEwLCB9LAotezIsIDEwLCAxMDAsIDEwLCB9LAotezMsIDEwLCAxMDAsIDEwLCB9LAotezQsIDEwLCAxMDAsIDEwLCB9LAotezUsIDEwLCAxMDAsIDEwLCB9LAotezYsIDEwLCAxMDAsIDEwLCB9LAotezcsIDEwLCAxMDAsIDEwLCB9LAotezgsIDEwLCAxMDAsIDEwLCB9LAotezksIDEwLCAxMDAsIDEwLCB9LAotezEwLCAxMCwgMTAwLCAxMCwgfSwKLXsxMSwgMTAsIDEwMCwgMTEsIH0sCi17MTIsIDEwLCAxMDAsIDEyLCB9LAotezEzLCAxMCwgMTAwLCAxMywgfSwKLXsxNCwgMTAsIDEwMCwgMTQsIH0sCi17MTUsIDEwLCAxMDAsIDE1LCB9LAotezE2LCAxMCwgMTAwLCAxNiwgfSwKLXsxNywgMTAsIDEwMCwgMTcsIH0sCi17MTgsIDEwLCAxMDAsIDE4LCB9LAotezE5LCAxMCwgMTAwLCAxOSwgfSwKLXsyMCwgMTAsIDEwMCwgMjAsIH0sCi17MjEsIDEwLCAxMDAsIDIxLCB9LAotezIyLCAxMCwgMTAwLCAyMiwgfSwKLXsyMywgMTAsIDEwMCwgMjMsIH0sCi17MjQsIDEwLCAxMDAsIDI0LCB9LAotezI1LCAxMCwgMTAwLCAyNSwgfSwKLXsyNiwgMTAsIDEwMCwgMjYsIH0sCi17MjcsIDEwLCAxMDAsIDI3LCB9LAotezI4LCAxMCwgMTAwLCAyOCwgfSwKLXsyOSwgMTAsIDEwMCwgMjksIH0sCi17MzAsIDEwLCAxMDAsIDMwLCB9LAotezMxLCAxMCwgMTAwLCAzMSwgfSwKLXszMiwgMTAsIDEwMCwgMzIsIH0sCi17MzMsIDEwLCAxMDAsIDMzLCB9LAotezM0LCAxMCwgMTAwLCAzNCwgfSwKLXszNSwgMTAsIDEwMCwgMzUsIH0sCi17MzYsIDEwLCAxMDAsIDM2LCB9LAotezM3LCAxMCwgMTAwLCAzNywgfSwKLXszOCwgMTAsIDEwMCwgMzgsIH0sCi17MzksIDEwLCAxMDAsIDM5LCB9LAotezQwLCAxMCwgMTAwLCA0MCwgfSwKLXs0MSwgMTAsIDEwMCwgNDEsIH0sCi17NDIsIDEwLCAxMDAsIDQyLCB9LAotezQzLCAxMCwgMTAwLCA0MywgfSwKLXs0NCwgMTAsIDEwMCwgNDQsIH0sCi17NDUsIDEwLCAxMDAsIDQ1LCB9LAotezQ2LCAxMCwgMTAwLCA0NiwgfSwKLXs0NywgMTAsIDEwMCwgNDcsIH0sCi17NDgsIDEwLCAxMDAsIDQ4LCB9LAotezQ5LCAxMCwgMTAwLCA0OSwgfSwKLXs1MCwgMTAsIDEwMCwgNTAsIH0sCi17NTEsIDEwLCAxMDAsIDUxLCB9LAotezUyLCAxMCwgMTAwLCA1MiwgfSwKLXs1MywgMTAsIDEwMCwgNTMsIH0sCi17NTQsIDEwLCAxMDAsIDU0LCB9LAotezU1LCAxMCwgMTAwLCA1NSwgfSwKLXs1NiwgMTAsIDEwMCwgNTYsIH0sCi17NTcsIDEwLCAxMDAsIDU3LCB9LAotezU4LCAxMCwgMTAwLCA1OCwgfSwKLXs1OSwgMTAsIDEwMCwgNTksIH0sCi17NjAsIDEwLCAxMDAsIDYwLCB9LAotezYxLCAxMCwgMTAwLCA2MSwgfSwKLXs2MiwgMTAsIDEwMCwgNjIsIH0sCi17NjMsIDEwLCAxMDAsIDYzLCB9LAotezY0LCAxMCwgMTAwLCA2NCwgfSwKLXs2NSwgMTAsIDEwMCwgNjUsIH0sCi17NjYsIDEwLCAxMDAsIDY2LCB9LAotezY3LCAxMCwgMTAwLCA2NywgfSwKLXs2OCwgMTAsIDEwMCwgNjgsIH0sCi17NjksIDEwLCAxMDAsIDY5LCB9LAotezcwLCAxMCwgMTAwLCA3MCwgfSwKLXs3MSwgMTAsIDEwMCwgNzEsIH0sCi17NzIsIDEwLCAxMDAsIDcyLCB9LAotezczLCAxMCwgMTAwLCA3MywgfSwKLXs3NCwgMTAsIDEwMCwgNzQsIH0sCi17NzUsIDEwLCAxMDAsIDc1LCB9LAotezc2LCAxMCwgMTAwLCA3NiwgfSwKLXs3NywgMTAsIDEwMCwgNzcsIH0sCi17NzgsIDEwLCAxMDAsIDc4LCB9LAotezc5LCAxMCwgMTAwLCA3OSwgfSwKLXs4MCwgMTAsIDEwMCwgODAsIH0sCi17ODEsIDEwLCAxMDAsIDgxLCB9LAotezgyLCAxMCwgMTAwLCA4MiwgfSwKLXs4MywgMTAsIDEwMCwgODMsIH0sCi17ODQsIDEwLCAxMDAsIDg0LCB9LAotezg1LCAxMCwgMTAwLCA4NSwgfSwKLXs4NiwgMTAsIDEwMCwgODYsIH0sCi17ODcsIDEwLCAxMDAsIDg3LCB9LAotezg4LCAxMCwgMTAwLCA4OCwgfSwKLXs4OSwgMTAsIDEwMCwgODksIH0sCi17OTAsIDEwLCAxMDAsIDkwLCB9LAotezkxLCAxMCwgMTAwLCA5MSwgfSwKLXs5MiwgMTAsIDEwMCwgOTIsIH0sCi17OTMsIDEwLCAxMDAsIDkzLCB9LAotezk0LCAxMCwgMTAwLCA5NCwgfSwKLXs5NSwgMTAsIDEwMCwgOTUsIH0sCi17OTYsIDEwLCAxMDAsIDk2LCB9LAotezk3LCAxMCwgMTAwLCA5NywgfSwKLXs5OCwgMTAsIDEwMCwgOTgsIH0sCi17OTksIDEwLCAxMDAsIDk5LCB9LAotezEwMCwgMTAsIDEwMCwgMTAwLCB9LAotezEwMSwgMTAsIDEwMCwgMTAwLCB9LAotezEwMiwgMTAsIDEwMCwgMTAwLCB9LAotezEwMywgMTAsIDEwMCwgMTAwLCB9LAotezEwNCwgMTAsIDEwMCwgMTAwLCB9LAotezEwNSwgMTAsIDEwMCwgMTAwLCB9LAotezEwNiwgMTAsIDEwMCwgMTAwLCB9LAotezEwNywgMTAsIDEwMCwgMTAwLCB9LAotezEwOCwgMTAsIDEwMCwgMTAwLCB9LAotezEwOSwgMTAsIDEwMCwgMTAwLCB9LAotezExMCwgMTAsIDEwMCwgMTAwLCB9LAotezExMSwgMTAsIDEwMCwgMTAwLCB9LAotezExMiwgMTAsIDEwMCwgMTAwLCB9LAotezExMywgMTAsIDEwMCwgMTAwLCB9LAotezExNCwgMTAsIDEwMCwgMTAwLCB9LAotezExNSwgMTAsIDEwMCwgMTAwLCB9LAotezExNiwgMTAsIDEwMCwgMTAwLCB9LAotezExNywgMTAsIDEwMCwgMTAwLCB9LAotezExOCwgMTAsIDEwMCwgMTAwLCB9LAotezExOSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMCwgMTAsIDEwMCwgMTAwLCB9LAotezEyMSwgMTAsIDEwMCwgMTAwLCB9LAotezEyMiwgMTAsIDEwMCwgMTAwLCB9LAotezEyMywgMTAsIDEwMCwgMTAwLCB9LAotezEyNCwgMTAsIDEwMCwgMTAwLCB9LAotfTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX1JJR0hULCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg5LCAxMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Ucm91Z2hTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjcsIDUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg5LCA1LCAzMCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWNkOTBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbEJhciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQljYW52YXMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuSF9TQ1JPTEwpOwotCXNjcm9sbEJhciA9IGNhbnZhcy5nZXRIb3Jpem9udGFsQmFyKCk7Ci0JY2FudmFzLnNldFNpemUoMTAwLDEwMCk7Ci0Jc2V0V2lkZ2V0KHNjcm9sbEJhcik7Ci0Jc2hlbGwucGFjaygpOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLXByb3RlY3RlZCBTdHJpbmcgdmFsdWVTdHJpbmcoaW50W10gaW50QXJyYXkpIHsKLQlyZXR1cm4gIiAoIitpbnRBcnJheVsxXSsiLCIraW50QXJyYXlbMl0rIiwiK2ludEFycmF5WzNdKyIsIitpbnRBcnJheVs0XSsiKSI7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlzY3JvbGxCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0Jc2Nyb2xsQmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlzY3JvbGxCYXIuc2V0U2VsZWN0aW9uKDEwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXNjcm9sbEJhci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdHJ5IHsKLQkJc2Nyb2xsQmFyLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlYXJEb3duCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRFbmFibGVkKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW5jcmVtZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEluY3JlbWVudCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1heGltdW0oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWF4aW11bSgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TWluaW11bSgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0UGFnZUluY3JlbWVudCgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHMoY2FudmFzLCBzY3JvbGxCYXIuZ2V0UGFyZW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRTZWxlY3Rpb24oKSBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTaXplKCkgewotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldFNpemUoKS54ID4gMCk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuZ2V0U2l6ZSgpLnkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUaHVtYigpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUaHVtYigpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VmlzaWJsZSgpIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQlzY3JvbGxCYXIuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5pc0VuYWJsZWQoKSk7Ci0KLQlzY3JvbGxCYXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmlzRW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0Jc2Nyb2xsQmFyLnNldFZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzY3JvbGxCYXIuaXNWaXNpYmxlKCkpOyAKLQlzY3JvbGxCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmlzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCS8vIHRlc3RlZCBpbiBhZGRTZWxlY3Rpb25MaXN0ZW5lciBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQlzY3JvbGxCYXIuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHNjcm9sbEJhci5nZXRFbmFibGVkKCkpOwotCi0Jc2Nyb2xsQmFyLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIXNjcm9sbEJhci5nZXRFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEluY3JlbWVudEkoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JCXNjcm9sbEJhci5zZXRJbmNyZW1lbnQoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoY2FzZXNbaV0sIHNjcm9sbEJhci5nZXRJbmNyZW1lbnQoKSk7Ci0JfSAKLQotCXNjcm9sbEJhci5zZXRJbmNyZW1lbnQoMjUpOwotCXNjcm9sbEJhci5zZXRJbmNyZW1lbnQoMCk7IC8vIHNldHRpbmcgdG8gMCBmYWlscyBzaWxlbnRseQotCWFzc2VydEVxdWFscygyNSwgc2Nyb2xsQmFyLmdldEluY3JlbWVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNYXhpbXVtSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNYXhpbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0TWF4aW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNYXggIitpbnRBcnJheVswXSsgdmFsdWVTdHJpbmcsIGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldE1pbmltdW1JKCl7Ci0JaW50IFtdW10gdGVzdFZhbHVlcyA9IGdldFNldE1pbmltdW1WYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjcm9sbEJhci5zZXRNaW5pbXVtKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldE1pbiAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpewotCWludFtdIGNhc2VzID0gezEsIDEwLCAxMDAwMH07Ci0JZm9yIChpbnQgaT0wOyBpPGNhc2VzLmxlbmd0aDsgaSsrKQotCXsKLQkJc2Nyb2xsQmFyLnNldFBhZ2VJbmNyZW1lbnQoY2FzZXNbaV0pOwotCQlhc3NlcnRFcXVhbHMoc2Nyb2xsQmFyLmdldFBhZ2VJbmNyZW1lbnQoKSwgY2FzZXNbaV0pOwotCX0gCi0KLQlzY3JvbGxCYXIuc2V0UGFnZUluY3JlbWVudCgyNSk7Ci0Jc2Nyb2xsQmFyLnNldFBhZ2VJbmNyZW1lbnQoMCk7IC8vIHNldHRpbmcgdG8gMCBmYWlscyBzaWxlbnRseQotCWFzc2VydEVxdWFscygyNSwgc2Nyb2xsQmFyLmdldFBhZ2VJbmNyZW1lbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRTZWxlY3Rpb25WYWx1ZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzY3JvbGxCYXIuc2V0U2VsZWN0aW9uKGludEFycmF5WzBdKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWVTdHJpbmcoaW50QXJyYXkpOwotCQlyZXBvcnQoInNldFNlbCAiK2ludEFycmF5WzBdK3ZhbHVlU3RyaW5nLGludEFycmF5WzBdLCBpbnRBcnJheVsxXSwgaW50QXJyYXlbMl0sIGludEFycmF5WzNdLCBpbnRBcnJheVs0XSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRodW1iSSgpewotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRUaHVtYlZhbHVlcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNjcm9sbEJhci5zZXRUaHVtYihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRUaG1iICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCkgewotCXNjcm9sbEJhci5zZXRWYWx1ZXMoMTAsIDEwLCA1MCwgMiwgNSwgMTApOwotCWFzc2VydFRydWUoIjphOiIsIHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2Nyb2xsQmFyLmdldE1pbmltdW0oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2Nyb2xsQmFyLmdldE1heGltdW0oKSA9PSA1MCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2Nyb2xsQmFyLmdldFRodW1iKCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc2Nyb2xsQmFyLmdldEluY3JlbWVudCgpID09IDUpOwotCWFzc2VydFRydWUoIjpmOiIsIHNjcm9sbEJhci5nZXRQYWdlSW5jcmVtZW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCXNjcm9sbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoc2Nyb2xsQmFyLmdldFZpc2libGUoKSk7Ci0KLQlzY3JvbGxCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSghc2Nyb2xsQmFyLmdldFZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsQmFyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rpc3Bvc2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEluY3JlbWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWF4aW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TWluaW11bSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFnZUluY3JlbWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNpemUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRodW1iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1heGltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNaW5pbXVtSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRodW1iSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9kaXNwb3NlIikpIHRlc3RfZGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEluY3JlbWVudCIpKSB0ZXN0X2dldEluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWF4aW11bSIpKSB0ZXN0X2dldE1heGltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE1pbmltdW0iKSkgdGVzdF9nZXRNaW5pbXVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYWdlSW5jcmVtZW50IikpIHRlc3RfZ2V0UGFnZUluY3JlbWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNpemUiKSkgdGVzdF9nZXRTaXplKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUaHVtYiIpKSB0ZXN0X2dldFRodW1iKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRWaXNpYmxlIikpIHRlc3RfZ2V0VmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaXNFbmFibGVkIikpIHRlc3RfaXNFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc1Zpc2libGUiKSkgdGVzdF9pc1Zpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRodW1iSSIpKSB0ZXN0X3NldFRodW1iSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIikpIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotU2Nyb2xsQmFyIHNjcm9sbEJhcjsKLUNhbnZhcyBjYW52YXM7Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIGNhbGwsIGludCBzZXQsIGludCBtaW5FeHBlY3RlZCwgaW50IG1heEV4cGVjdGVkLCBpbnQgc2VsZWN0aW9uRXhwZWN0ZWQsIGludCB0aHVtYkV4cGVjdGVkKSB7Ci0JLy8gVW5jb21tZW50IHRoZXNlIGxpbmVzIGFuZCBjb21tZW50IG91dCBjYWxsIHRvIGNoZWNrKCkgaWYgeW91IHdhbnQgdGhlIHRlc3QgdG8gcmVwb3J0IGFsbCBlcnJvcnMgd2l0aG91dAotCS8vIHN0b3BwaW5nLgotLy8JaWYgKHNjcm9sbEJhci5nZXRNaW5pbXVtKCkgIT0gbWluRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBNaW5pbXVtIEV4cGVjdGVkOiAiICsgbWluRXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0TWluaW11bSgpKTsKLS8vCX0KLS8vCWlmIChzY3JvbGxCYXIuZ2V0TWF4aW11bSgpICE9IG1heEV4cGVjdGVkKXsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBNYXhpbXVtIEV4cGVjdGVkOiAiICsgbWF4RXhwZWN0ZWQgKyAiICBBY3R1YWw6ICIgKyBzY3JvbGxCYXIuZ2V0TWF4aW11bSgpKTsKLS8vCX0KLS8vCWlmIChzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkgIT0gc2VsZWN0aW9uRXhwZWN0ZWQpIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oY2FsbCArICIgOiBTZWxlY3Rpb24gRXhwZWN0ZWQ6ICIgKyBzZWxlY3Rpb25FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNjcm9sbEJhci5nZXRTZWxlY3Rpb24oKSk7Ci0vLwl9Ci0vLwlpZiAoc2Nyb2xsQmFyLmdldFRodW1iKCkgIT0gdGh1bWJFeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFRodW1iIEV4cGVjdGVkOiAiICsgdGh1bWJFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNjcm9sbEJhci5nZXRUaHVtYigpKTsKLS8vCX0KLQljaGVjayhjYWxsLCBtaW5FeHBlY3RlZCwgbWF4RXhwZWN0ZWQsIHNlbGVjdGlvbkV4cGVjdGVkLCB0aHVtYkV4cGVjdGVkKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBjaGVjayhTdHJpbmcgY2FsbCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1heCAiLCBtYXhFeHBlY3RlZCwgc2Nyb2xsQmFyLmdldE1heGltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBtaW4gIiwgbWluRXhwZWN0ZWQsIHNjcm9sbEJhci5nZXRNaW5pbXVtKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgc2VsICIsIHNlbGVjdGlvbkV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0U2VsZWN0aW9uKCkpOwotCWFzc2VydEVxdWFscyhjYWxsKyIgdGhtYiAiLCB0aHVtYkV4cGVjdGVkLCBzY3JvbGxCYXIuZ2V0VGh1bWIoKSk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0VGh1bWJWYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MSwgMTAsIDEwMCwgNTAsIDF9LAotezIsIDEwLCAxMDAsIDUwLCAyfSwKLXszLCAxMCwgMTAwLCA1MCwgM30sCi17NCwgMTAsIDEwMCwgNTAsIDR9LAotezUsIDEwLCAxMDAsIDUwLCA1fSwKLXs2LCAxMCwgMTAwLCA1MCwgNn0sCi17NywgMTAsIDEwMCwgNTAsIDd9LAotezgsIDEwLCAxMDAsIDUwLCA4fSwKLXs5LCAxMCwgMTAwLCA1MCwgOX0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDEwLCAxMDAsIDUwLCAxMX0sCi17MTIsIDEwLCAxMDAsIDUwLCAxMn0sCi17MTMsIDEwLCAxMDAsIDUwLCAxM30sCi17MTQsIDEwLCAxMDAsIDUwLCAxNH0sCi17MTUsIDEwLCAxMDAsIDUwLCAxNX0sCi17MTYsIDEwLCAxMDAsIDUwLCAxNn0sCi17MTcsIDEwLCAxMDAsIDUwLCAxN30sCi17MTgsIDEwLCAxMDAsIDUwLCAxOH0sCi17MTksIDEwLCAxMDAsIDUwLCAxOX0sCi17MjAsIDEwLCAxMDAsIDUwLCAyMH0sCi17MjEsIDEwLCAxMDAsIDUwLCAyMX0sCi17MjIsIDEwLCAxMDAsIDUwLCAyMn0sCi17MjMsIDEwLCAxMDAsIDUwLCAyM30sCi17MjQsIDEwLCAxMDAsIDUwLCAyNH0sCi17MjUsIDEwLCAxMDAsIDUwLCAyNX0sCi17MjYsIDEwLCAxMDAsIDUwLCAyNn0sCi17MjcsIDEwLCAxMDAsIDUwLCAyN30sCi17MjgsIDEwLCAxMDAsIDUwLCAyOH0sCi17MjksIDEwLCAxMDAsIDUwLCAyOX0sCi17MzAsIDEwLCAxMDAsIDUwLCAzMH0sCi17MzEsIDEwLCAxMDAsIDUwLCAzMX0sCi17MzIsIDEwLCAxMDAsIDUwLCAzMn0sCi17MzMsIDEwLCAxMDAsIDUwLCAzM30sCi17MzQsIDEwLCAxMDAsIDUwLCAzNH0sCi17MzUsIDEwLCAxMDAsIDUwLCAzNX0sCi17MzYsIDEwLCAxMDAsIDUwLCAzNn0sCi17MzcsIDEwLCAxMDAsIDUwLCAzN30sCi17MzgsIDEwLCAxMDAsIDUwLCAzOH0sCi17MzksIDEwLCAxMDAsIDUwLCAzOX0sCi17NDAsIDEwLCAxMDAsIDUwLCA0MH0sCi17NDEsIDEwLCAxMDAsIDUwLCA0MX0sCi17NDIsIDEwLCAxMDAsIDUwLCA0Mn0sCi17NDMsIDEwLCAxMDAsIDUwLCA0M30sCi17NDQsIDEwLCAxMDAsIDUwLCA0NH0sCi17NDUsIDEwLCAxMDAsIDUwLCA0NX0sCi17NDYsIDEwLCAxMDAsIDUwLCA0Nn0sCi17NDcsIDEwLCAxMDAsIDUwLCA0N30sCi17NDgsIDEwLCAxMDAsIDUwLCA0OH0sCi17NDksIDEwLCAxMDAsIDUwLCA0OX0sCi17NTAsIDEwLCAxMDAsIDUwLCA1MH0sCi17NTEsIDEwLCAxMDAsIDQ5LCA1MX0sCi17NTIsIDEwLCAxMDAsIDQ4LCA1Mn0sCi17NTMsIDEwLCAxMDAsIDQ3LCA1M30sCi17NTQsIDEwLCAxMDAsIDQ2LCA1NH0sCi17NTUsIDEwLCAxMDAsIDQ1LCA1NX0sCi17NTYsIDEwLCAxMDAsIDQ0LCA1Nn0sCi17NTcsIDEwLCAxMDAsIDQzLCA1N30sCi17NTgsIDEwLCAxMDAsIDQyLCA1OH0sCi17NTksIDEwLCAxMDAsIDQxLCA1OX0sCi17NjAsIDEwLCAxMDAsIDQwLCA2MH0sCi17NjEsIDEwLCAxMDAsIDM5LCA2MX0sCi17NjIsIDEwLCAxMDAsIDM4LCA2Mn0sCi17NjMsIDEwLCAxMDAsIDM3LCA2M30sCi17NjQsIDEwLCAxMDAsIDM2LCA2NH0sCi17NjUsIDEwLCAxMDAsIDM1LCA2NX0sCi17NjYsIDEwLCAxMDAsIDM0LCA2Nn0sCi17NjcsIDEwLCAxMDAsIDMzLCA2N30sCi17NjgsIDEwLCAxMDAsIDMyLCA2OH0sCi17NjksIDEwLCAxMDAsIDMxLCA2OX0sCi17NzAsIDEwLCAxMDAsIDMwLCA3MH0sCi17NzEsIDEwLCAxMDAsIDI5LCA3MX0sCi17NzIsIDEwLCAxMDAsIDI4LCA3Mn0sCi17NzMsIDEwLCAxMDAsIDI3LCA3M30sCi17NzQsIDEwLCAxMDAsIDI2LCA3NH0sCi17NzUsIDEwLCAxMDAsIDI1LCA3NX0sCi17NzYsIDEwLCAxMDAsIDI0LCA3Nn0sCi17NzcsIDEwLCAxMDAsIDIzLCA3N30sCi17NzgsIDEwLCAxMDAsIDIyLCA3OH0sCi17NzksIDEwLCAxMDAsIDIxLCA3OX0sCi17ODAsIDEwLCAxMDAsIDIwLCA4MH0sCi17ODEsIDEwLCAxMDAsIDE5LCA4MX0sCi17ODIsIDEwLCAxMDAsIDE4LCA4Mn0sCi17ODMsIDEwLCAxMDAsIDE3LCA4M30sCi17ODQsIDEwLCAxMDAsIDE2LCA4NH0sCi17ODUsIDEwLCAxMDAsIDE1LCA4NX0sCi17ODYsIDEwLCAxMDAsIDE0LCA4Nn0sCi17ODcsIDEwLCAxMDAsIDEzLCA4N30sCi17ODgsIDEwLCAxMDAsIDEyLCA4OH0sCi17ODksIDEwLCAxMDAsIDExLCA4OX0sCi17OTAsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTEsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTMsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTQsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTYsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTcsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17OTksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAwLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAzLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA2LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA5LCAxMCwgMTAwLCAxMCwgOTB9LAotezExMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEyLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTQsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE1LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTcsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE4LCAxMCwgMTAwLCAxMCwgOTB9LAotezExOSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTI0LCAxMCwgMTAwLCAxMCwgOTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNaW5pbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAwLCAxMDAsIDUwLCAxMH0sCi17MSwgMSwgMTAwLCA1MCwgMTB9LAotezIsIDIsIDEwMCwgNTAsIDEwfSwKLXszLCAzLCAxMDAsIDUwLCAxMH0sCi17NCwgNCwgMTAwLCA1MCwgMTB9LAotezUsIDUsIDEwMCwgNTAsIDEwfSwKLXs2LCA2LCAxMDAsIDUwLCAxMH0sCi17NywgNywgMTAwLCA1MCwgMTB9LAotezgsIDgsIDEwMCwgNTAsIDEwfSwKLXs5LCA5LCAxMDAsIDUwLCAxMH0sCi17MTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEsIDExLCAxMDAsIDUwLCAxMH0sCi17MTIsIDEyLCAxMDAsIDUwLCAxMH0sCi17MTMsIDEzLCAxMDAsIDUwLCAxMH0sCi17MTQsIDE0LCAxMDAsIDUwLCAxMH0sCi17MTUsIDE1LCAxMDAsIDUwLCAxMH0sCi17MTYsIDE2LCAxMDAsIDUwLCAxMH0sCi17MTcsIDE3LCAxMDAsIDUwLCAxMH0sCi17MTgsIDE4LCAxMDAsIDUwLCAxMH0sCi17MTksIDE5LCAxMDAsIDUwLCAxMH0sCi17MjAsIDIwLCAxMDAsIDUwLCAxMH0sCi17MjEsIDIxLCAxMDAsIDUwLCAxMH0sCi17MjIsIDIyLCAxMDAsIDUwLCAxMH0sCi17MjMsIDIzLCAxMDAsIDUwLCAxMH0sCi17MjQsIDI0LCAxMDAsIDUwLCAxMH0sCi17MjUsIDI1LCAxMDAsIDUwLCAxMH0sCi17MjYsIDI2LCAxMDAsIDUwLCAxMH0sCi17MjcsIDI3LCAxMDAsIDUwLCAxMH0sCi17MjgsIDI4LCAxMDAsIDUwLCAxMH0sCi17MjksIDI5LCAxMDAsIDUwLCAxMH0sCi17MzAsIDMwLCAxMDAsIDUwLCAxMH0sCi17MzEsIDMxLCAxMDAsIDUwLCAxMH0sCi17MzIsIDMyLCAxMDAsIDUwLCAxMH0sCi17MzMsIDMzLCAxMDAsIDUwLCAxMH0sCi17MzQsIDM0LCAxMDAsIDUwLCAxMH0sCi17MzUsIDM1LCAxMDAsIDUwLCAxMH0sCi17MzYsIDM2LCAxMDAsIDUwLCAxMH0sCi17MzcsIDM3LCAxMDAsIDUwLCAxMH0sCi17MzgsIDM4LCAxMDAsIDUwLCAxMH0sCi17MzksIDM5LCAxMDAsIDUwLCAxMH0sCi17NDAsIDQwLCAxMDAsIDUwLCAxMH0sCi17NDEsIDQxLCAxMDAsIDUwLCAxMH0sCi17NDIsIDQyLCAxMDAsIDUwLCAxMH0sCi17NDMsIDQzLCAxMDAsIDUwLCAxMH0sCi17NDQsIDQ0LCAxMDAsIDUwLCAxMH0sCi17NDUsIDQ1LCAxMDAsIDUwLCAxMH0sCi17NDYsIDQ2LCAxMDAsIDUwLCAxMH0sCi17NDcsIDQ3LCAxMDAsIDUwLCAxMH0sCi17NDgsIDQ4LCAxMDAsIDUwLCAxMH0sCi17NDksIDQ5LCAxMDAsIDUwLCAxMH0sCi17NTAsIDUwLCAxMDAsIDUwLCAxMH0sCi17NTEsIDUxLCAxMDAsIDUxLCAxMH0sCi17NTIsIDUyLCAxMDAsIDUyLCAxMH0sCi17NTMsIDUzLCAxMDAsIDUzLCAxMH0sCi17NTQsIDU0LCAxMDAsIDU0LCAxMH0sCi17NTUsIDU1LCAxMDAsIDU1LCAxMH0sCi17NTYsIDU2LCAxMDAsIDU2LCAxMH0sCi17NTcsIDU3LCAxMDAsIDU3LCAxMH0sCi17NTgsIDU4LCAxMDAsIDU4LCAxMH0sCi17NTksIDU5LCAxMDAsIDU5LCAxMH0sCi17NjAsIDYwLCAxMDAsIDYwLCAxMH0sCi17NjEsIDYxLCAxMDAsIDYxLCAxMH0sCi17NjIsIDYyLCAxMDAsIDYyLCAxMH0sCi17NjMsIDYzLCAxMDAsIDYzLCAxMH0sCi17NjQsIDY0LCAxMDAsIDY0LCAxMH0sCi17NjUsIDY1LCAxMDAsIDY1LCAxMH0sCi17NjYsIDY2LCAxMDAsIDY2LCAxMH0sCi17NjcsIDY3LCAxMDAsIDY3LCAxMH0sCi17NjgsIDY4LCAxMDAsIDY4LCAxMH0sCi17NjksIDY5LCAxMDAsIDY5LCAxMH0sCi17NzAsIDcwLCAxMDAsIDcwLCAxMH0sCi17NzEsIDcxLCAxMDAsIDcxLCAxMH0sCi17NzIsIDcyLCAxMDAsIDcyLCAxMH0sCi17NzMsIDczLCAxMDAsIDczLCAxMH0sCi17NzQsIDc0LCAxMDAsIDc0LCAxMH0sCi17NzUsIDc1LCAxMDAsIDc1LCAxMH0sCi17NzYsIDc2LCAxMDAsIDc2LCAxMH0sCi17NzcsIDc3LCAxMDAsIDc3LCAxMH0sCi17NzgsIDc4LCAxMDAsIDc4LCAxMH0sCi17NzksIDc5LCAxMDAsIDc5LCAxMH0sCi17ODAsIDgwLCAxMDAsIDgwLCAxMH0sCi17ODEsIDgxLCAxMDAsIDgxLCAxMH0sCi17ODIsIDgyLCAxMDAsIDgyLCAxMH0sCi17ODMsIDgzLCAxMDAsIDgzLCAxMH0sCi17ODQsIDg0LCAxMDAsIDg0LCAxMH0sCi17ODUsIDg1LCAxMDAsIDg1LCAxMH0sCi17ODYsIDg2LCAxMDAsIDg2LCAxMH0sCi17ODcsIDg3LCAxMDAsIDg3LCAxMH0sCi17ODgsIDg4LCAxMDAsIDg4LCAxMH0sCi17ODksIDg5LCAxMDAsIDg5LCAxMH0sCi17OTAsIDkwLCAxMDAsIDkwLCAxMH0sCi17OTEsIDkxLCAxMDAsIDkxLCA5fSwKLXs5MiwgOTIsIDEwMCwgOTIsIDh9LAotezkzLCA5MywgMTAwLCA5MywgN30sCi17OTQsIDk0LCAxMDAsIDk0LCA2fSwKLXs5NSwgOTUsIDEwMCwgOTUsIDV9LAotezk2LCA5NiwgMTAwLCA5NiwgNH0sCi17OTcsIDk3LCAxMDAsIDk3LCAzfSwKLXs5OCwgOTgsIDEwMCwgOTgsIDJ9LAotezk5LCA5OSwgMTAwLCA5OSwgMX0sCi17MTAwLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgMTB9LAotezExMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNYXhpbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MiwgMTAsIDEwMCwgNTAsIDEwfSwKLXszLCAxMCwgMTAwLCA1MCwgMTB9LAotezQsIDEwLCAxMDAsIDUwLCAxMH0sCi17NSwgMTAsIDEwMCwgNTAsIDEwfSwKLXs2LCAxMCwgMTAwLCA1MCwgMTB9LAotezcsIDEwLCAxMDAsIDUwLCAxMH0sCi17OCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTEsIDEwLCAxfSwKLXsxMiwgMTAsIDEyLCAxMCwgMn0sCi17MTMsIDEwLCAxMywgMTAsIDN9LAotezE0LCAxMCwgMTQsIDEwLCA0fSwKLXsxNSwgMTAsIDE1LCAxMCwgNX0sCi17MTYsIDEwLCAxNiwgMTAsIDZ9LAotezE3LCAxMCwgMTcsIDEwLCA3fSwKLXsxOCwgMTAsIDE4LCAxMCwgOH0sCi17MTksIDEwLCAxOSwgMTAsIDl9LAotezIwLCAxMCwgMjAsIDEwLCAxMH0sCi17MjEsIDEwLCAyMSwgMTEsIDEwfSwKLXsyMiwgMTAsIDIyLCAxMiwgMTB9LAotezIzLCAxMCwgMjMsIDEzLCAxMH0sCi17MjQsIDEwLCAyNCwgMTQsIDEwfSwKLXsyNSwgMTAsIDI1LCAxNSwgMTB9LAotezI2LCAxMCwgMjYsIDE2LCAxMH0sCi17MjcsIDEwLCAyNywgMTcsIDEwfSwKLXsyOCwgMTAsIDI4LCAxOCwgMTB9LAotezI5LCAxMCwgMjksIDE5LCAxMH0sCi17MzAsIDEwLCAzMCwgMjAsIDEwfSwKLXszMSwgMTAsIDMxLCAyMSwgMTB9LAotezMyLCAxMCwgMzIsIDIyLCAxMH0sCi17MzMsIDEwLCAzMywgMjMsIDEwfSwKLXszNCwgMTAsIDM0LCAyNCwgMTB9LAotezM1LCAxMCwgMzUsIDI1LCAxMH0sCi17MzYsIDEwLCAzNiwgMjYsIDEwfSwKLXszNywgMTAsIDM3LCAyNywgMTB9LAotezM4LCAxMCwgMzgsIDI4LCAxMH0sCi17MzksIDEwLCAzOSwgMjksIDEwfSwKLXs0MCwgMTAsIDQwLCAzMCwgMTB9LAotezQxLCAxMCwgNDEsIDMxLCAxMH0sCi17NDIsIDEwLCA0MiwgMzIsIDEwfSwKLXs0MywgMTAsIDQzLCAzMywgMTB9LAotezQ0LCAxMCwgNDQsIDM0LCAxMH0sCi17NDUsIDEwLCA0NSwgMzUsIDEwfSwKLXs0NiwgMTAsIDQ2LCAzNiwgMTB9LAotezQ3LCAxMCwgNDcsIDM3LCAxMH0sCi17NDgsIDEwLCA0OCwgMzgsIDEwfSwKLXs0OSwgMTAsIDQ5LCAzOSwgMTB9LAotezUwLCAxMCwgNTAsIDQwLCAxMH0sCi17NTEsIDEwLCA1MSwgNDEsIDEwfSwKLXs1MiwgMTAsIDUyLCA0MiwgMTB9LAotezUzLCAxMCwgNTMsIDQzLCAxMH0sCi17NTQsIDEwLCA1NCwgNDQsIDEwfSwKLXs1NSwgMTAsIDU1LCA0NSwgMTB9LAotezU2LCAxMCwgNTYsIDQ2LCAxMH0sCi17NTcsIDEwLCA1NywgNDcsIDEwfSwKLXs1OCwgMTAsIDU4LCA0OCwgMTB9LAotezU5LCAxMCwgNTksIDQ5LCAxMH0sCi17NjAsIDEwLCA2MCwgNTAsIDEwfSwKLXs2MSwgMTAsIDYxLCA1MCwgMTB9LAotezYyLCAxMCwgNjIsIDUwLCAxMH0sCi17NjMsIDEwLCA2MywgNTAsIDEwfSwKLXs2NCwgMTAsIDY0LCA1MCwgMTB9LAotezY1LCAxMCwgNjUsIDUwLCAxMH0sCi17NjYsIDEwLCA2NiwgNTAsIDEwfSwKLXs2NywgMTAsIDY3LCA1MCwgMTB9LAotezY4LCAxMCwgNjgsIDUwLCAxMH0sCi17NjksIDEwLCA2OSwgNTAsIDEwfSwKLXs3MCwgMTAsIDcwLCA1MCwgMTB9LAotezcxLCAxMCwgNzEsIDUwLCAxMH0sCi17NzIsIDEwLCA3MiwgNTAsIDEwfSwKLXs3MywgMTAsIDczLCA1MCwgMTB9LAotezc0LCAxMCwgNzQsIDUwLCAxMH0sCi17NzUsIDEwLCA3NSwgNTAsIDEwfSwKLXs3NiwgMTAsIDc2LCA1MCwgMTB9LAotezc3LCAxMCwgNzcsIDUwLCAxMH0sCi17NzgsIDEwLCA3OCwgNTAsIDEwfSwKLXs3OSwgMTAsIDc5LCA1MCwgMTB9LAotezgwLCAxMCwgODAsIDUwLCAxMH0sCi17ODEsIDEwLCA4MSwgNTAsIDEwfSwKLXs4MiwgMTAsIDgyLCA1MCwgMTB9LAotezgzLCAxMCwgODMsIDUwLCAxMH0sCi17ODQsIDEwLCA4NCwgNTAsIDEwfSwKLXs4NSwgMTAsIDg1LCA1MCwgMTB9LAotezg2LCAxMCwgODYsIDUwLCAxMH0sCi17ODcsIDEwLCA4NywgNTAsIDEwfSwKLXs4OCwgMTAsIDg4LCA1MCwgMTB9LAotezg5LCAxMCwgODksIDUwLCAxMH0sCi17OTAsIDEwLCA5MCwgNTAsIDEwfSwKLXs5MSwgMTAsIDkxLCA1MCwgMTB9LAotezkyLCAxMCwgOTIsIDUwLCAxMH0sCi17OTMsIDEwLCA5MywgNTAsIDEwfSwKLXs5NCwgMTAsIDk0LCA1MCwgMTB9LAotezk1LCAxMCwgOTUsIDUwLCAxMH0sCi17OTYsIDEwLCA5NiwgNTAsIDEwfSwKLXs5NywgMTAsIDk3LCA1MCwgMTB9LAotezk4LCAxMCwgOTgsIDUwLCAxMH0sCi17OTksIDEwLCA5OSwgNTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMiwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgMTB9LAotezEwNSwgMTAsIDEwNSwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgMTB9LAotezEwOCwgMTAsIDEwOCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDksIDUwLCAxMH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgMTB9LAotezExMSwgMTAsIDExMSwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgMTB9LAotezExNCwgMTAsIDExNCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgMTB9LAotezExNywgMTAsIDExNywgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgMTB9LAotezEyMCwgMTAsIDEyMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgMTB9LAotezEyMywgMTAsIDEyMywgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCXNjcm9sbEJhci5zZXRNYXhpbXVtKDEwMCk7Ci0Jc2Nyb2xsQmFyLnNldE1pbmltdW0oMTApOwotCXNjcm9sbEJhci5zZXRUaHVtYigxMCk7Ci0Jc2Nyb2xsQmFyLnNldFNlbGVjdGlvbig1MCk7Ci19Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci1wcml2YXRlIGludFtdW10gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMywgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTExLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNywgMTAsIDEwMCwgMTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMywgMTAsIDEwMCwgMTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXswLCAxMCwgMTAwLCAxMCwgMTB9LAotezEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MiwgMTAsIDEwMCwgMTAsIDEwfSwKLXszLCAxMCwgMTAwLCAxMCwgMTB9LAotezQsIDEwLCAxMDAsIDEwLCAxMH0sCi17NSwgMTAsIDEwMCwgMTAsIDEwfSwKLXs2LCAxMCwgMTAwLCAxMCwgMTB9LAotezcsIDEwLCAxMDAsIDEwLCAxMH0sCi17OCwgMTAsIDEwMCwgMTAsIDEwfSwKLXs5LCAxMCwgMTAwLCAxMCwgMTB9LAotezEwLCAxMCwgMTAwLCAxMCwgMTB9LAotezExLCAxMCwgMTAwLCAxMSwgMTB9LAotezEyLCAxMCwgMTAwLCAxMiwgMTB9LAotezEzLCAxMCwgMTAwLCAxMywgMTB9LAotezE0LCAxMCwgMTAwLCAxNCwgMTB9LAotezE1LCAxMCwgMTAwLCAxNSwgMTB9LAotezE2LCAxMCwgMTAwLCAxNiwgMTB9LAotezE3LCAxMCwgMTAwLCAxNywgMTB9LAotezE4LCAxMCwgMTAwLCAxOCwgMTB9LAotezE5LCAxMCwgMTAwLCAxOSwgMTB9LAotezIwLCAxMCwgMTAwLCAyMCwgMTB9LAotezIxLCAxMCwgMTAwLCAyMSwgMTB9LAotezIyLCAxMCwgMTAwLCAyMiwgMTB9LAotezIzLCAxMCwgMTAwLCAyMywgMTB9LAotezI0LCAxMCwgMTAwLCAyNCwgMTB9LAotezI1LCAxMCwgMTAwLCAyNSwgMTB9LAotezI2LCAxMCwgMTAwLCAyNiwgMTB9LAotezI3LCAxMCwgMTAwLCAyNywgMTB9LAotezI4LCAxMCwgMTAwLCAyOCwgMTB9LAotezI5LCAxMCwgMTAwLCAyOSwgMTB9LAotezMwLCAxMCwgMTAwLCAzMCwgMTB9LAotezMxLCAxMCwgMTAwLCAzMSwgMTB9LAotezMyLCAxMCwgMTAwLCAzMiwgMTB9LAotezMzLCAxMCwgMTAwLCAzMywgMTB9LAotezM0LCAxMCwgMTAwLCAzNCwgMTB9LAotezM1LCAxMCwgMTAwLCAzNSwgMTB9LAotezM2LCAxMCwgMTAwLCAzNiwgMTB9LAotezM3LCAxMCwgMTAwLCAzNywgMTB9LAotezM4LCAxMCwgMTAwLCAzOCwgMTB9LAotezM5LCAxMCwgMTAwLCAzOSwgMTB9LAotezQwLCAxMCwgMTAwLCA0MCwgMTB9LAotezQxLCAxMCwgMTAwLCA0MSwgMTB9LAotezQyLCAxMCwgMTAwLCA0MiwgMTB9LAotezQzLCAxMCwgMTAwLCA0MywgMTB9LAotezQ0LCAxMCwgMTAwLCA0NCwgMTB9LAotezQ1LCAxMCwgMTAwLCA0NSwgMTB9LAotezQ2LCAxMCwgMTAwLCA0NiwgMTB9LAotezQ3LCAxMCwgMTAwLCA0NywgMTB9LAotezQ4LCAxMCwgMTAwLCA0OCwgMTB9LAotezQ5LCAxMCwgMTAwLCA0OSwgMTB9LAotezUwLCAxMCwgMTAwLCA1MCwgMTB9LAotezUxLCAxMCwgMTAwLCA1MSwgMTB9LAotezUyLCAxMCwgMTAwLCA1MiwgMTB9LAotezUzLCAxMCwgMTAwLCA1MywgMTB9LAotezU0LCAxMCwgMTAwLCA1NCwgMTB9LAotezU1LCAxMCwgMTAwLCA1NSwgMTB9LAotezU2LCAxMCwgMTAwLCA1NiwgMTB9LAotezU3LCAxMCwgMTAwLCA1NywgMTB9LAotezU4LCAxMCwgMTAwLCA1OCwgMTB9LAotezU5LCAxMCwgMTAwLCA1OSwgMTB9LAotezYwLCAxMCwgMTAwLCA2MCwgMTB9LAotezYxLCAxMCwgMTAwLCA2MSwgMTB9LAotezYyLCAxMCwgMTAwLCA2MiwgMTB9LAotezYzLCAxMCwgMTAwLCA2MywgMTB9LAotezY0LCAxMCwgMTAwLCA2NCwgMTB9LAotezY1LCAxMCwgMTAwLCA2NSwgMTB9LAotezY2LCAxMCwgMTAwLCA2NiwgMTB9LAotezY3LCAxMCwgMTAwLCA2NywgMTB9LAotezY4LCAxMCwgMTAwLCA2OCwgMTB9LAotezY5LCAxMCwgMTAwLCA2OSwgMTB9LAotezcwLCAxMCwgMTAwLCA3MCwgMTB9LAotezcxLCAxMCwgMTAwLCA3MSwgMTB9LAotezcyLCAxMCwgMTAwLCA3MiwgMTB9LAotezczLCAxMCwgMTAwLCA3MywgMTB9LAotezc0LCAxMCwgMTAwLCA3NCwgMTB9LAotezc1LCAxMCwgMTAwLCA3NSwgMTB9LAotezc2LCAxMCwgMTAwLCA3NiwgMTB9LAotezc3LCAxMCwgMTAwLCA3NywgMTB9LAotezc4LCAxMCwgMTAwLCA3OCwgMTB9LAotezc5LCAxMCwgMTAwLCA3OSwgMTB9LAotezgwLCAxMCwgMTAwLCA4MCwgMTB9LAotezgxLCAxMCwgMTAwLCA4MSwgMTB9LAotezgyLCAxMCwgMTAwLCA4MiwgMTB9LAotezgzLCAxMCwgMTAwLCA4MywgMTB9LAotezg0LCAxMCwgMTAwLCA4NCwgMTB9LAotezg1LCAxMCwgMTAwLCA4NSwgMTB9LAotezg2LCAxMCwgMTAwLCA4NiwgMTB9LAotezg3LCAxMCwgMTAwLCA4NywgMTB9LAotezg4LCAxMCwgMTAwLCA4OCwgMTB9LAotezg5LCAxMCwgMTAwLCA4OSwgMTB9LAotezkwLCAxMCwgMTAwLCA5MCwgMTB9LAotezkxLCAxMCwgMTAwLCA5MCwgMTB9LAotezkyLCAxMCwgMTAwLCA5MCwgMTB9LAotezkzLCAxMCwgMTAwLCA5MCwgMTB9LAotezk0LCAxMCwgMTAwLCA5MCwgMTB9LAotezk1LCAxMCwgMTAwLCA5MCwgMTB9LAotezk2LCAxMCwgMTAwLCA5MCwgMTB9LAotezk3LCAxMCwgMTAwLCA5MCwgMTB9LAotezk4LCAxMCwgMTAwLCA5MCwgMTB9LAotezk5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDQsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA1LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDcsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA4LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTExLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE0LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE3LCAxMCwgMTAwLCA5MCwgMTB9LAotezExOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIwLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIzLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyNCwgMTAsIDEwMCwgOTAsIDEwfSwKLX07Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Njcm9sbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNDdjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbGFibGUKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbGFibGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXNjcm9sbGFibGUuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2xpZW50QXJlYSgpIHsKLQlzY3JvbGxhYmxlLmdldENsaWVudEFyZWEoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3Jpem9udGFsQmFyKCkgewotCXNjcm9sbGFibGUuZ2V0SG9yaXpvbnRhbEJhcigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnRpY2FsQmFyKCkgewotCXNjcm9sbGFibGUuZ2V0VmVydGljYWxCYXIoKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIb3Jpem9udGFsQmFyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRWZXJ0aWNhbEJhciIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDbGllbnRBcmVhIikpIHRlc3RfZ2V0Q2xpZW50QXJlYSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SG9yaXpvbnRhbEJhciIpKSB0ZXN0X2dldEhvcml6b250YWxCYXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFZlcnRpY2FsQmFyIikpIHRlc3RfZ2V0VmVydGljYWxCYXIoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi0JU2Nyb2xsYWJsZSBzY3JvbGxhYmxlOwotCi1wcm90ZWN0ZWQgdm9pZCBzZXRXaWRnZXQoV2lkZ2V0IHcpIHsKLQlzY3JvbGxhYmxlID0gKFNjcm9sbGFibGUpdzsKLQlzdXBlci5zZXRXaWRnZXQodyk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2hlbGwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWI1YTI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EZWNvcmF0aW9ucyB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0ZXN0U2hlbGwgPSBuZXcgU2hlbGwoc2hlbGwsIFNXVC5OVUxMKTsKLQlzZXRXaWRnZXQoc2hlbGwpOwotCWFzc2VydFRydWUodGVzdFNoZWxsLmdldFBhcmVudCgpID09IHNoZWxsKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvcigpIHsKLQlTaGVsbCBuZXdTaGVsbCA9IG5ldyBTaGVsbCgpOwotCWFzc2VydE5vdE51bGwoImE6ICIsIG5ld1NoZWxsLmdldERpc3BsYXkoKSk7Ci0JbmV3U2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9ySSgpIHsKLQkvKiB0aGlzIHNob3VsZCB0ZXN0IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIFNUWUxFIGJpdHMsIGZvciBub3cganVzdCB0ZXN0IGluZGl2aWR1YWwgYml0cyAqLwotCWludFtdIGNhc2VzID0ge1NXVC5OT19UUklNLCBTV1QuUkVTSVpFLCBTV1QuVElUTEUsIFNXVC5DTE9TRSwgU1dULk1FTlUsIFNXVC5NSU4sIFNXVC5CT1JERVIsIAotCQkJCSAgIFNXVC5DTElQX0NISUxEUkVOLCBTV1QuQ0xJUF9TSUJMSU5HUywgU1dULk9OX1RPUCwgU1dULkZMQVQsIFNXVC5TTU9PVEh9OwotCVNoZWxsIG5ld1NoZWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJbmV3U2hlbGwgPSBuZXcgU2hlbGwoY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJhICIgK2ksIG5ld1NoZWxsLmdldERpc3BsYXkoKSA9PSBzaGVsbC5nZXREaXNwbGF5KCkpOwotCQluZXdTaGVsbC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCWFzc2VydFRydWUoImE6ICIsIG5ld1NoZWxsLmdldERpc3BsYXkoKSA9PSBkaXNwbGF5KTsKLQluZXdTaGVsbC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKSB7Ci0JaW50W10gY2FzZXMgPSB7U1dULk5PX1RSSU0sIFNXVC5SRVNJWkUsIFNXVC5USVRMRSwgU1dULkNMT1NFLCBTV1QuTUVOVSwgU1dULk1JTiwgU1dULkJPUkRFUiwgCi0JCQkJICAgU1dULkNMSVBfQ0hJTERSRU4sIFNXVC5DTElQX1NJQkxJTkdTLCBTV1QuT05fVE9QLCBTV1QuRkxBVCwgU1dULlNNT09USH07Ci0JU2hlbGwgbmV3U2hlbGw7Ci0JRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJbmV3U2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJhICIgK2ksIG5ld1NoZWxsLmdldERpc3BsYXkoKSA9PSBzaGVsbC5nZXREaXNwbGF5KCkpOwotCQluZXdTaGVsbC5kaXNwb3NlKCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCkgewotCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKHNoZWxsKTsKLQlhc3NlcnRUcnVlKCJhOiAiLCBuZXdTaGVsbC5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci0JbmV3U2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsSSgpIHsKLQkvKiB0aGlzIHNob3VsZCB0ZXN0IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIFNUWUxFIGJpdHMsIGZvciBub3cganVzdCB0ZXN0IGluZGl2aWR1YWwgYml0cyAqLwotCWludFtdIGNhc2VzID0ge1NXVC5OT19UUklNLCBTV1QuUkVTSVpFLCBTV1QuVElUTEUsIFNXVC5DTE9TRSwgU1dULk1FTlUsIFNXVC5NSU4sIFNXVC5CT1JERVIsIAotCQkJCSAgIFNXVC5DTElQX0NISUxEUkVOLCBTV1QuQ0xJUF9TSUJMSU5HUywgU1dULk9OX1RPUCwgU1dULkZMQVQsIFNXVC5TTU9PVEh9OwotCVNoZWxsIG5ld1NoZWxsOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJbmV3U2hlbGwgPSBuZXcgU2hlbGwoc2hlbGwsIGNhc2VzW2ldKTsKLQkJYXNzZXJ0VHJ1ZSgiYSAiICtpLCBuZXdTaGVsbC5nZXRQYXJlbnQoKSA9PSBzaGVsbCk7Ci0JCW5ld1NoZWxsLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNoZWxsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2hlbGxMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hlbGxDbG9zZWQoU2hlbGxFdmVudCBlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2hlbGxEZWFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBzaGVsbERlaWNvbmlmaWVkKFNoZWxsRXZlbnQgZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIHNoZWxsSWNvbmlmaWVkKFNoZWxsRXZlbnQgZSkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlzaGVsbC5hZGRTaGVsbExpc3RlbmVyKG51bGwpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLQl9Ci0JYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleGNlcHRpb25UaHJvd24pOwotCWV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCXNoZWxsLmFkZFNoZWxsTGlzdGVuZXIobGlzdGVuZXIpOwotCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0JLyogY2FuJ3QgYXNzdW1lIGxpc3RlbmVyIGlzIHN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gZm9yY2VBY3RpdmUgcmV0dXJuZWQgKi8KLQkvKiBhc3NlcnRUcnVlKCI6YToiLCBsaXN0ZW5lckNhbGxlZCA9PSB0cnVlKTsgKi8KLQkKLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwotCXNoZWxsLnJlbW92ZVNoZWxsTGlzdGVuZXIobGlzdGVuZXIpOwotCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0JLyogY2FuJ3QgYXNzdW1lIGxpc3RlbmVyIGlzIHN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gZm9yY2VBY3RpdmUgcmV0dXJuZWQgKi8KLQkvKiBhc3NlcnRUcnVlKCI6YjoiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7ICovCi0JdHJ5IHsKLQkJc2hlbGwucmVtb3ZlU2hlbGxMaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQotCS8vIGJvZ3VzIGxpbmUgdGhhdCAnZW5hYmxlZCcgZ3BmcwotCS8vCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKCk7Ci0JdGVzdFNoZWxsLnNldEJvdW5kcygyMCwzMCwyMDAsIDIwMCk7Ci0JdGVzdFNoZWxsLm9wZW4oKTsKLQl0ZXN0U2hlbGwuY2xvc2UoKTsKLQlzaGVsbC5zZXRCb3VuZHMoMjAsMzAsMjAwLCAyMDApOwotCXNoZWxsLm9wZW4oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kaXNwb3NlKCkgewotCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKCk7Ci0JbmV3U2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ZvcmNlQWN0aXZlKCkgewotCXNoZWxsLmZvcmNlQWN0aXZlKCk7Ci0JLyogY2FuJ3QgYXNzdW1lIGxpc3RlbmVyIGlzIHN5bmNocm9ub3VzbHkgY2FsbGVkIHdoZW4gZm9yY2VBY3RpdmUgcmV0dXJuZWQgKi8KLQkvKiBhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSBzaGVsbCk7ICovCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJvdW5kc0lJSUkgYW5kIHRlc3Rfc2V0Qm91bmRzTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFbmFibGVkKCkgewotCWFzc2VydFRydWUoIjphMDoiLCBzaGVsbC5nZXRFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCWFzc2VydFRydWUoIjphOiIsICFzaGVsbC5nZXRFbmFibGVkKCkpOwotCXNoZWxsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2hlbGwuZ2V0RW5hYmxlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWVJbnB1dE1vZGUoKSB7Ci0JaW50IG1vZGUgPSBzaGVsbC5nZXRJbWVJbnB1dE1vZGUoKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBtb2RlID49IDApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExvY2F0aW9uKCkgewotCXNoZWxsLnNldExvY2F0aW9uKDEwLDE1KTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRMb2NhdGlvbigpLnggPT0gMTApOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsLmdldExvY2F0aW9uKCkueSA9PSAxNSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVnaW9uKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFJlZ2lvbigpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2hlbGwoKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0U2hlbGwoKT09c2hlbGwpOwotCVNoZWxsIHNoZWxsXzEgPSBuZXcgU2hlbGwoc2hlbGwpOwotCWFzc2VydFRydWUoIjpiOiIsIHNoZWxsXzEuZ2V0U2hlbGwoKT09IHNoZWxsXzEpOwotCXNoZWxsXzEuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNoZWxscygpIHsKLQlpbnQgbnVtID0gc2hlbGwuZ2V0U2hlbGxzKCkubGVuZ3RoOwotCWFzc2VydFRydWUoIjphOiIsIG51bSA9PSAxKTsKLQlTaGVsbCBzaGVsbF8xID0gbmV3IFNoZWxsKHNoZWxsKTsKLQludW0gPSBzaGVsbC5nZXRTaGVsbHMoKS5sZW5ndGg7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbnVtID09IDIpOwotCXNoZWxsXzEuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5pc0VuYWJsZWQoKSk7Ci0Jc2hlbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgIXNoZWxsLmlzRW5hYmxlZCgpKTsKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpCi0JCWFzc2VydFRydWUoIjpiMToiLCAhdGVzdFNoZWxsLmlzRW5hYmxlZCgpKTsKLQlzaGVsbC5zZXRFbmFibGVkKHRydWUpOwotCWFzc2VydFRydWUoIjpjOiIsIHNoZWxsLmlzRW5hYmxlZCgpKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotCXRlc3RTaGVsbC5zZXRFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCAhdGVzdFNoZWxsLmlzRW5hYmxlZCgpKTsKLQl0ZXN0U2hlbGwuc2V0RW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXN0U2hlbGwuaXNFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X29wZW4oKSB7Ci0Jc2hlbGwub3BlbigpOwotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHJlbW92ZVNoZWxsTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QWN0aXZlKCkgewotCS8qIENyZWF0ZSBzaGVsbDIgYW5kIG1ha2UgaXQgYWN0aXZlLiAqLwotCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbCgpOwotCXNoZWxsMi5vcGVuKCk7Ci0JCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIHZpc2libGUgc2hlbGwuICovCi0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlzaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJ2aXNpYmxlIHNoZWxsIHdhcyBub3QgbWFkZSBhY3RpdmUiLCBzaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSBzaGVsbCk7Ci0JCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIHZpc2libGUgZGlhbG9nIHNoZWxsLiAqLwotCXNoZWxsMi5zZXRBY3RpdmUoKTsKLQl0ZXN0U2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQl0ZXN0U2hlbGwuc2V0QWN0aXZlKCk7Ci0JYXNzZXJ0VHJ1ZSgidmlzaWJsZSBkaWFsb2cgc2hlbGwgd2FzIG5vdCBtYWRlIGFjdGl2ZSIsIHRlc3RTaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSB0ZXN0U2hlbGwpOwotCQotCS8qIFRlc3Qgc2V0QWN0aXZlIGZvciBub24tdmlzaWJsZSBzaGVsbC4gKi8KLQlzaGVsbDIuc2V0QWN0aXZlKCk7Ci0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0Jc2hlbGwuc2V0QWN0aXZlKCk7Ci0JYXNzZXJ0VHJ1ZSgibm9uLXZpc2libGUgc2hlbGwgd2FzIG1hZGUgYWN0aXZlIiwgc2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgIT0gc2hlbGwpOwotCi0JLyogVGVzdCBzZXRBY3RpdmUgZm9yIG5vbi12aXNpYmxlIGRpYWxvZyBzaGVsbC4gKi8KLQlzaGVsbDIuc2V0QWN0aXZlKCk7Ci0JdGVzdFNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCXRlc3RTaGVsbC5zZXRBY3RpdmUoKTsKLQlhc3NlcnRUcnVlKCJub24tdmlzaWJsZSBkaWFsb2cgc2hlbGwgd2FzIG1hZGUgYWN0aXZlIiwgdGVzdFNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpICE9IHRlc3RTaGVsbCk7Ci0JCi0Jc2hlbGwyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFbmFibGVkWigpIHsKLQkvLyB0ZXN0ZWQgaW4gZ2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWVJbnB1dE1vZGVJKCkgewotCXNoZWxsLnNldEltZUlucHV0TW9kZShTV1QuTk9ORSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2hlbGwuZ2V0SW1lSW5wdXRNb2RlKCkgPT0gU1dULk5PTkUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFZpc2libGVaKCkgewotCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjphOiIsICFzaGVsbC5pc1Zpc2libGUoKSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5pc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luMzJfbmV3TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JLy90aGVzZSBtdXN0IGJlIHJ1biBiZWZvcmUgdGhlIHNoZWxsIHRlc3RzIGJlY2F1c2Ugb2YgcHIgNzk1MDQKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9PcGVuIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGVjb3JhdGlvbnMubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCQotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9ySSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZm9yY2VBY3RpdmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1lSW5wdXRNb2RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVnaW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTaGVsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2hlbGxzIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRBY3RpdmUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVuYWJsZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWVJbnB1dE1vZGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3dpbjMyX25ld0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpOwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvciIpKSB0ZXN0X0NvbnN0cnVjdG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckkiKSkgdGVzdF9Db25zdHJ1Y3RvckkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbCIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NoZWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TaGVsbEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyIikpIHRlc3RfYWRkU2hlbGxMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NoZWxsTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb3NlIikpIHRlc3RfY2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rpc3Bvc2UiKSkgdGVzdF9kaXNwb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9mb3JjZUFjdGl2ZSIpKSB0ZXN0X2ZvcmNlQWN0aXZlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEVuYWJsZWQiKSkgdGVzdF9nZXRFbmFibGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWVJbnB1dE1vZGUiKSkgdGVzdF9nZXRJbWVJbnB1dE1vZGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExvY2F0aW9uIikpIHRlc3RfZ2V0TG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlZ2lvbiIpKSB0ZXN0X2dldFJlZ2lvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGwiKSkgdGVzdF9nZXRTaGVsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2hlbGxzIikpIHRlc3RfZ2V0U2hlbGxzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X29wZW4iKSkgdGVzdF9vcGVuKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTaGVsbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2hlbGxMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNoZWxsTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TaGVsbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBY3RpdmUiKSkgdGVzdF9zZXRBY3RpdmUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltZUlucHV0TW9kZUkiKSkgdGVzdF9zZXRJbWVJbnB1dE1vZGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWdpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlZ2lvbiIpKSB0ZXN0X3NldFJlZ2lvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVnaW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRWaXNpYmxlWiIpKSB0ZXN0X3NldFZpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkiKSkgdGVzdF93aW4zMl9uZXdMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0ljb25pZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9JY29uaWZ5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9DbG9zZSIpKSB0ZXN0X2NvbnNpc3RlbmN5X0Nsb3NlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlIikpIHRlc3RfY29uc2lzdGVuY3lfRGlzcG9zZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfT3BlbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X09wZW4oKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCAoKSB7Ci0JLy8gb3ZlcnJpZGluZyBDb250cm9sLnRlc3RfZ2V0UGFyZW50Ci0JYXNzZXJ0VHJ1ZShzaGVsbC5nZXRQYXJlbnQoKT09bnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0ZXN0U2hlbGwuZ2V0UGFyZW50KCkgPT0gc2hlbGwpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFN0eWxlKCkgewotCS8vIG92ZXJyaWRpbmcgV2lkZ2V0LnRlc3RfZ2V0U3R5bGUKLQlhc3NlcnRUcnVlKCJ0ZXN0U2hlbGwgbm90IG1vZGVsZXNzIiwgKHRlc3RTaGVsbC5nZXRTdHlsZSAoKSAmIFNXVC5NT0RFTEVTUykgPT0gU1dULk1PREVMRVNTKTsKLQlpbnRbXSBjYXNlcyA9IHtTV1QuTU9ERUxFU1MsIFNXVC5QUklNQVJZX01PREFMLCBTV1QuQVBQTElDQVRJT05fTU9EQUwsIFNXVC5TWVNURU1fTU9EQUx9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspIHsKLQkJU2hlbGwgdGVzdFNoZWxsMiA9IG5ldyBTaGVsbChzaGVsbCwgY2FzZXNbaV0pOwotCQlhc3NlcnRUcnVlKCJzaGVsbCAiICsgaSwgKHRlc3RTaGVsbDIuZ2V0U3R5bGUgKCkgJiBjYXNlc1tpXSkgPT0gY2FzZXNbaV0pOwotCQl0ZXN0U2hlbGwyLmRpc3Bvc2UoKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNWaXNpYmxlKCkgewotCS8vIG92ZXJyaWRpbmcgQ29udHJvbC50ZXN0X2lzVmlzaWJsZQotCXRlc3RTaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGVzdFNoZWxsLmlzVmlzaWJsZSgpKTsKLQlzaGVsbC5zZXRWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUoc2hlbGwuaXNWaXNpYmxlKCkpOwotCi0JdGVzdFNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0Jc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCJzaGVsbC5pc1Zpc2libGUoKSBhOiIsIHNoZWxsLmlzVmlzaWJsZSgpKTsKLQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCJzaGVsbC5pc1Zpc2libGUoKSBiOiIsICFzaGVsbC5pc1Zpc2libGUoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKQotCQlhc3NlcnRUcnVlKCJ0ZXN0U2hlbGwuaXNWaXNpYmxlKCkgYzoiLCAhdGVzdFNoZWxsLmlzVmlzaWJsZSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNJSUlJKCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgU2hlbGxzIGhhdmUgYSBtaW5pbXVtIHNpemUKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCb3VuZHNMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQkvLyBvdmVycmlkZGVuIGZyb20gQ29udHJvbCBiZWNhdXNlIFNoZWxscyBoYXZlIGEgbWluaW11bSBzaXplCi0vLwkvKiB3aW5kb3dzICovCi0vLwkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gMTI5MiBvciBwMS55ID4gMTAzNiAqLwotLy8JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotLy8JCVBvaW50IHAxID0gbmV3IFBvaW50KDExMiwgMjcpOwotLy8JCVJlY3RhbmdsZSByMSA9IG5ldyBSZWN0YW5nbGUoMjAsIDMwLCBwMS54LCBwMS55KTsKLS8vCQlSZWN0YW5nbGUgcjI7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMTsgaSsrKSB7Ci0vLwkJCXRlc3RTaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHRlc3RTaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJjaGlsZCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JCXIxID0gbmV3IFJlY3RhbmdsZSgyMCwgMzAsIHAxLngsIHAxLnkpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgewotLy8JCQlzaGVsbC5zZXRCb3VuZHMocjEpOwotLy8JCQlyMiA9IHNoZWxsLmdldEJvdW5kcygpOwotLy8JCQlhc3NlcnQoInBhcmVudCBzaGVsbCBpdGVyYXRpb24gIiArIGkgKyAiIHNldD0iICsgcjEgKyAiIGdldD0iICsgcjIsIHIxLmVxdWFscyhyMikpOwotLy8JCQlyMS53aWR0aCArPSAxMDA7Ci0vLwkJCXIxLmhlaWdodCArPSAxMDA7Ci0vLwkJfQotLy8JfQotLy8JLyogbW90aWYgKi8KLS8vCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbmltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54IDwgMTEyIG9yIHAxLnkgPCAyNyAqLwotLy8JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0vLwlpZiAoU3d0SnVuaXQuaXNNb3RpZikgewotLy8JCVBvaW50IHAxID0gbmV3IFBvaW50KDE1LDM1KTsKLS8vCQlSZWN0YW5nbGUgcjEgPSBuZXcgUmVjdGFuZ2xlKDIwLCAzMCwgcDEueCwgcDEueSk7Ci0vLwkJUmVjdGFuZ2xlIHIyOwotLy8JCQotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgewotLy8JCQl0ZXN0U2hlbGwuc2V0Qm91bmRzKHIxKTsKLS8vCQkJcjIgPSB0ZXN0U2hlbGwuZ2V0Qm91bmRzKCk7Ci0vLwkJCWFzc2VydCgiY2hpbGQgc2hlbGwgaXRlcmF0aW9uICIgKyBpICsgIiBzZXQ9IiArIHIxICsgIiBnZXQ9IiArIHIyLCByMS5lcXVhbHMocjIpKTsKLS8vCQkJcjEud2lkdGggKz0gMTAwOwotLy8JCQlyMS5oZWlnaHQgKz0gMTAwOwotLy8JCX0KLS8vCQlyMSA9IG5ldyBSZWN0YW5nbGUoNTAsIDUwLCBwMS54LCBwMS55KTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKLS8vCQkJc2hlbGwuc2V0Qm91bmRzKHIxKTsKLS8vCQkJcjIgPSBzaGVsbC5nZXRCb3VuZHMoKTsKLS8vCQkJYXNzZXJ0KCJwYXJlbnQgc2hlbGwgaXRlcmF0aW9uICIgKyBpICsgIiBzZXQ9IiArIHIxICsgIiBnZXQ9IiArIHIyLCByMS5lcXVhbHMocjIpKTsKLS8vCQkJcjEud2lkdGggKz0gMTAwOwotLy8JCQlyMS5oZWlnaHQgKz0gMTAwOwotLy8JCX0KLS8vCX0KLX0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVnaW9uKCkgewotCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKCk7Ci0JcmVnaW9uLmFkZChuZXcgUmVjdGFuZ2xlKDEwLCAyMCwgMTAwLCAyMDApKTsKLQkvLyB0ZXN0IHNoZWxsIHdpdGhvdXQgc3R5bGUgU1dULk5PX1RSSU0KLQlhc3NlcnRUcnVlKCI6YToiLCBzaGVsbC5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQlzaGVsbC5zZXRSZWdpb24ocmVnaW9uKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzaGVsbC5nZXRSZWdpb24oKSA9PSBudWxsKTsKLQlzaGVsbC5zZXRSZWdpb24obnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2hlbGwuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci0JLy8gdGVzdCBzaGVsbCB3aXRoIHN0eWxlIFNXVC5OT19UUklNCi0JRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCVNoZWxsIHNoZWxsMiA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuTk9fVFJJTSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2hlbGwyLmdldFJlZ2lvbigpID09IG51bGwpOwotCXNoZWxsMi5zZXRSZWdpb24ocmVnaW9uKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBzaGVsbDIuZ2V0UmVnaW9uKCkuaGFuZGxlID09IHJlZ2lvbi5oYW5kbGUpOwotCXJlZ2lvbi5kaXNwb3NlKCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6Iiwgc2hlbGwyLmdldFJlZ2lvbigpLmlzRGlzcG9zZWQoKSk7Ci0Jc2hlbGwyLnNldFJlZ2lvbihudWxsKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCBzaGVsbDIuZ2V0UmVnaW9uKCkgPT0gbnVsbCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVJSSgpIHsKLQkvKiB3aW5kb3dzICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWluaW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPCAxMTIgb3IgcDEueSA8IDI3ICovCi0JLyogbm90ZSB0aGF0IHRoZXJlIGlzIGEgbWF4aW11bSBzaXplIGZvciBhIHNoZWxsLCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHAxLnggPiAxMjkyIG9yIHAxLnkgPiAxMDM2ICovCi0JaWYgKFN3dEp1bml0LmlzV2luZG93cykgewotCQlQb2ludCBuZXdTaXplID0gbmV3IFBvaW50KDExMiwgMjcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTI5MiwgMTAzNik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZS54LCBuZXdTaXplLnkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci0JCi0JLyogbW90aWYgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8ID8/IG9yIHAxLnkgPCA/PyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gPz8gb3IgcDEueSA+ID8/ICovCi0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgyLCAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplLngsIG5ld1NpemUueSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggKz0gMTAwOwotCQkJbmV3U2l6ZS55ICs9IDEwMDsKLQkJfQotCQluZXdTaXplID0gbmV3IFBvaW50KDE2MDAsIDE2MDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUueCwgbmV3U2l6ZS55KTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCAtPSAxMDA7Ci0JCQluZXdTaXplLnkgLT0gMTAwOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNpemVMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCS8qIHdpbmRvd3MgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8IDExMiBvciBwMS55IDwgMjcgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtYXhpbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA+IDEyOTIgb3IgcDEueSA+IDEwMzYgKi8KLQlpZiAoU3d0SnVuaXQuaXNXaW5kb3dzKSB7Ci0JCVBvaW50IG5ld1NpemUgPSBuZXcgUG9pbnQoMTEyLCAyNyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggKz0gMTAwOwotCQkJbmV3U2l6ZS55ICs9IDEwMDsKLQkJfQotCQluZXdTaXplID0gbmV3IFBvaW50KDEyOTIsIDEwMzYpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCXRlc3RTaGVsbC5zZXRTaXplKG5ld1NpemUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld1NpemUsIHRlc3RTaGVsbC5nZXRTaXplKCkpOwotCQkJbmV3U2l6ZS54IC09IDEwMDsKLQkJCW5ld1NpemUueSAtPSAxMDA7Ci0JCX0KLQl9Ci0JCi0JLyogbW90aWYgKi8KLQkvKiBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgZm9yIGEgc2hlbGwsIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgcDEueCA8ID8/IG9yIHAxLnkgPCA/PyAqLwotCS8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gc2l6ZSBmb3IgYSBzaGVsbCwgdGhpcyB0ZXN0IHdpbGwgZmFpbCBpZiBwMS54ID4gPz8gb3IgcDEueSA+ID8/ICovCi0JaWYgKFN3dEp1bml0LmlzTW90aWYpIHsKLQkJUG9pbnQgbmV3U2l6ZSA9IG5ldyBQb2ludCgyLCAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQl0ZXN0U2hlbGwuc2V0U2l6ZShuZXdTaXplKTsKLQkJCWFzc2VydEVxdWFscyhuZXdTaXplLCB0ZXN0U2hlbGwuZ2V0U2l6ZSgpKTsKLQkJCW5ld1NpemUueCArPSAxMDA7Ci0JCQluZXdTaXplLnkgKz0gMTAwOwotCQl9Ci0JCW5ld1NpemUgPSBuZXcgUG9pbnQoMTYwMCwgMTYwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJdGVzdFNoZWxsLnNldFNpemUobmV3U2l6ZSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3U2l6ZSwgdGVzdFNoZWxsLmdldFNpemUoKSk7Ci0JCQluZXdTaXplLnggLT0gMTAwOwotCQkJbmV3U2l6ZS55IC09IDEwMDsKLQkJfQotCX0KLX0KLQotU2hlbGwgdGVzdFNoZWxsOwotCi1wcml2YXRlIHZvaWQgY3JlYXRlU2hlbGwoKSB7Ci0gICAgdGVhckRvd24oKTsKLSAgICBzaGVsbCA9IG5ldyBTaGVsbCgpOwotICAgIHRlc3RTaGVsbCA9IG5ldyBTaGVsbChzaGVsbCwgU1dULkRJQUxPR19UUklNIHwgU1dULk1JTik7Ci0JdGVzdFNoZWxsLnNldFNpemUoMTAwLDMwMCk7Ci0JdGVzdFNoZWxsLnNldFRleHQoIlNoZWxsIik7Ci0gICAgdGVzdFNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICBzZXRXaWRnZXQodGVzdFNoZWxsKTsKLSAgIAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X09wZW4oKSB7Ci0JaWYgKGZUZXN0Q29uc2lzdGVuY3kpIHsKLQkgICAgY3JlYXRlU2hlbGwoKTsKLQkgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotCSAgICBTdHJpbmdbXSB0ZW1wID0gaG9va0V4cGVjdGVkRXZlbnRzKHRlc3RTaGVsbCwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQkgICAgc2hlbGwucGFjaygpOwotCSAgICBzaGVsbC5vcGVuKCk7Ci0JICAgIHRlc3RTaGVsbC5wYWNrKCk7Ci0JICAgIHRlc3RTaGVsbC5vcGVuKCk7Ci0JICAgIG5ldyBUaHJlYWQoKSB7Ci0JICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFRocmVhZCgpIHsKLQkJCQkgICAgcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSAgICAgICAgc2hlbGwuZGlzcG9zZSgpOwotCQkJCSAgICB9Ci0JCQkJfSk7Ci0JICAgIH19LnN0YXJ0KCk7Ci0JCi0JICAgIHdoaWxlKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkgICAgICAgIGlmKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JICAgIH0KLQkgICAgc2V0VXAoKTsgICAgICAgIAotCSAgICBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1tldmVudHMuc2l6ZSgpXTsKLQkgICAgZXZlbnRzLmNvcHlJbnRvKHJlc3VsdHMpOwotCSAgICBhc3NlcnRFcXVhbHMoZ2V0VGVzdE5hbWUoKSArICIgZXZlbnQgb3JkZXJpbmciLCB0ZW1wLCByZXN1bHRzKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfSWNvbmlmeSgpIHsKLSAgICBjcmVhdGVTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMSwgMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LlNIRUxMX0lDT05JRlksIG51bGwsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9DbG9zZSgpIHsKLSAgICBjcmVhdGVTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgaWYoIVN3dEp1bml0LmlzQ2FyYm9uKQotICAgICAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BTFQsIDAsIFNXVC5GNCwgQ29uc2lzdGVuY3lVdGlsaXR5LkRPVUJMRV9LRVlfUFJFU1MpOwotICAgIGVsc2UKLSAgICAgICAgY29uc2lzdGVuY3lFdmVudCgxMCwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci0gICAgY3JlYXRlU2hlbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EaXNwb3NlKCkgewotICAgIGNyZWF0ZVNoZWxsKCk7Ci0KLSAgICBmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbih0ZXN0U2hlbGwsIFNXVC5QVVNIKTsKLSAgICBidXR0b24uc2V0VGV4dCgiZGlzcG9zZSIpOwotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0gICAgICAgICAgICBidXR0b24uZGlzcG9zZSgpOwotICAgICAgICAgICAgdGVzdFNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwodGVzdFNoZWxsKTsKLSAgICBQb2ludCBwdCA9IGJ1dHRvbi5nZXRMb2NhdGlvbigpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQocHQueCwgcHQueSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotICAgIGNyZWF0ZVNoZWxsKCk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2xpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg4ZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNsaWRlcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2xpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlciBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0Jc2xpZGVyID0gbmV3IFNsaWRlcihzaGVsbCwgMCk7Ci0Jc2V0V2lkZ2V0KHNsaWRlcik7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci1wcm90ZWN0ZWQgU3RyaW5nIHZhbHVlU3RyaW5nKGludFtdIGludEFycmF5KSB7Ci0JcmV0dXJuICIgKCIraW50QXJyYXlbMV0rIiwiK2ludEFycmF5WzJdKyIsIitpbnRBcnJheVszXSsiLCIraW50QXJyYXlbNF0rIikiOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihudWxsLCAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgcGFyZW50ID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JaW50W10gY2FzZXMgPSB7MCwgU1dULkhPUklaT05UQUwsIFNXVC5WRVJUSUNBTH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJc2xpZGVyID0gbmV3IFNsaWRlcihzaGVsbCwgY2FzZXNbaV0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JbGlzdGVuZXJDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJbGlzdGVuZXJDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl9Ci0JfTsKLQl0cnkgewotCQlzbGlkZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0Jc2xpZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQlzbGlkZXIuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydFRydWUoIjphOiIsIGxpc3RlbmVyQ2FsbGVkID09IGZhbHNlKTsKLQlzbGlkZXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXNsaWRlci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JfQotCWFzc2VydFRydWUoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhjZXB0aW9uVGhyb3duKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyBtZXRob2Qgc3VmZmljaWVudCB0ZXN0Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RW5hYmxlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gc2V0RW5hYmxlZCBtZXRob2QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbmNyZW1lbnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCSAgc2xpZGVyLnNldEluY3JlbWVudChjYXNlc1tpXSk7Ci0JICBhc3NlcnRUcnVlKCJjYXNlOiAiICsgU3RyaW5nLnZhbHVlT2YoaSksIHNsaWRlci5nZXRJbmNyZW1lbnQoKT09Y2FzZXNbaV0pOwotCX0gCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWF4aW11bSgpIHsKLQlzbGlkZXIuc2V0TWF4aW11bSgyMDAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwMDApOwotCXNsaWRlci5zZXRNYXhpbXVtKDIwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCBzbGlkZXIuZ2V0TWF4aW11bSgpID09IDIwKTsKLQlzbGlkZXIuc2V0TWF4aW11bSgtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1heGltdW0oMTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNYXhpbXVtKCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldE1pbmltdW0oKSB7Ci0Jc2xpZGVyLnNldE1pbmltdW0oNSk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSA1KTsKLQlzbGlkZXIuc2V0TWluaW11bSgyMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAyMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oLTEpOwotCWFzc2VydFRydWUoIjpjOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMjApOwotCXNsaWRlci5zZXRNaW5pbXVtKDApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMCk7Ci0Jc2xpZGVyLnNldE1pbmltdW0oMTApOwotCWFzc2VydFRydWUoIjpkOiIsIHNsaWRlci5nZXRNaW5pbXVtKCkgPT0gMTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhZ2VJbmNyZW1lbnQoKSB7Ci0JaW50W10gY2FzZXMgPSB7MSwgMTAsIDEwMDAwfTsKLQlmb3IgKGludCBpPTA7IGk8Y2FzZXMubGVuZ3RoOyBpKyspCi0JewotCSAgc2xpZGVyLnNldFBhZ2VJbmNyZW1lbnQoY2FzZXNbaV0pOwotCSAgYXNzZXJ0VHJ1ZSgiY2FzZTogIiArIFN0cmluZy52YWx1ZU9mKGkpLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpPT1jYXNlc1tpXSk7Ci0JfSAKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb24oKSB7Ci0Jc2xpZGVyLnNldFNlbGVjdGlvbigxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6Iiwgc2xpZGVyLmdldFNlbGVjdGlvbigpPT0gMTApOwotCQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRodW1iKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldFRodW1iKCkgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkvLyB0ZXN0ZWQgaW4gYWRkU2VsZWN0aW9uTGlzdGVuZXIgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RW5hYmxlZFooKSB7Ci0Jc2xpZGVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZShzbGlkZXIuZ2V0RW5hYmxlZCgpKTsKLQlzbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKHNsaWRlci5nZXRFbmFibGVkKCksIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbmNyZW1lbnRJKCkgewotCS8vIHRlc3RlZCBpbiBnZXRJbmNyZW1lbnQgbWV0aG9kCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TWF4aW11bUkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0TWF4aW11bVZhbHVlcygpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldE1heGltdW0oaW50QXJyYXlbMF0pOwotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSB2YWx1ZVN0cmluZyhpbnRBcnJheSk7Ci0JCXJlcG9ydCgic2V0TWF4ICIraW50QXJyYXlbMF0rIHZhbHVlU3RyaW5nLCBpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRNaW5pbXVtSSgpIHsKLQotCWludCBbXVtdIHRlc3RWYWx1ZXMgPSBnZXRTZXRNaW5pbXVtVmFsdWVzKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJaW50W10gaW50QXJyYXkgPSB0ZXN0VmFsdWVzW2ldOwotCQlzZXREZWZhdWx0cygpOwotCQlzbGlkZXIuc2V0TWluaW11bShpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRNaW4gIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZywgaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UGFnZUluY3JlbWVudEkoKSB7Ci0JIHNsaWRlci5zZXRQYWdlSW5jcmVtZW50KDMpOwotCSBhc3NlcnRUcnVlKCI6YToiLCBzbGlkZXIuZ2V0UGFnZUluY3JlbWVudCgpPT0gMyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0U2VsZWN0aW9uVmFsdWVzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCWludFtdIGludEFycmF5ID0gdGVzdFZhbHVlc1tpXTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJc2xpZGVyLnNldFNlbGVjdGlvbihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRTZWwgIitpbnRBcnJheVswXSt2YWx1ZVN0cmluZyxpbnRBcnJheVswXSwgaW50QXJyYXlbMV0sIGludEFycmF5WzJdLCBpbnRBcnJheVszXSwgaW50QXJyYXlbNF0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUaHVtYkkoKSB7Ci0KLQlpbnQgW11bXSB0ZXN0VmFsdWVzID0gZ2V0U2V0VGh1bWJWYWx1ZXMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7IGkrKykgewotCQlpbnRbXSBpbnRBcnJheSA9IHRlc3RWYWx1ZXNbaV07Ci0JCXNldERlZmF1bHRzKCk7Ci0JCXNsaWRlci5zZXRUaHVtYihpbnRBcnJheVswXSk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nKGludEFycmF5KTsKLQkJcmVwb3J0KCJzZXRUaG1iICIraW50QXJyYXlbMF0rdmFsdWVTdHJpbmcsaW50QXJyYXlbMF0sIGludEFycmF5WzFdLCBpbnRBcnJheVsyXSwgaW50QXJyYXlbM10sIGludEFycmF5WzRdKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCkgewotCXNsaWRlci5zZXRWYWx1ZXMoMTAsIDEwLCA1MCwgMiwgNSwgMTApOwotCWFzc2VydFRydWUoIjphOiIsIHNsaWRlci5nZXRTZWxlY3Rpb24oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6Iiwgc2xpZGVyLmdldE1pbmltdW0oKSA9PSAxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6Iiwgc2xpZGVyLmdldE1heGltdW0oKSA9PSA1MCk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6Iiwgc2xpZGVyLmdldFRodW1iKCkgPT0gMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6Iiwgc2xpZGVyLmdldEluY3JlbWVudCgpID09IDUpOwotCWFzc2VydFRydWUoIjpmOiIsIHNsaWRlci5nZXRQYWdlSW5jcmVtZW50KCkgPT0gMTApOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1NsaWRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNYXhpbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRNaW5pbXVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYWdlSW5jcmVtZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRodW1iIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRFbmFibGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TWF4aW11bUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldE1pbmltdW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRQYWdlSW5jcmVtZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGh1bWJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRWYWx1ZXNJSUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRFbmFibGVkIikpIHRlc3RfZ2V0RW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW5jcmVtZW50IikpIHRlc3RfZ2V0SW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRNYXhpbXVtIikpIHRlc3RfZ2V0TWF4aW11bSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TWluaW11bSIpKSB0ZXN0X2dldE1pbmltdW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhZ2VJbmNyZW1lbnQiKSkgdGVzdF9nZXRQYWdlSW5jcmVtZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb24iKSkgdGVzdF9nZXRTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRodW1iIikpIHRlc3RfZ2V0VGh1bWIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFbmFibGVkWiIpKSB0ZXN0X3NldEVuYWJsZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbmNyZW1lbnRJIikpIHRlc3Rfc2V0SW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWF4aW11bUkiKSkgdGVzdF9zZXRNYXhpbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0TWluaW11bUkiKSkgdGVzdF9zZXRNaW5pbXVtSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UGFnZUluY3JlbWVudEkiKSkgdGVzdF9zZXRQYWdlSW5jcmVtZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRodW1iSSIpKSB0ZXN0X3NldFRodW1iSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VmFsdWVzSUlJSUlJIikpIHRlc3Rfc2V0VmFsdWVzSUlJSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9BcnJvd1NlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9UaHVtYlNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIHZvaWQgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCkgewotCS8vIG92ZXJyaWRkZW4gZnJvbSBDb250cm9sIGJlY2F1c2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZQotCS8vIHRvIHNldCB0aGUgZm9udCBvZiBhIFNsaWRlci4KLX0KLQotU2xpZGVyIHNsaWRlcjsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgY2FsbCwgaW50IHNldCwgaW50IG1pbkV4cGVjdGVkLCBpbnQgbWF4RXhwZWN0ZWQsIGludCBzZWxlY3Rpb25FeHBlY3RlZCwgaW50IHRodW1iRXhwZWN0ZWQpIHsKLQkvLyBVbmNvbW1lbnQgdGhlc2UgbGluZXMgYW5kIGNvbW1lbnQgb3V0IGNhbGwgdG8gY2hlY2soKSBpZiB5b3Ugd2FudCB0aGUgdGVzdCB0byByZXBvcnQgYWxsIGVycm9ycyB3aXRob3V0Ci0JLy8gc3RvcHBpbmcuCi0vLwlpZiAoc2xpZGVyLmdldE1pbmltdW0oKSAhPSBtaW5FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1pbmltdW0gRXhwZWN0ZWQ6ICIgKyBtaW5FeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRNaW5pbXVtKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRNYXhpbXVtKCkgIT0gbWF4RXhwZWN0ZWQpewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IE1heGltdW0gRXhwZWN0ZWQ6ICIgKyBtYXhFeHBlY3RlZCArICIgIEFjdHVhbDogIiArIHNsaWRlci5nZXRNYXhpbXVtKCkpOwotLy8JfQotLy8JaWYgKHNsaWRlci5nZXRTZWxlY3Rpb24oKSAhPSBzZWxlY3Rpb25FeHBlY3RlZCkgewotLy8JCVN5c3RlbS5vdXQucHJpbnRsbihjYWxsICsgIiA6IFNlbGVjdGlvbiBFeHBlY3RlZDogIiArIHNlbGVjdGlvbkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldFNlbGVjdGlvbigpKTsKLS8vCX0KLS8vCWlmIChzbGlkZXIuZ2V0VGh1bWIoKSAhPSB0aHVtYkV4cGVjdGVkKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKGNhbGwgKyAiIDogVGh1bWIgRXhwZWN0ZWQ6ICIgKyB0aHVtYkV4cGVjdGVkICsgIiAgQWN0dWFsOiAiICsgc2xpZGVyLmdldFRodW1iKCkpOwotLy8JfQotCWNoZWNrKGNhbGwsIG1pbkV4cGVjdGVkLCBtYXhFeHBlY3RlZCwgc2VsZWN0aW9uRXhwZWN0ZWQsIHRodW1iRXhwZWN0ZWQpOwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIGNoZWNrKFN0cmluZyBjYWxsLCBpbnQgbWluRXhwZWN0ZWQsIGludCBtYXhFeHBlY3RlZCwgaW50IHNlbGVjdGlvbkV4cGVjdGVkLCBpbnQgdGh1bWJFeHBlY3RlZCkgewotCWFzc2VydEVxdWFscyhjYWxsKyIgbWF4ICIsIG1heEV4cGVjdGVkLCBzbGlkZXIuZ2V0TWF4aW11bSgpKTsKLQlhc3NlcnRFcXVhbHMoY2FsbCsiIG1pbiAiLCBtaW5FeHBlY3RlZCwgc2xpZGVyLmdldE1pbmltdW0oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiBzZWwgIiwgc2VsZWN0aW9uRXhwZWN0ZWQsIHNsaWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKGNhbGwrIiB0aG1iICIsIHRodW1iRXhwZWN0ZWQsIHNsaWRlci5nZXRUaHVtYigpKTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRUaHVtYlZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTksIDEwLCAxMDAsIDUwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxMCwgMTAwLCA1MCwgMX0sCi17MiwgMTAsIDEwMCwgNTAsIDJ9LAotezMsIDEwLCAxMDAsIDUwLCAzfSwKLXs0LCAxMCwgMTAwLCA1MCwgNH0sCi17NSwgMTAsIDEwMCwgNTAsIDV9LAotezYsIDEwLCAxMDAsIDUwLCA2fSwKLXs3LCAxMCwgMTAwLCA1MCwgN30sCi17OCwgMTAsIDEwMCwgNTAsIDh9LAotezksIDEwLCAxMDAsIDUwLCA5fSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgNTAsIDExfSwKLXsxMiwgMTAsIDEwMCwgNTAsIDEyfSwKLXsxMywgMTAsIDEwMCwgNTAsIDEzfSwKLXsxNCwgMTAsIDEwMCwgNTAsIDE0fSwKLXsxNSwgMTAsIDEwMCwgNTAsIDE1fSwKLXsxNiwgMTAsIDEwMCwgNTAsIDE2fSwKLXsxNywgMTAsIDEwMCwgNTAsIDE3fSwKLXsxOCwgMTAsIDEwMCwgNTAsIDE4fSwKLXsxOSwgMTAsIDEwMCwgNTAsIDE5fSwKLXsyMCwgMTAsIDEwMCwgNTAsIDIwfSwKLXsyMSwgMTAsIDEwMCwgNTAsIDIxfSwKLXsyMiwgMTAsIDEwMCwgNTAsIDIyfSwKLXsyMywgMTAsIDEwMCwgNTAsIDIzfSwKLXsyNCwgMTAsIDEwMCwgNTAsIDI0fSwKLXsyNSwgMTAsIDEwMCwgNTAsIDI1fSwKLXsyNiwgMTAsIDEwMCwgNTAsIDI2fSwKLXsyNywgMTAsIDEwMCwgNTAsIDI3fSwKLXsyOCwgMTAsIDEwMCwgNTAsIDI4fSwKLXsyOSwgMTAsIDEwMCwgNTAsIDI5fSwKLXszMCwgMTAsIDEwMCwgNTAsIDMwfSwKLXszMSwgMTAsIDEwMCwgNTAsIDMxfSwKLXszMiwgMTAsIDEwMCwgNTAsIDMyfSwKLXszMywgMTAsIDEwMCwgNTAsIDMzfSwKLXszNCwgMTAsIDEwMCwgNTAsIDM0fSwKLXszNSwgMTAsIDEwMCwgNTAsIDM1fSwKLXszNiwgMTAsIDEwMCwgNTAsIDM2fSwKLXszNywgMTAsIDEwMCwgNTAsIDM3fSwKLXszOCwgMTAsIDEwMCwgNTAsIDM4fSwKLXszOSwgMTAsIDEwMCwgNTAsIDM5fSwKLXs0MCwgMTAsIDEwMCwgNTAsIDQwfSwKLXs0MSwgMTAsIDEwMCwgNTAsIDQxfSwKLXs0MiwgMTAsIDEwMCwgNTAsIDQyfSwKLXs0MywgMTAsIDEwMCwgNTAsIDQzfSwKLXs0NCwgMTAsIDEwMCwgNTAsIDQ0fSwKLXs0NSwgMTAsIDEwMCwgNTAsIDQ1fSwKLXs0NiwgMTAsIDEwMCwgNTAsIDQ2fSwKLXs0NywgMTAsIDEwMCwgNTAsIDQ3fSwKLXs0OCwgMTAsIDEwMCwgNTAsIDQ4fSwKLXs0OSwgMTAsIDEwMCwgNTAsIDQ5fSwKLXs1MCwgMTAsIDEwMCwgNTAsIDUwfSwKLXs1MSwgMTAsIDEwMCwgNDksIDUxfSwKLXs1MiwgMTAsIDEwMCwgNDgsIDUyfSwKLXs1MywgMTAsIDEwMCwgNDcsIDUzfSwKLXs1NCwgMTAsIDEwMCwgNDYsIDU0fSwKLXs1NSwgMTAsIDEwMCwgNDUsIDU1fSwKLXs1NiwgMTAsIDEwMCwgNDQsIDU2fSwKLXs1NywgMTAsIDEwMCwgNDMsIDU3fSwKLXs1OCwgMTAsIDEwMCwgNDIsIDU4fSwKLXs1OSwgMTAsIDEwMCwgNDEsIDU5fSwKLXs2MCwgMTAsIDEwMCwgNDAsIDYwfSwKLXs2MSwgMTAsIDEwMCwgMzksIDYxfSwKLXs2MiwgMTAsIDEwMCwgMzgsIDYyfSwKLXs2MywgMTAsIDEwMCwgMzcsIDYzfSwKLXs2NCwgMTAsIDEwMCwgMzYsIDY0fSwKLXs2NSwgMTAsIDEwMCwgMzUsIDY1fSwKLXs2NiwgMTAsIDEwMCwgMzQsIDY2fSwKLXs2NywgMTAsIDEwMCwgMzMsIDY3fSwKLXs2OCwgMTAsIDEwMCwgMzIsIDY4fSwKLXs2OSwgMTAsIDEwMCwgMzEsIDY5fSwKLXs3MCwgMTAsIDEwMCwgMzAsIDcwfSwKLXs3MSwgMTAsIDEwMCwgMjksIDcxfSwKLXs3MiwgMTAsIDEwMCwgMjgsIDcyfSwKLXs3MywgMTAsIDEwMCwgMjcsIDczfSwKLXs3NCwgMTAsIDEwMCwgMjYsIDc0fSwKLXs3NSwgMTAsIDEwMCwgMjUsIDc1fSwKLXs3NiwgMTAsIDEwMCwgMjQsIDc2fSwKLXs3NywgMTAsIDEwMCwgMjMsIDc3fSwKLXs3OCwgMTAsIDEwMCwgMjIsIDc4fSwKLXs3OSwgMTAsIDEwMCwgMjEsIDc5fSwKLXs4MCwgMTAsIDEwMCwgMjAsIDgwfSwKLXs4MSwgMTAsIDEwMCwgMTksIDgxfSwKLXs4MiwgMTAsIDEwMCwgMTgsIDgyfSwKLXs4MywgMTAsIDEwMCwgMTcsIDgzfSwKLXs4NCwgMTAsIDEwMCwgMTYsIDg0fSwKLXs4NSwgMTAsIDEwMCwgMTUsIDg1fSwKLXs4NiwgMTAsIDEwMCwgMTQsIDg2fSwKLXs4NywgMTAsIDEwMCwgMTMsIDg3fSwKLXs4OCwgMTAsIDEwMCwgMTIsIDg4fSwKLXs4OSwgMTAsIDEwMCwgMTEsIDg5fSwKLXs5MCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5MywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NSwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NiwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5NywgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OCwgMTAsIDEwMCwgMTAsIDkwfSwKLXs5OSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDAsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTAxLCAxMCwgMTAwLCAxMCwgOTB9LAotezEwMiwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDMsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA0LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwNSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDYsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTA3LCAxMCwgMTAwLCAxMCwgOTB9LAotezEwOCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMDksIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEwLCAxMCwgMTAwLCAxMCwgOTB9LAotezExMSwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTIsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTEzLCAxMCwgMTAwLCAxMCwgOTB9LAotezExNCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTUsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE2LCAxMCwgMTAwLCAxMCwgOTB9LAotezExNywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMTgsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTE5LCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMCwgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjEsIDEwLCAxMDAsIDEwLCA5MH0sCi17MTIyLCAxMCwgMTAwLCAxMCwgOTB9LAotezEyMywgMTAsIDEwMCwgMTAsIDkwfSwKLXsxMjQsIDEwLCAxMDAsIDEwLCA5MH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldE1pbmltdW1WYWx1ZXMoKSB7Ci1yZXR1cm4gbmV3IGludFtdW10gewotey0xNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEzLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTEwLCAxMCwgMTAwLCA1MCwgMTB9LAotey05LCAxMCwgMTAwLCA1MCwgMTB9LAotey04LCAxMCwgMTAwLCA1MCwgMTB9LAotey03LCAxMCwgMTAwLCA1MCwgMTB9LAotey02LCAxMCwgMTAwLCA1MCwgMTB9LAotey01LCAxMCwgMTAwLCA1MCwgMTB9LAotey00LCAxMCwgMTAwLCA1MCwgMTB9LAotey0zLCAxMCwgMTAwLCA1MCwgMTB9LAotey0yLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xLCAxMCwgMTAwLCA1MCwgMTB9LAotezAsIDAsIDEwMCwgNTAsIDEwfSwKLXsxLCAxLCAxMDAsIDUwLCAxMH0sCi17MiwgMiwgMTAwLCA1MCwgMTB9LAotezMsIDMsIDEwMCwgNTAsIDEwfSwKLXs0LCA0LCAxMDAsIDUwLCAxMH0sCi17NSwgNSwgMTAwLCA1MCwgMTB9LAotezYsIDYsIDEwMCwgNTAsIDEwfSwKLXs3LCA3LCAxMDAsIDUwLCAxMH0sCi17OCwgOCwgMTAwLCA1MCwgMTB9LAotezksIDksIDEwMCwgNTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMSwgMTEsIDEwMCwgNTAsIDEwfSwKLXsxMiwgMTIsIDEwMCwgNTAsIDEwfSwKLXsxMywgMTMsIDEwMCwgNTAsIDEwfSwKLXsxNCwgMTQsIDEwMCwgNTAsIDEwfSwKLXsxNSwgMTUsIDEwMCwgNTAsIDEwfSwKLXsxNiwgMTYsIDEwMCwgNTAsIDEwfSwKLXsxNywgMTcsIDEwMCwgNTAsIDEwfSwKLXsxOCwgMTgsIDEwMCwgNTAsIDEwfSwKLXsxOSwgMTksIDEwMCwgNTAsIDEwfSwKLXsyMCwgMjAsIDEwMCwgNTAsIDEwfSwKLXsyMSwgMjEsIDEwMCwgNTAsIDEwfSwKLXsyMiwgMjIsIDEwMCwgNTAsIDEwfSwKLXsyMywgMjMsIDEwMCwgNTAsIDEwfSwKLXsyNCwgMjQsIDEwMCwgNTAsIDEwfSwKLXsyNSwgMjUsIDEwMCwgNTAsIDEwfSwKLXsyNiwgMjYsIDEwMCwgNTAsIDEwfSwKLXsyNywgMjcsIDEwMCwgNTAsIDEwfSwKLXsyOCwgMjgsIDEwMCwgNTAsIDEwfSwKLXsyOSwgMjksIDEwMCwgNTAsIDEwfSwKLXszMCwgMzAsIDEwMCwgNTAsIDEwfSwKLXszMSwgMzEsIDEwMCwgNTAsIDEwfSwKLXszMiwgMzIsIDEwMCwgNTAsIDEwfSwKLXszMywgMzMsIDEwMCwgNTAsIDEwfSwKLXszNCwgMzQsIDEwMCwgNTAsIDEwfSwKLXszNSwgMzUsIDEwMCwgNTAsIDEwfSwKLXszNiwgMzYsIDEwMCwgNTAsIDEwfSwKLXszNywgMzcsIDEwMCwgNTAsIDEwfSwKLXszOCwgMzgsIDEwMCwgNTAsIDEwfSwKLXszOSwgMzksIDEwMCwgNTAsIDEwfSwKLXs0MCwgNDAsIDEwMCwgNTAsIDEwfSwKLXs0MSwgNDEsIDEwMCwgNTAsIDEwfSwKLXs0MiwgNDIsIDEwMCwgNTAsIDEwfSwKLXs0MywgNDMsIDEwMCwgNTAsIDEwfSwKLXs0NCwgNDQsIDEwMCwgNTAsIDEwfSwKLXs0NSwgNDUsIDEwMCwgNTAsIDEwfSwKLXs0NiwgNDYsIDEwMCwgNTAsIDEwfSwKLXs0NywgNDcsIDEwMCwgNTAsIDEwfSwKLXs0OCwgNDgsIDEwMCwgNTAsIDEwfSwKLXs0OSwgNDksIDEwMCwgNTAsIDEwfSwKLXs1MCwgNTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgNTEsIDEwMCwgNTEsIDEwfSwKLXs1MiwgNTIsIDEwMCwgNTIsIDEwfSwKLXs1MywgNTMsIDEwMCwgNTMsIDEwfSwKLXs1NCwgNTQsIDEwMCwgNTQsIDEwfSwKLXs1NSwgNTUsIDEwMCwgNTUsIDEwfSwKLXs1NiwgNTYsIDEwMCwgNTYsIDEwfSwKLXs1NywgNTcsIDEwMCwgNTcsIDEwfSwKLXs1OCwgNTgsIDEwMCwgNTgsIDEwfSwKLXs1OSwgNTksIDEwMCwgNTksIDEwfSwKLXs2MCwgNjAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgNjEsIDEwMCwgNjEsIDEwfSwKLXs2MiwgNjIsIDEwMCwgNjIsIDEwfSwKLXs2MywgNjMsIDEwMCwgNjMsIDEwfSwKLXs2NCwgNjQsIDEwMCwgNjQsIDEwfSwKLXs2NSwgNjUsIDEwMCwgNjUsIDEwfSwKLXs2NiwgNjYsIDEwMCwgNjYsIDEwfSwKLXs2NywgNjcsIDEwMCwgNjcsIDEwfSwKLXs2OCwgNjgsIDEwMCwgNjgsIDEwfSwKLXs2OSwgNjksIDEwMCwgNjksIDEwfSwKLXs3MCwgNzAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgNzEsIDEwMCwgNzEsIDEwfSwKLXs3MiwgNzIsIDEwMCwgNzIsIDEwfSwKLXs3MywgNzMsIDEwMCwgNzMsIDEwfSwKLXs3NCwgNzQsIDEwMCwgNzQsIDEwfSwKLXs3NSwgNzUsIDEwMCwgNzUsIDEwfSwKLXs3NiwgNzYsIDEwMCwgNzYsIDEwfSwKLXs3NywgNzcsIDEwMCwgNzcsIDEwfSwKLXs3OCwgNzgsIDEwMCwgNzgsIDEwfSwKLXs3OSwgNzksIDEwMCwgNzksIDEwfSwKLXs4MCwgODAsIDEwMCwgODAsIDEwfSwKLXs4MSwgODEsIDEwMCwgODEsIDEwfSwKLXs4MiwgODIsIDEwMCwgODIsIDEwfSwKLXs4MywgODMsIDEwMCwgODMsIDEwfSwKLXs4NCwgODQsIDEwMCwgODQsIDEwfSwKLXs4NSwgODUsIDEwMCwgODUsIDEwfSwKLXs4NiwgODYsIDEwMCwgODYsIDEwfSwKLXs4NywgODcsIDEwMCwgODcsIDEwfSwKLXs4OCwgODgsIDEwMCwgODgsIDEwfSwKLXs4OSwgODksIDEwMCwgODksIDEwfSwKLXs5MCwgOTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgOTEsIDEwMCwgOTEsIDl9LAotezkyLCA5MiwgMTAwLCA5MiwgOH0sCi17OTMsIDkzLCAxMDAsIDkzLCA3fSwKLXs5NCwgOTQsIDEwMCwgOTQsIDZ9LAotezk1LCA5NSwgMTAwLCA5NSwgNX0sCi17OTYsIDk2LCAxMDAsIDk2LCA0fSwKLXs5NywgOTcsIDEwMCwgOTcsIDN9LAotezk4LCA5OCwgMTAwLCA5OCwgMn0sCi17OTksIDk5LCAxMDAsIDk5LCAxfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sIAotezEwMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDIsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAzLCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDUsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA2LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwNywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMDgsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTA5LCAxMCwgMTAwLCA1MCwgMTB9LAotezExMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTEyLCAxMCwgMTAwLCA1MCwgMTB9LAotezExMywgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTQsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE1LCAxMCwgMTAwLCA1MCwgMTB9LAotezExNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMTcsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTE4LCAxMCwgMTAwLCA1MCwgMTB9LAotezExOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTIxLCAxMCwgMTAwLCA1MCwgMTB9LAotezEyMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXsxMjMsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTI0LCAxMCwgMTAwLCA1MCwgMTB9LAotfTsKLX0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgaW50W11bXSBnZXRTZXRNYXhpbXVtVmFsdWVzKCkgewotcmV0dXJuIG5ldyBpbnRbXVtdIHsKLXstMTUsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTE0LCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMTIsIDEwLCAxMDAsIDUwLCAxMH0sCi17LTExLCAxMCwgMTAwLCA1MCwgMTB9LAotey0xMCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstOCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNywgMTAsIDEwMCwgNTAsIDEwfSwKLXstNiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNSwgMTAsIDEwMCwgNTAsIDEwfSwKLXstNCwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMywgMTAsIDEwMCwgNTAsIDEwfSwKLXstMiwgMTAsIDEwMCwgNTAsIDEwfSwKLXstMSwgMTAsIDEwMCwgNTAsIDEwfSwKLXswLCAxMCwgMTAwLCA1MCwgMTB9LAotezEsIDEwLCAxMDAsIDUwLCAxMH0sCi17MiwgMTAsIDEwMCwgNTAsIDEwfSwKLXszLCAxMCwgMTAwLCA1MCwgMTB9LAotezQsIDEwLCAxMDAsIDUwLCAxMH0sCi17NSwgMTAsIDEwMCwgNTAsIDEwfSwKLXs2LCAxMCwgMTAwLCA1MCwgMTB9LAotezcsIDEwLCAxMDAsIDUwLCAxMH0sCi17OCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs5LCAxMCwgMTAwLCA1MCwgMTB9LAotezEwLCAxMCwgMTAwLCA1MCwgMTB9LAotezExLCAxMCwgMTEsIDEwLCAxfSwKLXsxMiwgMTAsIDEyLCAxMCwgMn0sCi17MTMsIDEwLCAxMywgMTAsIDN9LAotezE0LCAxMCwgMTQsIDEwLCA0fSwKLXsxNSwgMTAsIDE1LCAxMCwgNX0sCi17MTYsIDEwLCAxNiwgMTAsIDZ9LAotezE3LCAxMCwgMTcsIDEwLCA3fSwKLXsxOCwgMTAsIDE4LCAxMCwgOH0sCi17MTksIDEwLCAxOSwgMTAsIDl9LAotezIwLCAxMCwgMjAsIDEwLCAxMH0sCi17MjEsIDEwLCAyMSwgMTEsIDEwfSwKLXsyMiwgMTAsIDIyLCAxMiwgMTB9LAotezIzLCAxMCwgMjMsIDEzLCAxMH0sCi17MjQsIDEwLCAyNCwgMTQsIDEwfSwKLXsyNSwgMTAsIDI1LCAxNSwgMTB9LAotezI2LCAxMCwgMjYsIDE2LCAxMH0sCi17MjcsIDEwLCAyNywgMTcsIDEwfSwKLXsyOCwgMTAsIDI4LCAxOCwgMTB9LAotezI5LCAxMCwgMjksIDE5LCAxMH0sCi17MzAsIDEwLCAzMCwgMjAsIDEwfSwKLXszMSwgMTAsIDMxLCAyMSwgMTB9LAotezMyLCAxMCwgMzIsIDIyLCAxMH0sCi17MzMsIDEwLCAzMywgMjMsIDEwfSwKLXszNCwgMTAsIDM0LCAyNCwgMTB9LAotezM1LCAxMCwgMzUsIDI1LCAxMH0sCi17MzYsIDEwLCAzNiwgMjYsIDEwfSwKLXszNywgMTAsIDM3LCAyNywgMTB9LAotezM4LCAxMCwgMzgsIDI4LCAxMH0sCi17MzksIDEwLCAzOSwgMjksIDEwfSwKLXs0MCwgMTAsIDQwLCAzMCwgMTB9LAotezQxLCAxMCwgNDEsIDMxLCAxMH0sCi17NDIsIDEwLCA0MiwgMzIsIDEwfSwKLXs0MywgMTAsIDQzLCAzMywgMTB9LAotezQ0LCAxMCwgNDQsIDM0LCAxMH0sCi17NDUsIDEwLCA0NSwgMzUsIDEwfSwKLXs0NiwgMTAsIDQ2LCAzNiwgMTB9LAotezQ3LCAxMCwgNDcsIDM3LCAxMH0sCi17NDgsIDEwLCA0OCwgMzgsIDEwfSwKLXs0OSwgMTAsIDQ5LCAzOSwgMTB9LAotezUwLCAxMCwgNTAsIDQwLCAxMH0sCi17NTEsIDEwLCA1MSwgNDEsIDEwfSwKLXs1MiwgMTAsIDUyLCA0MiwgMTB9LAotezUzLCAxMCwgNTMsIDQzLCAxMH0sCi17NTQsIDEwLCA1NCwgNDQsIDEwfSwKLXs1NSwgMTAsIDU1LCA0NSwgMTB9LAotezU2LCAxMCwgNTYsIDQ2LCAxMH0sCi17NTcsIDEwLCA1NywgNDcsIDEwfSwKLXs1OCwgMTAsIDU4LCA0OCwgMTB9LAotezU5LCAxMCwgNTksIDQ5LCAxMH0sCi17NjAsIDEwLCA2MCwgNTAsIDEwfSwKLXs2MSwgMTAsIDYxLCA1MCwgMTB9LAotezYyLCAxMCwgNjIsIDUwLCAxMH0sCi17NjMsIDEwLCA2MywgNTAsIDEwfSwKLXs2NCwgMTAsIDY0LCA1MCwgMTB9LAotezY1LCAxMCwgNjUsIDUwLCAxMH0sCi17NjYsIDEwLCA2NiwgNTAsIDEwfSwKLXs2NywgMTAsIDY3LCA1MCwgMTB9LAotezY4LCAxMCwgNjgsIDUwLCAxMH0sCi17NjksIDEwLCA2OSwgNTAsIDEwfSwKLXs3MCwgMTAsIDcwLCA1MCwgMTB9LAotezcxLCAxMCwgNzEsIDUwLCAxMH0sCi17NzIsIDEwLCA3MiwgNTAsIDEwfSwKLXs3MywgMTAsIDczLCA1MCwgMTB9LAotezc0LCAxMCwgNzQsIDUwLCAxMH0sCi17NzUsIDEwLCA3NSwgNTAsIDEwfSwKLXs3NiwgMTAsIDc2LCA1MCwgMTB9LAotezc3LCAxMCwgNzcsIDUwLCAxMH0sCi17NzgsIDEwLCA3OCwgNTAsIDEwfSwKLXs3OSwgMTAsIDc5LCA1MCwgMTB9LAotezgwLCAxMCwgODAsIDUwLCAxMH0sCi17ODEsIDEwLCA4MSwgNTAsIDEwfSwKLXs4MiwgMTAsIDgyLCA1MCwgMTB9LAotezgzLCAxMCwgODMsIDUwLCAxMH0sCi17ODQsIDEwLCA4NCwgNTAsIDEwfSwKLXs4NSwgMTAsIDg1LCA1MCwgMTB9LAotezg2LCAxMCwgODYsIDUwLCAxMH0sCi17ODcsIDEwLCA4NywgNTAsIDEwfSwKLXs4OCwgMTAsIDg4LCA1MCwgMTB9LAotezg5LCAxMCwgODksIDUwLCAxMH0sCi17OTAsIDEwLCA5MCwgNTAsIDEwfSwKLXs5MSwgMTAsIDkxLCA1MCwgMTB9LAotezkyLCAxMCwgOTIsIDUwLCAxMH0sCi17OTMsIDEwLCA5MywgNTAsIDEwfSwKLXs5NCwgMTAsIDk0LCA1MCwgMTB9LAotezk1LCAxMCwgOTUsIDUwLCAxMH0sCi17OTYsIDEwLCA5NiwgNTAsIDEwfSwKLXs5NywgMTAsIDk3LCA1MCwgMTB9LAotezk4LCAxMCwgOTgsIDUwLCAxMH0sCi17OTksIDEwLCA5OSwgNTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDUwLCAxMH0sCi17MTAxLCAxMCwgMTAxLCA1MCwgMTB9LAotezEwMiwgMTAsIDEwMiwgNTAsIDEwfSwKLXsxMDMsIDEwLCAxMDMsIDUwLCAxMH0sCi17MTA0LCAxMCwgMTA0LCA1MCwgMTB9LAotezEwNSwgMTAsIDEwNSwgNTAsIDEwfSwKLXsxMDYsIDEwLCAxMDYsIDUwLCAxMH0sCi17MTA3LCAxMCwgMTA3LCA1MCwgMTB9LAotezEwOCwgMTAsIDEwOCwgNTAsIDEwfSwKLXsxMDksIDEwLCAxMDksIDUwLCAxMH0sCi17MTEwLCAxMCwgMTEwLCA1MCwgMTB9LAotezExMSwgMTAsIDExMSwgNTAsIDEwfSwKLXsxMTIsIDEwLCAxMTIsIDUwLCAxMH0sCi17MTEzLCAxMCwgMTEzLCA1MCwgMTB9LAotezExNCwgMTAsIDExNCwgNTAsIDEwfSwKLXsxMTUsIDEwLCAxMTUsIDUwLCAxMH0sCi17MTE2LCAxMCwgMTE2LCA1MCwgMTB9LAotezExNywgMTAsIDExNywgNTAsIDEwfSwKLXsxMTgsIDEwLCAxMTgsIDUwLCAxMH0sCi17MTE5LCAxMCwgMTE5LCA1MCwgMTB9LAotezEyMCwgMTAsIDEyMCwgNTAsIDEwfSwKLXsxMjEsIDEwLCAxMjEsIDUwLCAxMH0sCi17MTIyLCAxMCwgMTIyLCA1MCwgMTB9LAotezEyMywgMTAsIDEyMywgNTAsIDEwfSwKLXsxMjQsIDEwLCAxMjQsIDUwLCAxMH0sCi19OwotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotCi0Jc2xpZGVyLnNldE1heGltdW0oMTAwKTsKLQlzbGlkZXIuc2V0TWluaW11bSgxMCk7Ci0Jc2xpZGVyLnNldFRodW1iKDEwKTsKLQlzbGlkZXIuc2V0U2VsZWN0aW9uKDUwKTsKLQotfQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSBpbnRbXVtdIGdldFNldFNlbGVjdGlvblZhbHVlcygpIHsKLXJldHVybiBuZXcgaW50W11bXSB7Ci17LTE1LCAxMCwgMTAwLCAxMCwgMTB9LAotey0xNCwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEyLCAxMCwgMTAwLCAxMCwgMTB9LAotey0xMSwgMTAsIDEwMCwgMTAsIDEwfSwKLXstMTAsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTksIDEwLCAxMDAsIDEwLCAxMH0sCi17LTgsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTcsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTYsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTUsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTQsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTMsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTIsIDEwLCAxMDAsIDEwLCAxMH0sCi17LTEsIDEwLCAxMDAsIDEwLCAxMH0sCi17MCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxLCAxMCwgMTAwLCAxMCwgMTB9LAotezIsIDEwLCAxMDAsIDEwLCAxMH0sCi17MywgMTAsIDEwMCwgMTAsIDEwfSwKLXs0LCAxMCwgMTAwLCAxMCwgMTB9LAotezUsIDEwLCAxMDAsIDEwLCAxMH0sCi17NiwgMTAsIDEwMCwgMTAsIDEwfSwKLXs3LCAxMCwgMTAwLCAxMCwgMTB9LAotezgsIDEwLCAxMDAsIDEwLCAxMH0sCi17OSwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMCwgMTAsIDEwMCwgMTAsIDEwfSwKLXsxMSwgMTAsIDEwMCwgMTEsIDEwfSwKLXsxMiwgMTAsIDEwMCwgMTIsIDEwfSwKLXsxMywgMTAsIDEwMCwgMTMsIDEwfSwKLXsxNCwgMTAsIDEwMCwgMTQsIDEwfSwKLXsxNSwgMTAsIDEwMCwgMTUsIDEwfSwKLXsxNiwgMTAsIDEwMCwgMTYsIDEwfSwKLXsxNywgMTAsIDEwMCwgMTcsIDEwfSwKLXsxOCwgMTAsIDEwMCwgMTgsIDEwfSwKLXsxOSwgMTAsIDEwMCwgMTksIDEwfSwKLXsyMCwgMTAsIDEwMCwgMjAsIDEwfSwKLXsyMSwgMTAsIDEwMCwgMjEsIDEwfSwKLXsyMiwgMTAsIDEwMCwgMjIsIDEwfSwKLXsyMywgMTAsIDEwMCwgMjMsIDEwfSwKLXsyNCwgMTAsIDEwMCwgMjQsIDEwfSwKLXsyNSwgMTAsIDEwMCwgMjUsIDEwfSwKLXsyNiwgMTAsIDEwMCwgMjYsIDEwfSwKLXsyNywgMTAsIDEwMCwgMjcsIDEwfSwKLXsyOCwgMTAsIDEwMCwgMjgsIDEwfSwKLXsyOSwgMTAsIDEwMCwgMjksIDEwfSwKLXszMCwgMTAsIDEwMCwgMzAsIDEwfSwKLXszMSwgMTAsIDEwMCwgMzEsIDEwfSwKLXszMiwgMTAsIDEwMCwgMzIsIDEwfSwKLXszMywgMTAsIDEwMCwgMzMsIDEwfSwKLXszNCwgMTAsIDEwMCwgMzQsIDEwfSwKLXszNSwgMTAsIDEwMCwgMzUsIDEwfSwKLXszNiwgMTAsIDEwMCwgMzYsIDEwfSwKLXszNywgMTAsIDEwMCwgMzcsIDEwfSwKLXszOCwgMTAsIDEwMCwgMzgsIDEwfSwKLXszOSwgMTAsIDEwMCwgMzksIDEwfSwKLXs0MCwgMTAsIDEwMCwgNDAsIDEwfSwKLXs0MSwgMTAsIDEwMCwgNDEsIDEwfSwKLXs0MiwgMTAsIDEwMCwgNDIsIDEwfSwKLXs0MywgMTAsIDEwMCwgNDMsIDEwfSwKLXs0NCwgMTAsIDEwMCwgNDQsIDEwfSwKLXs0NSwgMTAsIDEwMCwgNDUsIDEwfSwKLXs0NiwgMTAsIDEwMCwgNDYsIDEwfSwKLXs0NywgMTAsIDEwMCwgNDcsIDEwfSwKLXs0OCwgMTAsIDEwMCwgNDgsIDEwfSwKLXs0OSwgMTAsIDEwMCwgNDksIDEwfSwKLXs1MCwgMTAsIDEwMCwgNTAsIDEwfSwKLXs1MSwgMTAsIDEwMCwgNTEsIDEwfSwKLXs1MiwgMTAsIDEwMCwgNTIsIDEwfSwKLXs1MywgMTAsIDEwMCwgNTMsIDEwfSwKLXs1NCwgMTAsIDEwMCwgNTQsIDEwfSwKLXs1NSwgMTAsIDEwMCwgNTUsIDEwfSwKLXs1NiwgMTAsIDEwMCwgNTYsIDEwfSwKLXs1NywgMTAsIDEwMCwgNTcsIDEwfSwKLXs1OCwgMTAsIDEwMCwgNTgsIDEwfSwKLXs1OSwgMTAsIDEwMCwgNTksIDEwfSwKLXs2MCwgMTAsIDEwMCwgNjAsIDEwfSwKLXs2MSwgMTAsIDEwMCwgNjEsIDEwfSwKLXs2MiwgMTAsIDEwMCwgNjIsIDEwfSwKLXs2MywgMTAsIDEwMCwgNjMsIDEwfSwKLXs2NCwgMTAsIDEwMCwgNjQsIDEwfSwKLXs2NSwgMTAsIDEwMCwgNjUsIDEwfSwKLXs2NiwgMTAsIDEwMCwgNjYsIDEwfSwKLXs2NywgMTAsIDEwMCwgNjcsIDEwfSwKLXs2OCwgMTAsIDEwMCwgNjgsIDEwfSwKLXs2OSwgMTAsIDEwMCwgNjksIDEwfSwKLXs3MCwgMTAsIDEwMCwgNzAsIDEwfSwKLXs3MSwgMTAsIDEwMCwgNzEsIDEwfSwKLXs3MiwgMTAsIDEwMCwgNzIsIDEwfSwKLXs3MywgMTAsIDEwMCwgNzMsIDEwfSwKLXs3NCwgMTAsIDEwMCwgNzQsIDEwfSwKLXs3NSwgMTAsIDEwMCwgNzUsIDEwfSwKLXs3NiwgMTAsIDEwMCwgNzYsIDEwfSwKLXs3NywgMTAsIDEwMCwgNzcsIDEwfSwKLXs3OCwgMTAsIDEwMCwgNzgsIDEwfSwKLXs3OSwgMTAsIDEwMCwgNzksIDEwfSwKLXs4MCwgMTAsIDEwMCwgODAsIDEwfSwKLXs4MSwgMTAsIDEwMCwgODEsIDEwfSwKLXs4MiwgMTAsIDEwMCwgODIsIDEwfSwKLXs4MywgMTAsIDEwMCwgODMsIDEwfSwKLXs4NCwgMTAsIDEwMCwgODQsIDEwfSwKLXs4NSwgMTAsIDEwMCwgODUsIDEwfSwKLXs4NiwgMTAsIDEwMCwgODYsIDEwfSwKLXs4NywgMTAsIDEwMCwgODcsIDEwfSwKLXs4OCwgMTAsIDEwMCwgODgsIDEwfSwKLXs4OSwgMTAsIDEwMCwgODksIDEwfSwKLXs5MCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5MywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NSwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NiwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5NywgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OCwgMTAsIDEwMCwgOTAsIDEwfSwKLXs5OSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDAsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTAxLCAxMCwgMTAwLCA5MCwgMTB9LAotezEwMiwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDMsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA0LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwNSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDYsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTA3LCAxMCwgMTAwLCA5MCwgMTB9LAotezEwOCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMDksIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEwLCAxMCwgMTAwLCA5MCwgMTB9LAotezExMSwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTIsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTEzLCAxMCwgMTAwLCA5MCwgMTB9LAotezExNCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTUsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE2LCAxMCwgMTAwLCA5MCwgMTB9LAotezExNywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMTgsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTE5LCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMCwgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjEsIDEwLCAxMDAsIDkwLCAxMH0sCi17MTIyLCAxMCwgMTAwLCA5MCwgMTB9LAotezEyMywgMTAsIDEwMCwgOTAsIDEwfSwKLXsxMjQsIDEwLCAxMDAsIDkwLCAxMH0sCi19OwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0Fycm93U2VsZWN0aW9uKCkgewotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudChzbGlkZXIuZ2V0U2l6ZSgpLngtMTAsIDUsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDAsIFNXVC5BUlJPV19SSUdIVCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfVGh1bWJTZWxlY3Rpb24gKCkgewotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjUsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1Ryb3VnaFNlbGVjdGlvbiAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg0NSwgMTAsIDEsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyNywgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDksIDUsIDMwLCAxMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjliZjQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TeW5jaHJvbml6ZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlN5bmNocm9uaXplcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1N5bmNocm9uaXplcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5KCkgewotCS8vIHRlc3RlZCBpbiBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkudGVzdF9zZXRTeW5jaHJvbml6ZXJMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU3luY2hyb25pemVyCi19Ci0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TeW5jaHJvbml6ZXIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXkoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyMTI0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCW5ldyBUYWJGb2xkZXIobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRBcmVhKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDbGllbnRBcmVhIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgdGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpPT1pKTsKLQkgIAluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydFRydWUoIjphOiIgK1N0cmluZy52YWx1ZU9mKGkpLCB0YWJGb2xkZXIuZ2V0SXRlbShpKS5lcXVhbHMoaXRlbXNbaV0pKTsKLQl9Ci0JdHJ5IHsKLQkJdGFiRm9sZGVyLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQl0YWJGb2xkZXIuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JdHJ5IHsKLQkJdGFiRm9sZGVyLmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA9PSAtMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQotCWFzc2VydEVxdWFscygwLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKS5sZW5ndGgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCX0KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYkZvbGRlci5nZXRJdGVtcygpKTsKLQkKLQl0YWJGb2xkZXIuZ2V0SXRlbXMoKVswXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci0KLQl0YWJGb2xkZXIuZ2V0SXRlbXMoKVszXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRJdGVtcygpKTsKLQotCXRhYkZvbGRlci5nZXRJdGVtcygpWzFdLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbM119LCB0YWJGb2xkZXIuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlUYWJJdGVtW10gdGlzID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWFzc2VydFRydWUoIjphOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKVswXSA9PSB0aXNbMF0pOwkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGkpOwotCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpWzBdPT10aXNbaV0pOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFiSXRlbVtdIGl0ZW1zID0gbmV3IFRhYkl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JCQotCWFzc2VydFRydWUoIjphOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpPT0wKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKT09Mik7Ci0JCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCk9PTApOwotCQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaXRlbXNbMl0pOwotCWFzc2VydFRydWUoIjpkOiIsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpPT0yKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRhYkl0ZW1bXSB0aXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJdGlzW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIGksIHRhYkZvbGRlci5pbmRleE9mKHRpc1tpXSk9PWkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCXRpc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRyeSB7Ci0JCQl0YWJGb2xkZXIuaW5kZXhPZihudWxsKTsKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYkl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwkKLQludW1iZXIgPSAyMDsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCS8vYW5vdGhlciB0YWJGb2xkZXIKLQlUYWJGb2xkZXIgdGFiRm9sZGVyXzIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQlUYWJJdGVtW10gaXRlbXNfMiA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc18yW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyXzIsIDApOwotCQlpdGVtc18yW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiArIFN0cmluZy52YWx1ZU9mKGkpLCB0YWJGb2xkZXIuaW5kZXhPZihpdGVtc18yW2ldKT09LTEpOwotCX0KLQotCS8vCi0JVGFiRm9sZGVyIHRhYkZvbGRlcjIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JVGFiSXRlbSB0YWJJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyMiwgU1dULk5VTEwpOwotCQotCWFzc2VydFRydWUoIjphOiIsIHRhYkZvbGRlci5pbmRleE9mKHRhYkl0ZW0pID09IC0xKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCWludCBudW1iZXIgPSAxMDsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCW5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaSk7Ci0JCWFzc2VydEVxdWFscyhpLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQkgIAlhc3NlcnRFcXVhbHMoImk9IiArIGksIDAsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JbnVtYmVyID0gNTsKLQlUYWJJdGVtW10gaXRlbXMgPSBuZXcgVGFiSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQl0cnkgewotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKChUYWJJdGVtKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCXRyeSB7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oKFRhYkl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde2l0ZW1zWzRdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMl19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW117aXRlbXNbMV19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihudW1iZXIgKyAxKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1sxXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0vLwl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKC0xKTsKLS8vCWFzc2VydEVxdWFscygwLCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoKTsJCi0JCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLS8vCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oLTIpOwotLy8JYXNzZXJ0RXF1YWxzKDAsIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5sZW5ndGgpOwkKLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgMCk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW1zWzBdKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtde30pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtde30sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24obmV3IFRhYkl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXSB7aXRlbXNbMF19LCB0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1szXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1szXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHtpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFiSXRlbVtdIHtpdGVtc1s0XX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzJdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJJdGVtW10ge2l0ZW1zWzFdfSwgdGFiRm9sZGVyLmdldFNlbGVjdGlvbigpKTsJCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIDApOwotCXRyeSB7Ci0JCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oIG5ldyBUYWJJdGVtW117aXRlbXNbMF0sIG51bGx9KTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbiggbmV3IFRhYkl0ZW1bXXtudWxsfSk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWZpbmFsbHkgewotCQlhc3NlcnRFcXVhbHMobmV3IFRhYkl0ZW1bXXtpdGVtc1swXX0sIHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVRyaW1JSUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDbGllbnRBcmVhIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1BndXBTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlU2l6ZUlJWiIpKSB0ZXN0X2NvbXB1dGVTaXplSUlaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb21wdXRlVHJpbUlJSUkiKSkgdGVzdF9jb21wdXRlVHJpbUlJSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENsaWVudEFyZWEiKSkgdGVzdF9nZXRDbGllbnRBcmVhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uSW5kZXgiKSkgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtIikpIHRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25JIikpIHRlc3Rfc2V0U2VsZWN0aW9uSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9QZ2R3blNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfUGd1cFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYkZvbGRlciB0YWJGb2xkZXI7Ci0KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQlzZXRXaWRnZXQodGFiRm9sZGVyKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYkZvbGRlcihWZWN0b3IgZXZlbnRzKSB7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KCJUYWJJdGVtICYiICsgaSk7Ci0JCWl0ZW0uc2V0VG9vbFRpcFRleHQoIlRhYkl0ZW0gVG9vbFRpcCIgKyBpKTsKLQkJVGV4dCBpdGVtVGV4dCA9IG5ldyBUZXh0KHRhYkZvbGRlciwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWl0ZW1UZXh0LnNldFRleHQoIlxuVGV4dCBmb3IgVGFiSXRlbSAiICsgaSArICJcblxuXG4iKTsKLQkJaXRlbS5zZXRDb250cm9sKGl0ZW1UZXh0KTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGl0ZW0sIGdldFRlc3ROYW1lKCksIGV2ZW50cyk7Ci0JfQotCQotLy8JdGFiRm9sZGVyLnNldFNlbGVjdGlvbihuZXcgVGFiSXRlbVtdIHt0YWJGb2xkZXIuZ2V0SXRlbSgwKX0pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX1JJR0hULCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCh0YWJGb2xkZXIuZ2V0U2l6ZSgpLngvMiwgNSwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1BnZHduU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkNUUkwsIDAsIFNXVC5QQUdFX0RPV04sIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9QZ3VwU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMik7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQ1RSTCwgMCwgU1dULlBBR0VfVVAsIENvbnNpc3RlbmN5VXRpbGl0eS5ET1VCTEVfS0VZX1BSRVNTLCBldmVudHMsIGZhbHNlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRhYkZvbGRlcihldmVudHMpOwotICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMSk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFiRm9sZGVyKGV2ZW50cyk7Ci0gICAgdGFiRm9sZGVyLnNldFNlbGVjdGlvbigxKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCA1LCA3MCwgMTAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmFkNzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHNoZWxsLCAwKTsKLQl0YWJJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCAwKTsKLQlzZXRXaWRnZXQodGFiSXRlbSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFiRm9sZGVySSgpIHsKLQl0cnkgewotCQluZXcgVGFiSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJSSgpIHsKLQlUYWJJdGVtIHRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMCk7Ci0JCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMF0gPT0gdEl0ZW0pOwotCQotCXRJdGVtID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCwgMSk7CQotCWFzc2VydFRydWUoIjpiOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQkJCQkKLQl0SXRlbSA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5VTEwsIDEpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0YWJGb2xkZXIuZ2V0SXRlbXMoKVsxXSA9PSB0SXRlbSk7Ci0KLQl0cnkgewotCQluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCAtMSk7CQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFiRm9sZGVyLmdldEl0ZW1zKClbMV0gPT0gdEl0ZW0pOwkJCQotCX0KLQl0cnkgewotCQluZXcgVGFiSXRlbSh0YWJGb2xkZXIsIFNXVC5OVUxMLCB0YWJGb2xkZXIuZ2V0SXRlbUNvdW50KCkgKyAxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydFRydWUoIjplOiIsIHRhYkZvbGRlci5nZXRJdGVtcygpWzFdID09IHRJdGVtKTsKLQl9Ci0JdHJ5IHsKLQkJbmV3IFRhYkl0ZW0obnVsbCwgU1dULk5VTEwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydFRydWUoIjphOiAiLCB0YWJJdGVtLmdldFBhcmVudCgpID09IHRhYkZvbGRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VG9vbFRpcFRleHQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFRvb2xUaXBUZXh0IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sKCkgewotCUNvbnRyb2wgY29udHJvbCA9IG5ldyBUYWJsZSh0YWJGb2xkZXIsIFNXVC5OVUxMKTsKLQotCWFzc2VydFRydWUoIjphOiAiLCB0YWJJdGVtLmdldENvbnRyb2woKSA9PSBudWxsKTsJCi0KLQl0YWJJdGVtLnNldENvbnRyb2woY29udHJvbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6ICIsIHRhYkl0ZW0uZ2V0Q29udHJvbCgpID09IGNvbnRyb2wpOwotCi0JdGFiSXRlbS5zZXRDb250cm9sKG51bGwpOwotCWFzc2VydFRydWUoIjpjOiAiLCB0YWJJdGVtLmdldENvbnRyb2woKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0YWJJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKS5lcXVhbHMoImZyZWQiKSk7Ci0JdGFiSXRlbS5zZXRUb29sVGlwVGV4dCgiZnJlZHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dCIpOwotCWFzc2VydFRydWUoIjpiOiAiLCB0YWJJdGVtLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0IikpOwotCXRhYkl0ZW0uc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6ICIsIHRhYkl0ZW0uZ2V0VG9vbFRpcFRleHQoKSA9PSBudWxsKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvb2xUaXBUZXh0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlckkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJGb2xkZXJJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYkZvbGRlcklJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb250cm9sIikpIHRlc3RfZ2V0Q29udHJvbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRhYkZvbGRlciB0YWJGb2xkZXI7Ci1UYWJJdGVtIHRhYkl0ZW07Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODJhZTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGUKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7IC8vIGJ5IGRlZmF1bHQsIHVzZSBtdWx0aS1zZWxlY3QgdGFibGUuCQotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYmxlKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbXB1dGVTaXplSUlaKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlU2l6ZUlJWiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0JEkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MCwgM30pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MSwgMn0pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MSwgMywgNX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7OSwgMywgMH0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJ5ewotCQl0YWJsZS5kZXNlbGVjdChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7LTEsIDEwMCwgLTEwMDB9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQotCXRhYmxlLmRlc2VsZWN0KG5ldyBpbnRbXSB7MiwgLTEsIDEsIDEwMCwgMn0pOwotCWFzc2VydEVxdWFscyhudW1iZXItMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3QobmV3IGludFtdIHsyLCAtMSwgMSwgMTAwLCAyfSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0yLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdChuZXcgaW50W10gezIsIC0xLCAzLCAxMDAsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rlc2VsZWN0QWxsKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsyLCA0LCA1LCAxMH0pOwotCQotCWFzc2VydEVxdWFscyg0LCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JfQotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgwKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MCwgMywgNn0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDApOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCg1KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgzKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3QoMTAwKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZGVzZWxlY3RJSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MCwgMywgNn0pOwotCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDcsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCg2LCAxMCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoMSwgMTApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCXRhYmxlLmRlc2VsZWN0KDAsIDEwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgwLCAxMDApOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuZGVzZWxlY3QoLTEwLCAyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTMsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QoLTEwLCAyMDAwKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgyMDAwLCAtMTApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCQotCXRhYmxlLmRlc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdCgwLCAwKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCi0JdGFibGUuZGVzZWxlY3QobnVtYmVyLTEsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCXRhYmxlLmRlc2VsZWN0KC0xLCAtMSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci0KLQl0YWJsZS5kZXNlbGVjdChudW1iZXIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuc2VsZWN0QWxsKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uQ291bnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMi5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldENvbHVtbkNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENvbHVtbkkoKSB7Ci0JdHJ5IHsKLQkJdGFibGUuZ2V0Q29sdW1uKDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIHRhYmxlLmdldENvbHVtbigwKSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCB0YWJsZS5nZXRDb2x1bW4oMSkpOwotCWNvbHVtbjEuZGlzcG9zZSgpOwotCXRyeSB7Ci0JCXRhYmxlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1ucygpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci0JY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5SSUdIVCwgMSk7Ci0JY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMiwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4wLCBjb2x1bW5zWzBdKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMSwgY29sdW1uc1sxXSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Q29sdW1ucygpLmxlbmd0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uT3JkZXIoKSB7Ci0JLy9pbiB0ZXN0X3NldEFDb2x1bW5PcmRlciRJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JpZExpbmVXaWR0aCgpIHsKLQkvLyBleGVjdXRlIG1ldGhvZCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGNoZWNrIHRoZSB2YWx1ZSBzaW5jZSBpdCBtYXkgYmUgYW55dGhpbmcgaW5jbHVkaW5nIDAKLQl0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SGVhZGVySGVpZ2h0KCkgewotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKSk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKHRhYmxlLmdldEhlYWRlckhlaWdodCgpID4gMCk7Ci0JdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIZWFkZXJWaXNpYmxlKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEhlYWRlclZpc2libGVaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUNvdW50KCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IisgaiwgY2FzZXNbal0sIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLy8gbm90ZTogU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwkKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJqPSIrIGosIGNhc2VzW2pdLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiBJdGVtIGhlaWdodCA8PSAwIiwgdGFibGUuZ2V0SXRlbUhlaWdodCgpID4gMCk7Ci0JbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IEl0ZW0gaGVpZ2h0IDw9IDAiLCB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgaXRlbXNbaV0sIHRhYmxlLmdldEl0ZW0oaSkpOwotCXRyeSB7Ci0JCXRhYmxlLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCi0JLy8gbm90ZTogU1dULlNJTkdMRQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKCJpPSIgKyBpLCBpdGVtc1tpXSwgdGFibGUuZ2V0SXRlbShpKSk7Ci0JfQotCXRyeSB7Ci0JCXRhYmxlLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFibGUuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IiArIGosIGNhc2VzW2pdLCB0YWJsZS5nZXRJdGVtcygpLmxlbmd0aCk7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJCXRpLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJqPSIgKyBqICsgIiwgaT0iICsgaSwgU3RyaW5nLnZhbHVlT2YoaSksIGl0ZW1zW2ldLmdldFRleHQoKSk7Ci0JCX0KLQkJdGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCQotCS8vIG5vdGUgU1dULlNJTkdMRQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQluZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImo9IiArIGosIGNhc2VzW2pdLCB0YWJsZS5nZXRJdGVtcygpLmxlbmd0aCk7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXNbal07IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCQl0aS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQkJfQotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscygiaj0iICsgaiArICIsIGk9IiArIGksIFN0cmluZy52YWx1ZU9mKGkpLCBpdGVtc1tpXS5nZXRUZXh0KCkpOwotCQl9Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lc1Zpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0TGluZXNWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydFNhbWUoaXRlbXMsIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXNbMF0pOwotCWFzc2VydFNhbWUobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkKLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxMF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1tudW1iZXItMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zWzJdKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTZWxlY3Rpb25JbmRleCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscygtMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXNbMTBdKTsKLQlhc3NlcnRFcXVhbHMoMTAsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMTAsIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKC0xLCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWFzc2VydEVxdWFscygtMSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdezIsIDEwLCBudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7IC8vIDEwIDwgbnVtYmVyCi0KLQlpbnRbXSBhbGwgPSBuZXcgaW50W251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyOyBpKyspCi0JCWFsbFtpXT1pOwotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShhbGwsIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtde251bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMTBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcEluZGV4KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRUb3BJbmRleCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpIHsKLQlpbnQgbnVtYmVyID0gMjA7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYmxlLmluZGV4T2YoaXRlbXNbaV0pKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRyeSB7Ci0JCQl0YWJsZS5pbmRleE9mKChUYWJsZUl0ZW0pbnVsbCk7Ci0JCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciB0YWJsZUl0ZW0gPT0gbnVsbCIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLy8gYW5vdGhlciB0YWJsZQotCVRhYmxlIHRhYmxlXzIgPSBuZXcgVGFibGUoc2hlbGwsIDApOwotCVRhYmxlSXRlbVtdIGl0ZW1zXzIgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc18yW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZV8yLCAwKTsKLQkJaXRlbXNfMltpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgLTEsIHRhYmxlLmluZGV4T2YoaXRlbXNfMltpXSkpOwotCX0KLQkKLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JbnVtYmVyID0gMjA7Ci0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JCWl0ZW1zW2ldLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJYXNzZXJ0RXF1YWxzKGksIHRhYmxlLmluZGV4T2YoaXRlbXNbaV0pKTsKLQl9Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0cnkgewotCQkJdGFibGUuaW5kZXhPZigoVGFibGVJdGVtKW51bGwpOwotCQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgdGFibGVJdGVtID09IG51bGwiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkJaXRlbXNbaV0uc2V0VGV4dChTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0JLy8gYW5vdGhlciB0YWJsZQotCXRhYmxlXzIgPSBuZXcgVGFibGUoc2hlbGwsIDApOwotCWl0ZW1zXzIgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc18yW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZV8yLCAwKTsKLQkJaXRlbXNfMltpXS5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgLTEsIHRhYmxlLmluZGV4T2YoaXRlbXNfMltpXSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1NlbGVjdGVkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlhc3NlcnRUcnVlKCI6YToiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzEwXX0pOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJaWYgKGkgPT0gMiB8fCBpID09IG51bWJlci0xIHx8IGkgPT0gMTApCi0JCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JCWVsc2UKLQkJCWFzc2VydFRydWUoIjpiOiIgKyBpLCAhdGFibGUuaXNTZWxlY3RlZChpKSk7Ci0JfQotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtc1swXSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpZiAoaSA9PSAwKQotCQkJYXNzZXJ0VHJ1ZSgiOmI6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCQllbHNlCi0JCQlhc3NlcnRUcnVlKCI6YjoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCX0KLQkKLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydFRydWUoIjpjOiIgKyBpLCB0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkJCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJYXNzZXJ0VHJ1ZSgiOmQ6IiArIGksICF0YWJsZS5pc1NlbGVjdGVkKGkpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxMF19KTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWlmIChpID09IDEwKQotCQkJYXNzZXJ0VHJ1ZSgiOmU6IiArIGksIHRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCQllbHNlCi0JCQlhc3NlcnRUcnVlKCI6ZToiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCX0KLQkKLQl0YWJsZS5zZXRTZWxlY3Rpb24oaXRlbXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspewotCQlhc3NlcnRUcnVlKCI6ZjoiICsgaSwgIXRhYmxlLmlzU2VsZWN0ZWQoaSkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmUkSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRhYmxlSXRlbXMgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyLCAxLCAwLCAtMTAwLCA1LCA1LCAyLCAxLCAwLCAwLCAwfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnRzIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHsyLCAxLCAwLCBudW1iZXIsIDUsIDUsIDIsIDEsIDAsIDAsIDB9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudHMiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10ge30pOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgIWl0ZW1zWzJdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7Mn0pOwotCWFzc2VydFRydWUoIjpiOiIsIGl0ZW1zWzJdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci0xLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQlhc3NlcnRUcnVlKCI6YzoiLCAhaXRlbXNbbnVtYmVyLTFdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7bnVtYmVyLTJ9KTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBpdGVtc1tudW1iZXItMV0uaXNEaXNwb3NlZCgpKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTIsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCWFzc2VydFRydWUoIjplOiIsICFpdGVtc1szXS5pc0Rpc3Bvc2VkKCkpOwotCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBpdGVtc1szXS5pc0Rpc3Bvc2VkKCkpOwotCWFzc2VydEVxdWFscyhudW1iZXItMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JYXNzZXJ0VHJ1ZSgiOmc6IiwgIWl0ZW1zWzBdLmlzRGlzcG9zZWQoKSk7Ci0JdGFibGUucmVtb3ZlKG5ldyBpbnRbXSB7MH0pOwotCWFzc2VydFRydWUoIjpoOiIsIGl0ZW1zWzBdLmlzRGlzcG9zZWQoKSk7Ci0JYXNzZXJ0RXF1YWxzKG51bWJlci00LCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlQWxsKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUucmVtb3ZlQWxsKCk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmVBbGwoKTsKLQl0YWJsZS5yZW1vdmVBbGwoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlSUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0cnkgewotCQl0YWJsZS5yZW1vdmUoLW51bWJlciwgbnVtYmVyICsgMTAwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCByYW5nZSIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7fQotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDIsIDMpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIsIDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKDIsIG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF0sIGl0ZW1zWzFdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgwLCAzKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMCwgbnVtYmVyLTEpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge30sIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0YWJsZS5yZW1vdmUobmV3IGludFtdIHt9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgtMjAsIC0xMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoaXRlbXMsIHRhYmxlLmdldEl0ZW1zKCkpOwotCQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgyMCwgNDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0YWJsZS5nZXRJdGVtcygpKTsKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMjAwLCA0MCk7Ci0JYXNzZXJ0RXF1YWxzKGl0ZW1zLCB0YWJsZS5nZXRJdGVtcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnJlbW92ZSgyLCAyKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1sxXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0SXRlbXMoKSk7Ci0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQl0YWJsZS5yZW1vdmUoMCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdGFibGUucmVtb3ZlKDQsIDQpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzFdLCBpdGVtc1syXSwgaXRlbXNbM119LCB0YWJsZS5nZXRJdGVtcygpKTsKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJ5IHsKLQkJdGFibGUucmVtb3ZlKC0xMCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkgewotCQl0YWJsZS5yZW1vdmUoMTAsIDIpOwotCQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCXRhYmxlLnJlbW92ZSgwLCAyKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyIC0gMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldEl0ZW1zKCkpOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZSgxLCAyMDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IHJhbmdlIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHt9Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciAtIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRJdGVtcygpKTsKLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZSgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudW1iZXIsIG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnJlbW92ZShudW1iZXIsIG51bWJlciArIDEwMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggcmFuZ2UiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQkKLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0JCi0JbnVtYmVyID0gMTU7Ci0JaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnJlbW92ZShuZXcgaW50W10gezIsIDEsIDAsIDUsIDV9KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLTQsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2VsZWN0JEkoKSB7Ci0JdHJ5IHsKLQkJdGFibGUuc2VsZWN0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezIsIDEwLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTAsIDIsIDE0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezIsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHtudW1iZXIsIDAsIG51bWJlci0xfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIG51bWJlci0xfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChuZXcgaW50W10ge251bWJlciwgMCwgLTF9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHswfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsyfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W10gezAsIDIsIDEwfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHswLCAyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTV9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHstMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezQsIDQsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7IAotCQotCWl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0KLQl0cnkgewotCQl0YWJsZS5zZWxlY3QobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTB9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JdGFibGUuc2VsZWN0KG5ldyBpbnRbXSB7MTV9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHstMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezQsIDQsIDR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZWxlY3RBbGwoKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJKCkgewotCWludCBudW1iZXIgPSAxNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRhYmxlLnNlbGVjdChuZXcgaW50W10gezEwLCAyLCAxNH0pOwotCWFzc2VydFNhbWUobmV3IGludFtdIHsyLCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNlbGVjdCg3KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDApOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDcsIDEwLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyBub3RlOiBTV1QuU0lOR0xFCQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNlbGVjdCgwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgxMCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7MTB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChudW1iZXIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RJSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQkKLQl0YWJsZS5zZWxlY3QobmV3IGludFtdIHsxMCwgMiwgMTR9KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXSB7MiwgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQl0YWJsZS5zZWxlY3QoNyk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MiwgNywgMTAsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgwKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAyLCA3LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDQsIDEwKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDQsIDE0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAyLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDAsIDcpOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoOSwgNSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KC0xMDAsIDEwMDApOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRhYmxlLnNlbGVjdCgwLCAxMDAwKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KDAsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KG51bWJlci0xLCBudW1iZXIpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JdGFibGUuc2VsZWN0KG51bWJlciwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdGFibGUuZGVzZWxlY3RBbGwoKTsKLQotCS8vIG5vdGU6IFNXVC5TSU5HTEUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2VsZWN0KDAsIDApOwotCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNCwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoMTAsIDEwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxMH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QobnVtYmVyLTEsIG51bWJlci0xKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHtudW1iZXItMX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCXRhYmxlLnNlbGVjdChudW1iZXIsIG51bWJlcik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgwLCBudW1iZXItMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSwgbnVtYmVyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2VsZWN0KDQsIDUpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZWxlY3QoNSwgNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNlbGVjdCgtMSwgLTEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sdW1uT3JkZXIkSSgpIHsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFswXSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldENvbHVtbk9yZGVyKCksIG5ldyBpbnRbMF0pOwotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMV0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCQotCVRhYmxlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W117MCwgMSwgMn0pOwotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBudWxsIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbMF0pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0cnkgewotCQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MCwgMSwgMiwgM30pOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlLnNldENvbHVtbk9yZGVyKG5ldyBpbnRbXXswLCAwLCAxfSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezMsIDAsIDF9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQl0YWJsZS5zZXRDb2x1bW5PcmRlcihuZXcgaW50W117MiwgMSwgMH0pOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRDb2x1bW5PcmRlcigpLCBuZXcgaW50W10gezIsIDEsIDB9KTsKLQljb2x1bW4yLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFtdIHsxLCAwfSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFtdezAsIDEsIDJ9KTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW52YWxpZCBhcmd1bWVudCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkge30KLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFtdezB9KTsKLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Q29sdW1uT3JkZXIoKSwgbmV3IGludFswXSk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0Q29sdW1uT3JkZXIobmV3IGludFsxXSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgYXJndW1lbnQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHt9Ci0JVGFibGUgdGFibGUyID0gbmV3IFRhYmxlKHRhYmxlLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZTIuZ2V0Q29sdW1uT3JkZXIoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlMi5zZXRDb2x1bW5PcmRlcihuZXcgaW50WzBdKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpIHsKLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCWFzc2VydEZhbHNlKHRhYmxlLmdldEhlYWRlclZpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluZXNWaXNpYmxlWigpIHsKLQlpZiAoU3d0SnVuaXQuaXNDYXJib24pIHsKLQkJLyogb25seSBjYXJib24gdmVyc2lvbnMgPj0gMTAuNCBzdXBwb3J0IFRhYmxlIGxpbmVzICovCi0JCWFzc2VydEZhbHNlKHRhYmxlLmdldExpbmVzVmlzaWJsZSgpKTsKLQkJcmV0dXJuOwotCX0KLQlhc3NlcnRGYWxzZSh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlZHJhd1ooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFJlZHJhd1ogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb24kSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRyeSB7Ci0JCXRhYmxlLnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtde30pOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117MCwgMywgMn0pOwotCWFzc2VydFNhbWUobmV3IGludFtdezAsIDIsIDN9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W117MywgMiwgMX0pOwotCWFzc2VydFNhbWUobmV3IGludFtdezEsIDIsIDN9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXsxLCA0LCAwfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgMSwgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXswLCA0LCAwfSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MCwgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXsyLCAzLCA0fSk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MiwgMywgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdezQsIDQsIDQsIDQsIDQsIDQsIDR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXXs0fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkKLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCQotCXRyeSB7Ci0JCXRhYmxlLnNldFNlbGVjdGlvbigoaW50W10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb24gcmFuZ2UgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JZmluYWxseSB7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl9Ci0JCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezB9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHswfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10ge251bWJlci0xfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7bnVtYmVyLTF9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBpbnRbXSB7bnVtYmVyfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gey0xfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezAsIDMsIDJ9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezMsIDIsIDF9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10gezQsIDQsIDQsIDQsIDQsIDQsIDR9KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHt9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCWludCBudW1iZXIgPSA1OwotCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmV3IFRhYmxlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgMCk7Ci0JdHJ5IHsKLQkJdGFibGUuc2V0U2VsZWN0aW9uKChUYWJsZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiByYW5nZSA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQkKLQl0cnkgewotCQl0YWJsZS5zZXRTZWxlY3Rpb24oKFRhYmxlSXRlbSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlmaW5hbGx5IHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihpdGVtc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbM10sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW117aXRlbXNbMF0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1szXSwgaXRlbXNbMl0sIGl0ZW1zWzFdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMV0sIGl0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXXtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudChmYWxzZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1swXX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbM119LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtdIHtpdGVtc1s0XX0sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCi0JLy8gdGVzdCBzaW5nbGUtc2VsZWN0aW9uIHRhYmxlCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzNdLCBpdGVtc1syXSwgaXRlbXNbMV19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW117fSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW117aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1szXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzNdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbNF19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzJdfSwgdGFibGUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUYWJsZUl0ZW1bXSB7aXRlbXNbMV19LCB0YWJsZS5nZXRTZWxlY3Rpb24oKSk7CQkJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtde2l0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRhYmxlSXRlbVtde30sIHRhYmxlLmdldFNlbGVjdGlvbigpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSSgpIHsKLQlpbnQgbnVtYmVyID0gNTsKLQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDApOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDMpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117M30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCXRhYmxlLnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezR9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117Mn0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDEpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117MX0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQkvLyB0ZXN0IHNpbmdsZS1zZWxlY3Rpb24gdGFibGUKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigwKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezB9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDMpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117M30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsyfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXXsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0JCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKLQkJaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCAwKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigwLCAxKTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsJCi0KLQl0YWJsZS5zZXRTZWxlY3Rpb24oMywgNCk7Ci0JYXNzZXJ0U2FtZShuZXcgaW50W117MywgNH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7CQotCi0JdGFibGUuc2V0U2VsZWN0aW9uKDUsIDQpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W117fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigyLCAyKTsKLQlhc3NlcnRFcXVhbHMobmV3IGludFtdezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwkKLQotCXRhYmxlLnNldFNlbGVjdGlvbigxLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXsxLCAyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCXRhYmxlLnNldFNlbGVjdGlvbigwLCA0KTsKLQlhc3NlcnRTYW1lKG5ldyBpbnRbXXswLCAxLCAyLCAzLCA0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQotCS8vIHRlc3Qgc2luZ2xlLXNlbGVjdGlvbiB0YWJsZQotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQkKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXRhYmxlLnNldFNlbGVjdGlvbigwLCAxKTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHsxfSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDUsIDQpOwotCWlmIChmQ2hlY2tTV1RQb2xpY3kpCi0JCWFzc2VydEVxdWFscyhuZXcgaW50W10ge30sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JdGFibGUuc2V0U2VsZWN0aW9uKDIsIDIpOwotCWFzc2VydEVxdWFscyhuZXcgaW50W10gezJ9LCB0YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpOwotCXRhYmxlLnNldFNlbGVjdGlvbigxLCA0KTsKLQlpZiAoZkNoZWNrU1dUUG9saWN5KQotCQlhc3NlcnRFcXVhbHMobmV3IGludFtdIHs0fSwgdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQl0YWJsZS5zZXRTZWxlY3Rpb24oMCwgNCk7Ci0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBpbnRbXSB7NH0sIHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRUb3BJbmRleEkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93U2VsZWN0aW9uKCkgewotCXRhYmxlLnNob3dTZWxlY3Rpb24oKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlU2l6ZUlJWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3QkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGVzZWxlY3RJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENvbHVtbk9yZGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRHcmlkTGluZVdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJIZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEhlYWRlclZpc2libGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUhlaWdodCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZXNWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFNlbGVjdGlvbkNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSW5kZXgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9pc1NlbGVjdGVkSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdCRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDb2x1bW5PcmRlciRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRIZWFkZXJWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0TGluZXNWaXNpYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVkcmF3WiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25JSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VG9wSW5kZXhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3QkSSIpKSB0ZXN0X2Rlc2VsZWN0JEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0SSIpKSB0ZXN0X2Rlc2VsZWN0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGVzZWxlY3RJSSIpKSB0ZXN0X2Rlc2VsZWN0SUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbkNvdW50IikpIHRlc3RfZ2V0Q29sdW1uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbkkiKSkgdGVzdF9nZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5PcmRlciIpKSB0ZXN0X2dldENvbHVtbk9yZGVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5zIikpIHRlc3RfZ2V0Q29sdW1ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JpZExpbmVXaWR0aCIpKSB0ZXN0X2dldEdyaWRMaW5lV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpKSB0ZXN0X2dldEhlYWRlckhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpKSB0ZXN0X2dldEhlYWRlclZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVzVmlzaWJsZSIpKSB0ZXN0X2dldExpbmVzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpKSB0ZXN0X2dldFNlbGVjdGlvbkNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRleCIpKSB0ZXN0X2dldFNlbGVjdGlvbkluZGV4KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTZWxlY3Rpb25JbmRpY2VzIikpIHRlc3RfZ2V0U2VsZWN0aW9uSW5kaWNlcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSW5kZXgiKSkgdGVzdF9nZXRUb3BJbmRleCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpKSB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtIikpIHRlc3RfaW5kZXhPZkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2lzU2VsZWN0ZWRJIikpIHRlc3RfaXNTZWxlY3RlZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZSRJIikpIHRlc3RfcmVtb3ZlJEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlSSIpKSB0ZXN0X3JlbW92ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUlJIikpIHRlc3RfcmVtb3ZlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3QkSSIpKSB0ZXN0X3NlbGVjdCRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RBbGwiKSkgdGVzdF9zZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEkiKSkgdGVzdF9zZWxlY3RJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZWxlY3RJSSIpKSB0ZXN0X3NlbGVjdElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb2x1bW5PcmRlciRJIikpIHRlc3Rfc2V0Q29sdW1uT3JkZXIkSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhlYWRlclZpc2libGVaIikpIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVzVmlzaWJsZVoiKSkgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJEkiKSkgdGVzdF9zZXRTZWxlY3Rpb24kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0iKSkgdGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEluZGV4SSIpKSB0ZXN0X3NldFRvcEluZGV4SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiIpKSB0ZXN0X3Nob3dDb2x1bW5Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSIpKSB0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2hvd1NlbGVjdGlvbiIpKSB0ZXN0X3Nob3dTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKSkgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwotCi1wcml2YXRlIHZvaWQgbWFrZUNsZWFuRW52aXJvbm1lbnQoYm9vbGVhbiBzaW5nbGUpIHsKLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLQlpZiAodGFibGUgIT0gbnVsbCkgdGFibGUuZGlzcG9zZSgpOwotCXRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBzaW5nbGU/U1dULlNJTkdMRTpTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0YWJsZSk7CQotfQotCi1wcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoVmVjdG9yIGV2ZW50cykgewotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQlmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAzOyBjb2wrKykgewotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoIkNvbCAiICsgY29sKTsKLQkJY29sdW1uLnNldFdpZHRoKDUwKTsKLQkJaG9va0V4cGVjdGVkRXZlbnRzKGNvbHVtbiwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0JZm9yIChpbnQgcm93ID0gMDsgcm93IDwgMzsgcm93KyspIHsKLQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nIFtdIHsiQzBSIiArIHJvdywgIkMxUiIgKyByb3csICJDMlIiICsgcm93fSk7Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgU1dULkFSUk9XX0RPV04sIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW91c2VTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5UHJlUGFja1NoZWxsKCk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgyMCwgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkgKyB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkqMiwgCi0gICAgICAgICAgICAJCSAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2sgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeVByZVBhY2tTaGVsbCgpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMjAsIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKyB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKyA1LCAxLCAwLCAKLSAgICAgICAgICAgIAkgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUYWJsZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVGFibGUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDMwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhYzI5Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUNvbHVtbiBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlNJTkdMRSk7CQkKLQl0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwpOwkKLQlzZXRXaWRnZXQodGFibGVDb2x1bW4pOwotfQotCi1wcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLQlzdXBlci50ZWFyRG93bigpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVDb2x1bW4obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSgpIHsKLQl0cnkgewotCQluZXcgVGFibGVDb2x1bW4obnVsbCwgU1dULk5VTEwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMLCAtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4ID09IC0xIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyeSB7Ci0JCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwsIDIpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JdHJ5IHsKLQkJdGFibGVDb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QWxpZ25tZW50KCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEFsaWdubWVudEkKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRNb3ZlYWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRNb3ZlYWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFJlc2l6YWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRSZXNpemVhYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpZHRoKCkgewotCWludCB0ZXN0V2lkdGggPSA0MjsKLQkKLS8vCXRyeSB7Ci0vLwkJdGFibGVDb2x1bW4uc2V0V2lkdGgoLTEpOwotLy8JCWFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiB0aHJvd24iLCBmYWxzZSk7Ci0vLwl9Ci0vLwljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCQlhc3NlcnRUcnVlKCJXcm9uZyBlcnJvciB0aHJvd246ICIgKyBlLCBlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIkFyZ3VtZW50IG5vdCB2YWxpZCIpKTsKLS8vCX0KLS8vCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotCi0JdGFibGVDb2x1bW4uc2V0V2lkdGgoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIDAsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgPT0gMCk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRXaWR0aCh0ZXN0V2lkdGgpOwotCWFzc2VydFRydWUoIjpiOiB3aWR0aD0iICsgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyB0ZXN0V2lkdGgsIHRhYmxlQ29sdW1uLmdldFdpZHRoKCkgPT0gdGVzdFdpZHRoKTsKLQotCXRhYmxlQ29sdW1uLnNldFdpZHRoKHRlc3RXaWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IHdpZHRoPSIgKyB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdGFibGVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3BhY2soKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3BhY2sgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge319OwotCi0JdGFibGVDb2x1bW4ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwkKLQl0YWJsZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQkKLQl0YWJsZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEFsaWdubWVudEkoKSB7Ci0JVGFibGVDb2x1bW4gY29sdW1uMjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0YWJsZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRBbGlnbm1lbnQoLTEpOwotCWFzc2VydFRydWUoIjpiOiIsIHRhYmxlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRhYmxlQ29sdW1uLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoCi0JCSI6YzogU2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIHNldCBhbGlnbm1lbnQgb2YgdGhlIGZpcnN0IGNvbHVtbiIsIAotCQl0YWJsZUNvbHVtbi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7Ci0KLQljb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULlJJR0hUKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5SSUdIVCk7Ci0JCi0JY29sdW1uMi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuQ0VOVEVSKTsJCi0KLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JYXNzZXJ0VHJ1ZSgiOmY6IiwgY29sdW1uMi5nZXRBbGlnbm1lbnQoKSA9PSBTV1QuTEVGVCk7CQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0TW92ZWFibGVaKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRhYmxlQ29sdW1uLmdldE1vdmVhYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0TW92ZWFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSB0cnVlKTsKLQotCXRhYmxlQ29sdW1uLnNldE1vdmVhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpjOiIsIHRhYmxlQ29sdW1uLmdldE1vdmVhYmxlKCkgPT0gdHJ1ZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGFibGVDb2x1bW4uZ2V0TW92ZWFibGUoKSA9PSBmYWxzZSk7Ci0JCi0JVGFibGVDb2x1bW4gdGFibGVDb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlQ29sdW1uLmdldFBhcmVudCgpLCBTV1QuTk9ORSk7Ci0JdGFibGVDb2x1bW4yLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0YWJsZUNvbHVtbjIuZ2V0TW92ZWFibGUoKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotCXRyeSB7Ci0JCXRhYmxlQ29sdW1uMi5zZXRNb3ZlYWJsZSh0cnVlKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igd2lkZ2V0IGlzIERpc3Bvc2VkIik7Ci0JfSBjYXRjaCAoU1dURXhjZXB0aW9uIGV4KSB7fQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFJlc2l6YWJsZVooKSB7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci0KLQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpiOiIsIHRhYmxlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IGZhbHNlKTsKLQotCXRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGFibGVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gZmFsc2UpOwotCi0JdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjpkOiIsIHRhYmxlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHRhYmxlQ29sdW1uLmdldFRleHQoKSwgIiIpOwotCi0JdGFibGVDb2x1bW4uc2V0VGV4dCgidGV4dCIpOwotCWFzc2VydEVxdWFscygiOmI6IiwgdGFibGVDb2x1bW4uZ2V0VGV4dCgpLCAidGV4dCIpOwotCi0JdHJ5IHsKLQkJdGFibGVDb2x1bW4uc2V0VGV4dChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sdW1uIGhlYWRlciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlQ29sdW1uKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRBbGlnbm1lbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldE1vdmVhYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFJlc2l6YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3BhY2siKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QWxpZ25tZW50SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRNb3ZlYWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlc2l6YWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0V2lkdGhJIik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbS5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpKSB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEFsaWdubWVudCIpKSB0ZXN0X2dldEFsaWdubWVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TW92ZWFibGUiKSkgdGVzdF9nZXRNb3ZlYWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRSZXNpemFibGUiKSkgdGVzdF9nZXRSZXNpemFibGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFdpZHRoIikpIHRlc3RfZ2V0V2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3BhY2siKSkgdGVzdF9wYWNrKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRBbGlnbm1lbnRJIikpIHRlc3Rfc2V0QWxpZ25tZW50SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRNb3ZlYWJsZVoiKSkgdGVzdF9zZXRNb3ZlYWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFJlc2l6YWJsZVoiKSkgdGVzdF9zZXRSZXNpemFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFdpZHRoSSIpKSB0ZXN0X3NldFdpZHRoSSgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLXByb3RlY3RlZCBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbjsKLXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxY2M2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbSBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfSXRlbSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYmxlSXRlbShudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQlmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgewotCQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7CQotCX0KLQlhc3NlcnRFcXVhbHMoMTEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQluZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSwgNSk7CQotCWFzc2VydEVxdWFscygxMiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUsIDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRCYWNrZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzSSgpIHsKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCS8vIG5vIGNvbHVtbnMKLSAJYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWE6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjoxYzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgiaGVsbG8iKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZToiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JLy9hc3NlcnRUcnVlKCI6MWY6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7IC8vIFRPRE8gZG9lc24ndCBzaHJpbms/Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWc6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDApOwotCXRhYmxlSXRlbS5zZXRJbWFnZSgoSW1hZ2UpbnVsbCk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFoOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLS8vCWFzc2VydFRydWUoIjoxaToiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsgLy8gVE9ETyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0gCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dCgiaGVsbG8iKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCXRhYmxlSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFqOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6MWs6IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7Ci0JCi0JLy8gbm8gY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5PTkUpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MmI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6MmM6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JdGFibGVJdGVtMi5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyZDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCk7Ci0JdGFibGVJdGVtMi5zZXRUZXh0KCIiKTsKLQlib3VuZHMyID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJlOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQkvL2Fzc2VydFRydWUoIjoyZjoiLCBib3VuZHMyLndpZHRoIDwgYm91bmRzLndpZHRoKTsgLy8gVE9ETyBkb2Vzbid0IHNocmluaz8KLQkKLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQkKLQl0YWJsZUl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmc6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDApOwotCXRhYmxlSXRlbTIuc2V0SW1hZ2UoKEltYWdlKW51bGwpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmg6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCS8vYXNzZXJ0VHJ1ZSgiOjJpOiIsIGJvdW5kczIud2lkdGggPCBib3VuZHMud2lkdGgpOyAgLy8gVE9ETyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0JCi0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTk9ORSk7Ci0JCi0JdGFibGVJdGVtMi5zZXRUZXh0KCJoZWxsbyIpOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCXRhYmxlSXRlbTIuc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kczIgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6Mmo6IiwgYm91bmRzMi54ID4gMCAmJiBib3VuZHMyLmhlaWdodCA+IDApOwotCWFzc2VydFRydWUoIjoyazoiLCBib3VuZHMyLndpZHRoID4gYm91bmRzLndpZHRoKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQkvLyB3aXRoIGNvbHVtbnMKLQkKLQlUYWJsZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2E6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozYjoiLCAvKmJvdW5kcy54ID4gMCAmJiovIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsgLy8gVE9ETyBib3VuZHMueCA9PSAwIElzIHRoaXMgcmlnaHQ/Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygyKTsKLQlhc3NlcnRUcnVlKCI6M2Q6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNlOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M2Y6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2c6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozaDoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDIwMCk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaGVsbG8iLCAid29ybGQifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozajoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCXRhYmxlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozbDoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNtOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M246IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLSAJdGFibGVJdGVtLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M286IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozcDoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozcToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNyOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRhYmxlSXRlbS5zZXRUZXh0KCJoZWxsbyIpOwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozczoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAwKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JdGFibGUyLmRpc3Bvc2UoKTsKLQl0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdGFibGVJdGVtMiA9IG5ldyBUYWJsZUl0ZW0odGFibGUyLCBTV1QuTk9ORSk7Ci0JY29sdW1uMCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZTIsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkNFTlRFUik7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRiOiIsIC8qYm91bmRzLnggPiAwICYmKi8gYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID09IDApOyAvLyBUT0RPIGJvdW5kcy54ID09IDAgSXMgdGhpcyByaWdodD8KLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygtMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwkKLSAJYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCQotCWNvbHVtbjAuc2V0V2lkdGgoMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQljb2x1bW4xLnNldFdpZHRoKDIwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRnOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRoOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHsiaGVsbG8iLCAid29ybGQifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JdGFibGVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRrOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRsOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0bToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRhYmxlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0bjoiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotIAl0YWJsZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRvOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRwOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQljb2x1bW4wID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRhYmxlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10geyJoZWxsbyIsICJ3b3JsZCJ9KTsKLQl0YWJsZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRxOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRyOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggID09IDIwMCk7Ci0JCi0JLy8KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OT05FKTsKLQkKLQl0YWJsZUl0ZW0yLnNldFRleHQoImhlbGxvIik7Ci0JbmV3IFRhYmxlQ29sdW1uKHRhYmxlMiwgU1dULlJJR0hUKTsKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHM6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCAgPT0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hlY2tlZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRDaGVja2VkWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnQoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvbnRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEZvcmVncm91bmRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEdyYXllZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRHcmF5ZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCkgewotLyoqCi0gKiBUZXN0IHdpdGhvdXQgaXRlbSBpbWFnZQotICovCi0JUmVjdGFuZ2xlIGJvdW5kczsKLQlUYWJsZSB0YWJsZTIgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVGFibGVJdGVtIHRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5VTEwpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLndpZHRoID09IDApOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMSkpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JYm91bmRzID0gdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBib3VuZHMud2lkdGggPT0gMCk7Ci0JCi0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotIAkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07CQotLy8JaW50IGltYWdlV2lkdGggPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLS8vCWludCBpbWFnZUhlaWdodDsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2UpOwotLy8JaW1hZ2VIZWlnaHQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgLSB0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygtMSkpOwotCQotCWJvdW5kcyA9IHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygwKTsKLS8vCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMud2lkdGggPT0gaW1hZ2VXaWR0aCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsJCi0vLyAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7CQotCQotCXRhYmxlMi5kaXNwb3NlKCk7Ci0JdGFibGUyID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRhYmxlSXRlbTIuZGlzcG9zZSgpOwotCXRhYmxlSXRlbTIgPSBuZXcgVGFibGVJdGVtKHRhYmxlMiwgU1dULk5VTEwpOwotLy8JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0vLwlpbWFnZVdpZHRoID0gaW1hZ2VCb3VuZHMud2lkdGg7IAl0YWJsZUl0ZW0yLnNldEltYWdlKDAsIGltYWdlKTsKLS8vCWltYWdlSGVpZ2h0ID0gdGFibGUyLmdldEl0ZW1IZWlnaHQoKSAtIHRhYmxlMi5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRhYmxlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiB0aGV5IGFyZSB3aWRlciB0aGFuIGltYWdlCi0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0KLQl0YWJsZTIuZGlzcG9zZSgpOwotCXRhYmxlMiA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQl0YWJsZUl0ZW0yLmRpc3Bvc2UoKTsKLQl0YWJsZUl0ZW0yID0gbmV3IFRhYmxlSXRlbSh0YWJsZTIsIFNXVC5OVUxMKTsKLQlpbWFnZSA9IGltYWdlc1sxXTsKLS8vCWltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0vLwlpbWFnZVdpZHRoID0gaW1hZ2VCb3VuZHMud2lkdGg7Ci0gCXRhYmxlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotLy8JaW1hZ2VIZWlnaHQgPSB0YWJsZTIuZ2V0SXRlbUhlaWdodCgpIC0gdGFibGUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdGFibGVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotIAlib3VuZHMgPSB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiBjaGVjayBib3ggaXMgd2lkZXIgdGhhbiBpbWFnZQotLy8JYXNzZXJ0VHJ1ZSgiOmI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7Ci0gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0YWJsZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEltYWdlSW5kZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJbWFnZUluZGVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudCgpIHsKLQlhc3NlcnRFcXVhbHModGFibGUsIHRhYmxlSXRlbS5nZXRQYXJlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0VGV4dElMSmF2YV9sYW5nX1N0cmluZwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0QmFja2dyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEJhY2tncm91bmQoKSx0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0KLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBibHVlKTsKLQl0YWJsZUl0ZW0uc2V0QmFja2dyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRCYWNrZ3JvdW5kKCksdGFibGVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRhYmxlSXRlbS5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JdGFibGVJdGVtLnNldEJhY2tncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdGFibGVJdGVtLmdldEJhY2tncm91bmQoKSk7Ci0JdGFibGVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEJhY2tncm91bmQoKSx0YWJsZUl0ZW0uZ2V0QmFja2dyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRhYmxlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldENoZWNrZWRaKCkgewotCWFzc2VydEVxdWFscyhmYWxzZSwgdGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0JCi0JdGFibGVJdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0YWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAJVGFibGUgdCA9IG5ldyBUYWJsZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKHQsIFNXVC5OVUxMKTsKLQl0aS5zZXRDaGVja2VkKHRydWUpOwotCWFzc2VydFRydWUodGkuZ2V0Q2hlY2tlZCgpKTsKLQkKLQl0aS5zZXRDaGVja2VkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRpLmdldENoZWNrZWQoKSk7Ci0JdC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUZvbnQgZm9udCA9IHRhYmxlSXRlbS5nZXRGb250KCk7Ci0JdGFibGVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0JCi0JZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCXRhYmxlSXRlbS5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHMoIHRhYmxlSXRlbS5nZXRGb250KCkpKTsKLQotCXRhYmxlSXRlbS5zZXRGb250KG51bGwpOwotCWFzc2VydFRydWUodGFibGUuZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldEZvbnQoZm9udCk7Ci0JCXRhYmxlSXRlbS5zZXRGb250KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdGFibGVJdGVtLmdldERpc3BsYXkoKTsKLQlGb250IGZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQkKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCXRhYmxlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRGb250KDEwLCBmb250KTsKLQlhc3NlcnRUcnVlKHRhYmxlSXRlbS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDEwKSkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodGFibGVJdGVtLmdldEZvbnQoKS5lcXVhbHModGFibGVJdGVtLmdldEZvbnQoMTApKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQoMCwgZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCXRhYmxlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUodGFibGUuZ2V0Rm9udCgpLmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuTk9STUFMKTsKLQkKLQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQl0YWJsZUl0ZW0uc2V0Rm9udChmb250Mik7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCXRhYmxlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCWFzc2VydFRydWUoZm9udDIuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRGb250KCkuZXF1YWxzKHRhYmxlSXRlbS5nZXRGb250KDApKSk7Ci0JCi0JZm9udC5kaXNwb3NlKCk7Ci0JZm9udDIuZGlzcG9zZSgpOwotCQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCQl0YWJsZUl0ZW0uc2V0Rm9udCgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlEaXNwbGF5IGRpc3BsYXkgPSB0YWJsZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUNvbG9yIHJlZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0JQ29sb3IgYmx1ZSA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHModGFibGUuZ2V0Rm9yZWdyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgxMCkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMTAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRhYmxlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHMocmVkLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0KLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBibHVlKTsKLQl0YWJsZUl0ZW0uc2V0Rm9yZWdyb3VuZChyZWQpOwotCWFzc2VydEVxdWFscyhibHVlLCB0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKG51bGwpOwotCWFzc2VydEVxdWFscyh0YWJsZS5nZXRGb3JlZ3JvdW5kKCksdGFibGVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyeSB7IAotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihkaXNwbGF5LCAyNTUsIDAsIDApOwotCQljb2xvci5kaXNwb3NlKCk7Ci0JCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKHRhYmxlSXRlbS5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQoY29sb3IpOwotCWFzc2VydEVxdWFscyhjb2xvciwgdGFibGVJdGVtLmdldEZvcmVncm91bmQoKSk7Ci0JdGFibGVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRhYmxlLmdldEZvcmVncm91bmQoKSx0YWJsZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpKTsKLQljb2xvci5kaXNwb3NlKCk7Ci0JdHJ5IHsgCi0JCXRhYmxlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRHcmF5ZWRaKCkgewotCVRhYmxlIG5ld1RhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRhYmxlSXRlbSB0SXRlbSA9IG5ldyBUYWJsZUl0ZW0obmV3VGFibGUsMCk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKHRydWUpOwotCWFzc2VydFRydWUodEl0ZW0uZ2V0R3JheWVkKCkpOwotCXRJdGVtLnNldEdyYXllZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JbmV3VGFibGUuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JYXNzZXJ0TnVsbCh0YWJsZUl0ZW0uZ2V0SW1hZ2UoMSkpOwkKLSAJdGFibGVJdGVtLnNldEltYWdlKC0xLCBudWxsKTsJCQotCWFzc2VydE51bGwodGFibGVJdGVtLmdldEltYWdlKC0xKSk7CQotCQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwkKLSAJU3RyaW5nIHRleHRzW10gPSBuZXcgU3RyaW5nW2ltYWdlcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJdGV4dHNbaV0gPSBTdHJpbmcudmFsdWVPZihpKTsKLQl9Ci0JCi0JLy90YWJsZS5zZXRUZXh0KHRleHRzKTsJCQkJLy8gY3JlYXRlIGVub3VnaCBjb2x1bW5zIGZvciBUYWJsZUl0ZW0uc2V0SW1hZ2UoSW1hZ2VbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgdGV4dHMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKXsKLQkJCW5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCWNvbHVtbnNbaV0uc2V0VGV4dCh0ZXh0c1tpXSk7Ci0JfQotCXRhYmxlSXRlbS5zZXRJbWFnZSgxLCBpbWFnZXNbMV0pOwotCWFzc2VydEVxdWFscyhpbWFnZXNbMV0sIHRhYmxlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0YWJsZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoaW1hZ2VzW2ldLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoaSkpOwotCX0KLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0SW1hZ2UoKEltYWdlIFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW1hZ2VzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdGFibGVJdGVtLnNldEltYWdlKDEwLCBpbWFnZXNbMF0pOwotCWFzc2VydEVxdWFscyhudWxsLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQluZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5MRUZUKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRhYmxlSXRlbS5zZXRJbWFnZSgxMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdGFibGVJdGVtLmdldEltYWdlKDEwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRhYmxlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JdGFibGVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JdGFibGVJdGVtLnNldEltYWdlKGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdGFibGVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoaW1hZ2VzWzFdKTsKLQl0YWJsZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0YWJsZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCWltYWdlc1swXS5kaXNwb3NlKCk7Ci0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JCXRhYmxlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlSW5kZW50SSgpIHsKLQlpZiAoU3d0SnVuaXQuaXNDYXJib24gfHwgU3d0SnVuaXQuaXNHVEspIHsKLQkJLy9zZXRJbWFnZUluZGVudCBub3QgaW1wbGVtZW50ZWQgb24gQ2FyYm9uCi0JCXRhYmxlSXRlbS5zZXRJbWFnZUluZGVudCgxKTsKLQkJcmV0dXJuOyAKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRJbWFnZUluZGVudCgpKTsKLSAJdGFibGVJdGVtLnNldEltYWdlSW5kZW50KDEpOwotCWFzc2VydEVxdWFscygxLCB0YWJsZUl0ZW0uZ2V0SW1hZ2VJbmRlbnQoKSk7Ci0gCXRhYmxlSXRlbS5zZXRJbWFnZUluZGVudCgtMSk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRhYmxlSXRlbS5nZXRJbWFnZUluZGVudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nKCkgewotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nID0gInRlc3QiOwotCWZpbmFsIFN0cmluZyBUZXN0U3RyaW5nc1tdID0gbmV3IFN0cmluZ1tdIHtUZXN0U3RyaW5nLCBUZXN0U3RyaW5nICsgIjEiLCBUZXN0U3RyaW5nICsgIjIifTsKLQkKLQl0cnkgewotCQl0YWJsZUl0ZW0uc2V0VGV4dCgoU3RyaW5nIFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5ncyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVGFibGUgdGhhdCBoYXMgb25seSAKLSAJKiB0aGUgZGVmYXVsdCBjb2x1bW4uCi0gCSovCi0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsKLQkKLQl0YWJsZUl0ZW0uc2V0VGV4dChUZXN0U3RyaW5ncyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmdzWzBdLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoaSkubGVuZ3RoKCkpOwotCX0KLQkKLQkKLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVGFibGUgdGhhdCBlbm91Z2ggCi0gCSogY29sdW1ucyB0byBmaXQgYWxsIHRlc3QgaXRlbSB0ZXh0cy4KLSAJKi8KLSAJCQotCWludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgaW1hZ2VzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KFRlc3RTdHJpbmdzW2ldKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsKLQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmcoKXsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZyA9ICJ0ZXN0IjsKLQlmaW5hbCBTdHJpbmcgVGVzdFN0cmluZ3NbXSA9IG5ldyBTdHJpbmdbXSB7VGVzdFN0cmluZywgVGVzdFN0cmluZyArICIxIiwgVGVzdFN0cmluZyArICIyIn07Ci0KLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVGFibGUgdGhhdCBoYXMgb25seSAKLSAJKiB0aGUgZGVmYXVsdCBjb2x1bW4uCi0gCSovCi0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0gCXRhYmxlSXRlbS5zZXRUZXh0KDEsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKS5sZW5ndGgoKSk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQoMCwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRhYmxlSXRlbS5nZXRUZXh0KDApKTsKLSAJdGFibGVJdGVtLnNldFRleHQoLTEsIFRlc3RTdHJpbmdzWzFdKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoLTEpLmxlbmd0aCgpKTsJCi0KLSAgIC8qCi0gCSogVGVzdCB0aGUgZ2V0VGV4dC9zZXRUZXh0IEFQSSB3aXRoIGEgVGFibGUgdGhhdCBlbm91Z2ggCi0gCSogY29sdW1ucyB0byBmaXQgYWxsIHRlc3QgaXRlbSB0ZXh0cy4KLSAJKi8KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JLy90YWJsZS5zZXRUZXh0KFRlc3RTdHJpbmdzKTsJCQkJLy8gY3JlYXRlIGFub3VnaCBjb2x1bW5zIGZvciBUYWJsZUl0ZW0uc2V0VGV4dChTdHJpbmdbXSkgdG8gd29yawotCWludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgaW1hZ2VzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCX0KLQl9Ci0JVGFibGVDb2x1bW5bXSBjb2x1bW5zID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgVGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KFRlc3RTdHJpbmdzW2ldKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDAsIHRhYmxlSXRlbS5nZXRUZXh0KDEpLmxlbmd0aCgpKTsJCi0KLQotCXRhYmxlSXRlbS5zZXRUZXh0KDEsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0YWJsZUl0ZW0uZ2V0VGV4dCgxKSk7CQotCWFzc2VydEVxdWFscygwLCB0YWJsZUl0ZW0uZ2V0VGV4dCgwKS5sZW5ndGgoKSk7Ci0JCi0JdGFibGVJdGVtLnNldFRleHQoMCwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRhYmxlSXRlbS5nZXRUZXh0KDApKTsKLQotCi0JdGFibGVJdGVtLnNldFRleHQoLTEsIFRlc3RTdHJpbmdzWzFdKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGFibGVJdGVtLmdldFRleHQoLTEpLmxlbmd0aCgpKTsJCi0KLQotCXRyeSB7Ci0JCXRhYmxlSXRlbS5zZXRUZXh0KC0xLCBudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdGFibGVJdGVtLnNldFRleHQoMCwgbnVsbCk7CQkKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3Igc3RyaW5nID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfSAKLQotCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGFibGVJSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0QmFja2dyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoZWNrZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEZvbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb3JlZ3JvdW5kSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JheWVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUJvdW5kc0kiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEltYWdlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VJbmRlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0QmFja2dyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldENoZWNrZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0R3JheWVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VJbmRlbnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RhYmxlSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UYWJsZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZEkiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzSSIpKSB0ZXN0X2dldEJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENoZWNrZWQiKSkgdGVzdF9nZXRDaGVja2VkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250IikpIHRlc3RfZ2V0Rm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9udEkiKSkgdGVzdF9nZXRGb250SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpKSB0ZXN0X2dldEZvcmVncm91bmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvcmVncm91bmRJIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEdyYXllZCIpKSB0ZXN0X2dldEdyYXllZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SW1hZ2VCb3VuZHNJIikpIHRlc3RfZ2V0SW1hZ2VCb3VuZHNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUkiKSkgdGVzdF9nZXRJbWFnZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSW5kZW50IikpIHRlc3RfZ2V0SW1hZ2VJbmRlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEkiKSkgdGVzdF9nZXRUZXh0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDaGVja2VkWiIpKSB0ZXN0X3NldENoZWNrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpKSB0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRHcmF5ZWRaIikpIHRlc3Rfc2V0R3JheWVkWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UiKSkgdGVzdF9zZXRJbWFnZUlMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZUluZGVudEkiKSkgdGVzdF9zZXRJbWFnZUluZGVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1UYWJsZSB0YWJsZTsKLVRhYmxlSXRlbSB0YWJsZUl0ZW07Ci0KLS8vIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc28gdGhlIGF1dG8tZ2VuIHRvb2wga2VlcHMgaXQKLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudCgpIHsKLQlpZiAoIHRhYmxlSXRlbSAhPSBudWxsICkgdGFibGVJdGVtLmRpc3Bvc2UoKTsKLQlpZiAoIHRhYmxlICE9IG51bGwgKSB0YWJsZS5kaXNwb3NlKCk7Ci0JdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIDApOwotCXRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIDApOwotCXNldFdpZGdldCh0YWJsZUl0ZW0pOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmYwMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogQXV0b21hdGVkIFRlc3QgU3VpdGUgZm9yIGNsYXNzIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCBleHRlbmRzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfU2Nyb2xsYWJsZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RleHQoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXNoZWxsLnBhY2soKTsKLQlzaGVsbC5vcGVuKCk7Ci0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOyAvLyB1c2UgbXVsdGktbGluZSBieSBkZWZhdWx0Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci0Jc2hlbGwuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKSB7Ci0JdHJ5IHsKLQkJdGV4dCA9IG5ldyBUZXh0KG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQlpbnRbXSBjYXNlcyA9IHswLCBTV1QuU0lOR0xFLCBTV1QuTVVMVEksIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwsIAotCQkJCQlTV1QuV1JBUH07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlcy5sZW5ndGg7IGkrKykKLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBjYXNlc1tpXSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkTW9kaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Nb2RpZnlMaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JCi0JLy8gdGVzdCB3aGV0aGVyIGFsbCBjb250ZW50IG1vZGlmeWluZyBBUEkgbWV0aG9kcyBzZW5kIGEgTW9kaWZ5IGV2ZW50CQotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KCJuZXcgdGV4dCIpOwkKLQlhc3NlcnRUcnVlKCJzZXRUZXh0IGRvZXMgbm90IHNlbmQgZXZlbnQiLCBsaXN0ZW5lckNhbGxlZCk7Ci0KLQlsaXN0ZW5lckNhbGxlZCA9IGZhbHNlOwkKLQl0ZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkvLyBjYXVzZSB0byBjYWxsIHRoZSBsaXN0ZW5lci4gCi0JdGV4dC5zZXRUZXh0KCJsaW5lIik7CQotCWFzc2VydFRydWUoIkxpc3RlbmVyIG5vdCByZW1vdmVkIiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRyeSB7Ci0JCXRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCX0KLQl9OwotCXRyeSB7Ci0JCXRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JdGV4dC5zZXRUZXh0KCIxMjM0NSIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDEsMyk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgbGlzdGVuZXJDYWxsZWQgPT0gZmFsc2UpOwotCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCXRyeSB7Ci0JCXRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lcigpIHsKLQlmaW5hbCBTdHJpbmcgbGluZSA9ICJMaW5lMSI7Ci0JZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiTmV3TGluZTEiOwotCWJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQkKLQkvLyB0ZXN0IG51bGwgbGlzdGVuZXIgY2FzZQotCXRyeSB7Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobnVsbCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIsIGV4Y2VwdGlvblRocm93bik7Ci0JCi0JLy8gdGVzdCBhcHBlbmQgY2FzZQotCVZlcmlmeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCAwLCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07CQotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5hcHBlbmQobGluZSk7CQotCWFzc2VydFRydWUoImFwcGVuZCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCi0JLy8gdGVzdCBpbnNlcnQgY2FzZQotCWxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlsaXN0ZW5lckNhbGxlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCA4LCBldmVudC5zdGFydCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlZlcmlmeSBldmVudCBkYXRhIGludmFsaWQiLCA4LCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07CQotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7Ci0JdGV4dC5pbnNlcnQobGluZSk7CQotCWFzc2VydFRydWUoImluc2VydCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSArIG5ld0xpbmUsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCS8vIHRlc3Qgc2V0VGV4dCBjYXNlCi0JbGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHZlcmlmeVRleHQoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWxpc3RlbmVyQ2FsbGVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDAsIGV2ZW50LnN0YXJ0KTsKLQkJCWFzc2VydEVxdWFscygiVmVyaWZ5IGV2ZW50IGRhdGEgaW52YWxpZCIsIDE2LCBldmVudC5lbmQpOwotCQkJYXNzZXJ0RXF1YWxzKCJWZXJpZnkgZXZlbnQgZGF0YSBpbnZhbGlkIiwgbGluZSwgZXZlbnQudGV4dCk7Ci0JCQlldmVudC50ZXh0ID0gbmV3TGluZTsKLQkJfQotCX07CQotCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgic2V0VGV4dCBkb2VzIG5vdCBzZW5kIGV2ZW50IiwgbGlzdGVuZXJDYWxsZWQpOwotCWFzc2VydEVxdWFscygiTGlzdGVuZXIgZmFpbGVkIiwgbmV3TGluZSwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdCByZW1vdmUgY2FzZQotCWxpc3RlbmVyQ2FsbGVkID0gZmFsc2U7CQotCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCXRleHQuc2V0VGV4dChsaW5lKTsJCi0JYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCBsaXN0ZW5lckNhbGxlZCA9PSBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JdHJ5IHsKLQkJdGV4dC5hcHBlbmQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQ1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQiICsgZGVsaW1pdGVyU3RyaW5nKyAiNSIpOwotCWFzc2VydEVxdWFscygiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nICsiNSIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQl0ZXh0LmFwcGVuZCgiNjciKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3IiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRyeSB7Ci0JCXRleHQuYXBwZW5kKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIG9uIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQ1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQotCXRleHQuc2V0VGV4dCgiMDEiKTsKLQl0ZXh0LmFwcGVuZCgiMjMiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjMiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5hcHBlbmQoIjQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjUiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5hcHBlbmQoIjY3Iik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2NyIsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbGVhclNlbGVjdGlvbigpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jbGVhclNlbGVjdGlvbigpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQkvLyBzdXBlciBjbGFzcyB0ZXN0IGlzIHN1ZmZpY2llbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb3B5KCkgewotCXRleHQuY29weSgpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmNvcHkoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDAwMDAiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIiKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMDAwMCIsIHRleHQuZ2V0VGV4dCgpKTsKLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5jb3B5KCk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIiIpOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjAwMDAwIiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2N1dCgpIHsKLQl0ZXh0LmN1dCgpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA1KTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiMDE1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY3V0KCk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuY3V0KCk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNSk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIjAxNTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0TGluZU51bWJlcigpIHsKLQl0ZXh0LnNldEJvdW5kcygwLCAwLCA1MDAsIDUwMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAwKTsKLQl0ZXh0LnNldFRleHQoIkxpbmUwXHJcbiIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDApOwotCi0JdGV4dC5hcHBlbmQoIkxpbmUxIik7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRDYXJldExpbmVOdW1iZXIoKSA9PSAxKTsKLQlTdHJpbmcgbmV3VGV4dCA9ICJMaW5lLTFcclxuIjsKLQl0ZXh0LnNldFNlbGVjdGlvbigwLDApOwotCXRleHQuaW5zZXJ0KG5ld1RleHQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbigwLDApOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0Q2FyZXRMaW5lTnVtYmVyKCkgPT0gMCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oOCw4KTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldENhcmV0TGluZU51bWJlcigpID09IDEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldENhcmV0TG9jYXRpb24oKSB7Ci0JLy8gYWNjb3VudCBmb3IgaW5zZXRzIHdoZW4gYXNzZXJ0aW5nCi0JdGV4dC5zZXRTaXplKDIwMCw1MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCwwKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueCA+PSAwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS55ID49IDApOwotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTFcclxuTGluZTIiKTsKLQl0ZXh0Lmluc2VydCgiIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueCA+PSAwKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS55ID49IDApOwotCXRleHQuc2V0U2VsZWN0aW9uKDEsMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRDYXJldExvY2F0aW9uKCkueCA+IDApOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLnkgPj0gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FyZXRQb3NpdGlvbigpIHsKLQl0ZXh0LnNldFRleHQoIkxpbmUiKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldENhcmV0UG9zaXRpb24oKSA9PSAwKTsKLQl0ZXh0LmFwcGVuZCgiMTIzIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldFBvc2l0aW9uKCkgPT0gNyk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMSwzKTsKLQl0ZXh0Lmluc2VydCgiMTIzIik7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRDYXJldFBvc2l0aW9uKCkgPT0gNCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2hhckNvdW50KCkgewotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZysiNjc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEgICsgZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldENoYXJDb3VudCgpKTsgLy9taWdodCBiZSBib2d1cyBvbiBVTklYCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0XHQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTIsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCi0JLy8KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKDExLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZysiNjc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTEgICsgZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldENoYXJDb3VudCgpKTsgLy9taWdodCBiZSBib2d1cyBvbiBVTklYCi0KLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldENoYXJDb3VudCgpKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0XHQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMTIsIHRleHQuZ2V0Q2hhckNvdW50KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygxMSwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0VGV4dCgiMDEyMzQ1IisgZGVsaW1pdGVyU3RyaW5nICsgIjY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygxMSAgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0Q2hhckNvdW50KCkpOyAvL21pZ2h0IGJlIGJvZ3VzIG9uIFVOSVgKLQl9Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JaWYgKCFTd3RKdW5pdC5pc0FJWCkgewkKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNFx0NTY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygxMiwgdGV4dC5nZXRDaGFyQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpIHsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCS8vIHRoaXMgbWV0aG9kIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVjaG9DaGFyKCkgewotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldEVjaG9DaGFyKCdhJyk7Ci0JYXNzZXJ0RXF1YWxzKCdhJywgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRFZGl0YWJsZSgpIHsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IGZhbHNlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRFZGl0YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVDb3VudCgpIHsKLQl0ZXh0LnNldEJvdW5kcygwLCAwLCA1MDAsIDUwMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCXRleHQuYXBwZW5kKCJkZGRhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkYXNkYXNkYXNkYXNkIiArIGRlbGltaXRlclN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci0JdGV4dC5hcHBlbmQoImRkZGFzZCIgKyBkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0LmFwcGVuZCgiZGRhc2Rhc2Rhc2Rhc2QiICsgZGVsaW1pdGVyU3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMSwgdGV4dC5nZXRMaW5lQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluZURlbGltaXRlcigpIHsKLQlTdHJpbmcgcGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKLQlTdHJpbmcgZGVsaW1pdGVyID0gdGV4dC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JaWYgKHBsYXRmb3JtLmVxdWFscygid2luMzIiKSkgewotCQlhc3NlcnRUcnVlKCI6YToiLCBkZWxpbWl0ZXIuZXF1YWxzKCJcclxuIikpOwotCX0gZWxzZSBpZiAocGxhdGZvcm0uZXF1YWxzKCJtb3RpZiIpKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIGRlbGltaXRlci5lcXVhbHMoIlxuIikpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRMaW5lSGVpZ2h0KCkgewotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0TGluZUhlaWdodCgpID4gMCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZW50YXRpb24oKSB7Ci0JLy8gdGVzdGVkIGluIHNldE9yaWVudGF0aW9uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ldyBQb2ludCgyLCAyKSkpOwotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgyLCAzKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDIsIDMpKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDExKSk7Ci0JYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDMsIDExKSkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbig0KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoNCwgNCkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb24oKS5lcXVhbHMobmV3IFBvaW50KDExLCAxMSkpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMywgMikpOwkKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFNlbGVjdGlvbigpLmVxdWFscyhuZXcgUG9pbnQoMiwgMykpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgNCk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT0yKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpPT05KTsKLQl0ZXh0LnNldFRleHQoIjAxMjNcbjQ1Njc4OTAiKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk9PTApOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydFRydWUoIjplOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09Mik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMiwgMTIpOwotCWFzc2VydFRydWUoIjpmOiIsIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKT09MTApOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvblRleHQoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDMsIDcpOwotCWFzc2VydEVxdWFscygiMzQ1NiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUYWJzKCkgewotCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsKLQkJLy8gQVBJIG5vdCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcyAoZS5nLiwgTW90aWYpCi0JCXRleHQuc2V0VGFicygxKTsKLQkJYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUYWJzKCkgPT0gMSk7Ci0JCXRleHQuc2V0VGFicyg4KTsKLQkJYXNzZXJ0VHJ1ZSgiOmI6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JCXRleHQuc2V0VGV4dCgiTGluZVx0MVxyXG4iKTsKLQkJYXNzZXJ0VHJ1ZSgiOmM6IiwgdGV4dC5nZXRUYWJzKCkgPT0gOCk7Ci0JCXRleHQuc2V0VGFicyg3KTsKLQkJYXNzZXJ0VHJ1ZSgiOmQ6IiwgdGV4dC5nZXRUYWJzKCkgPT0gNyk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRleHQoKSB7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5zZXRUZXh0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQlTdHJpbmcgc3RyaW5nID0gIjAxMjM0NSIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiNjc4OTAiOwotCXRleHQuc2V0VGV4dChzdHJpbmcpOwotCWFzc2VydEVxdWFscyhzdHJpbmcsIHRleHQuZ2V0VGV4dCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SUkoKSB7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMSwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCJhIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTQpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtNCwtMikpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0yLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsLTEpKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiYSIsIHRleHQuZ2V0VGV4dCgwLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwxKSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygiMzQ1IiwgdGV4dC5nZXRUZXh0KDMsIDUpKTsKLQlhc3NlcnRFcXVhbHMoIjAxMiIsIHRleHQuZ2V0VGV4dCgtMSwgMikpOwotCWFzc2VydEVxdWFscygiMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoMywgMTAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoNSwgMykpOwotCQotCXRleHQuc2V0VGV4dCgiIik7Ci0JdGV4dC5zZXRFY2hvQ2hhcignKicpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTEsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCQotCXRleHQuc2V0VGV4dCgiYSIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC00LC00KSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoLTQsLTIpKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgtMiwtMSkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLC0xKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KC0xLDApKTsKLQlhc3NlcnRFcXVhbHMoImEiLCB0ZXh0LmdldFRleHQoMCwwKSk7Ci0JYXNzZXJ0RXF1YWxzKCJhIiwgdGV4dC5nZXRUZXh0KDAsMSkpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjM0NSIsIHRleHQuZ2V0VGV4dCgzLCA1KSk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFRleHQoLTEsIDIpKTsKLQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDUsIDMpKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0VGV4dExpbWl0KCkgewotCXRleHQuc2V0VGV4dExpbWl0KDEwKTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BJbmRleCgpIHsKLQl0ZXh0LnNldFNpemUoNTAsdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLQl0ZXh0LnNldFRvcEluZGV4KDApOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCXRleHQuYXBwZW5kKGRlbGltaXRlclN0cmluZyArIjAxMjM0NTY3ODkiKTsKLQl0ZXh0LnNldFRvcEluZGV4KDEpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMTcpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvcFBpeGVsKCkgewotCXRleHQuc2V0VGV4dCgiTGluZTBcclxuTGluZTBhXHJcbiIpOwotCi0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IDApOwotCXRleHQuc2V0VG9wSW5kZXgoLTIpOwotCWFzc2VydFRydWUoIjpiOiIsIHRleHQuZ2V0VG9wUGl4ZWwoKSA9PSAwKTsKLQl0ZXh0LnNldFRvcEluZGV4KC0xKTsKLQlhc3NlcnRUcnVlKCI6YzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkpOwotCXRleHQuc2V0U2l6ZSgxMCwgdGV4dC5nZXRMaW5lSGVpZ2h0KCkpOwotCXRleHQuc2V0VG9wSW5kZXgoMik7Ci0JYXNzZXJ0VHJ1ZSgiOmU6IiwgdGV4dC5nZXRUb3BQaXhlbCgpID09IHRleHQuZ2V0TGluZUhlaWdodCgpICogMik7Ci0JdGV4dC5zZXRUb3BJbmRleCgwKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gMCk7Ci0JdGV4dC5zZXRUb3BJbmRleCgzKTsKLQlhc3NlcnRUcnVlKCI6ZzoiLCB0ZXh0LmdldFRvcFBpeGVsKCkgPT0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9pbnNlcnRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0ZXh0LnNldEJvdW5kcygwLCAwLCA1MDAsIDUwMCk7Ci0JdHJ5IHsKLQkJdGV4dC5pbnNlcnQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuaW5zZXJ0KCIiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0Lmluc2VydCgiZnJlZCIpOwotCWFzc2VydEVxdWFscygiZnJlZCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyKTsKLQl0ZXh0Lmluc2VydCgiaGVsbXV0Iik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmhlbG11dGVkIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0Lmluc2VydChkZWxpbWl0ZXJTdHJpbmcpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0cnkgewotCQl0ZXh0Lmluc2VydChudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBvbiBzdHJpbmcgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5pbnNlcnQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuaW5zZXJ0KCJmcmVkIik7Ci0JYXNzZXJ0RXF1YWxzKCJmcmVkIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIpOwotCXRleHQuaW5zZXJ0KCJoZWxtdXQiKTsKLQlhc3NlcnRFcXVhbHMoImZyaGVsbXV0ZWQiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscygxLCB0ZXh0LmdldExpbmVDb3VudCgpKTsKLQl0ZXh0Lmluc2VydChUZXh0LkRFTElNSVRFUik7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRleHQuZ2V0TGluZUNvdW50KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRyeSB7Ci0JCXRleHQuaW5zZXJ0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIG9uIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9pc1Zpc2libGUoKSB7Ci0JLy8gb3ZlcnJpZGluZyB0ZXN0X2lzVmlzaWJsZSgpIGZyb20gQ29udHJvbAotCWNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKGNvbnRyb2wuaXNWaXNpYmxlKCkpOyAgCi0KLQljb250cm9sLnNldFZpc2libGUoZmFsc2UpOwotCWFzc2VydFRydWUoIWNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCi0JaWYgKCFTd3RKdW5pdC5pc0FJWCkgewotCQljb250cm9sLnNldFZpc2libGUodHJ1ZSk7Ci0JCXNoZWxsLnNldFZpc2libGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoIldpbmRvdyBzaG91bGQgYmUgdmlzaWJsZSIsIGNvbnRyb2wuaXNWaXNpYmxlKCkpOwotCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSgiV2luZG93IHNob3VsZCBub3QgYmUgdmlzaWJsZSIsICFjb250cm9sLmlzVmlzaWJsZSgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFzdGUoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMjMwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LmNvcHkoKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzKTsKLQl0ZXh0LnBhc3RlKCk7Ci0JYXNzZXJ0RXF1YWxzKCIyMzAyMzEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiICsgIjAiICsgZGVsaW1pdGVyU3RyaW5nICsgIjEiLCB0ZXh0LmdldFRleHQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuY29weSgpOwotCXRleHQuc2V0U2VsZWN0aW9uKDApOwotCXRleHQucGFzdGUoKTsKLQlhc3NlcnRFcXVhbHMoIjIzMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFRleHQoKSk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMyk7Ci0JdGV4dC5wYXN0ZSgpOwotCWFzc2VydEVxdWFscygiMjMwMjMxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMCIgKyBkZWxpbWl0ZXJTdHJpbmcgKyAiMSIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5jb3B5KCk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JdGV4dC5wYXN0ZSgpOwotCi0JaWYgKGZDaGVja1NXVFBvbGljeSkKLQkJYXNzZXJ0RXF1YWxzKCIwIiArIGRlbGltaXRlclN0cmluZyArICIxIiArICIwIiArIGRlbGltaXRlclN0cmluZyArICIxIiwgdGV4dC5nZXRUZXh0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZE1vZGlmeUxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFNlbGVjdGlvbkxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIGFkZFZlcmlmeUxpc3RlbmVyIG1ldGhvZAotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NlbGVjdEFsbCgpIHsKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQiICsgZGVsaW1pdGVyU3RyaW5nKyI1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LmN1dCgpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5MCIsIHRleHQuZ2V0VGV4dCgpKTsKLQl0ZXh0LnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OTAiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5jdXQoKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQlpZiAoZkNoZWNrQm9ndXNUZXN0Q2FzZXMpIHsKLQkJdGV4dC5zZXRUZXh0KCIwMTIzNCIgKyBkZWxpbWl0ZXJTdHJpbmcrIjU2Nzg5MCIpOwotCQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCQlhc3NlcnRFcXVhbHMoIjAxMjM0IiArIGRlbGltaXRlclN0cmluZysiNTY3ODkwIiwgdGV4dC5nZXRTZWxlY3Rpb25UZXh0KCkpOwotCQl0ZXh0LmN1dCgpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWigpIHsKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldERvdWJsZUNsaWNrRW5hYmxlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotCQotCXRleHQuc2V0RG91YmxlQ2xpY2tFbmFibGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRleHQuZ2V0RG91YmxlQ2xpY2tFbmFibGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVjaG9DaGFyQygpIHsKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JZm9yIChpbnQgaT0wOyBpPDEyODsgaSsrKXsKLQkJdGV4dC5zZXRFY2hvQ2hhcigoY2hhcikgaSk7Ci0JCWFzc2VydEVxdWFscygoY2hhcilpLCB0ZXh0LmdldEVjaG9DaGFyKCkpOwotCX0KLQkKLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRFY2hvQ2hhcignYScpOwotCWFzc2VydEVxdWFscygnYScsIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0KLQl0ZXh0LnNldEVjaG9DaGFyKChjaGFyKSAwKTsKLQlhc3NlcnRFcXVhbHMoKGNoYXIpMCwgdGV4dC5nZXRFY2hvQ2hhcigpKTsKLQotCXRleHQuc2V0RWNob0NoYXIoJ1xuJyk7Ci0JYXNzZXJ0RXF1YWxzKCdcbicsIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0KLQlmb3IgKGludCBpPTA7IGk8MTI4OyBpKyspewotCQl0ZXh0LnNldEVjaG9DaGFyKChjaGFyKSBpKTsKLQkJYXNzZXJ0RXF1YWxzKChjaGFyKWksIHRleHQuZ2V0RWNob0NoYXIoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVkaXRhYmxlWigpIHsKLQl0ZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSB0cnVlKTsKLQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gZmFsc2UpOwotCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCWFzc2VydFRydWUoIjpjOiIsIHRleHQuZ2V0RWRpdGFibGUoKSA9PSBmYWxzZSk7Ci0JdGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0ZXh0LmdldEVkaXRhYmxlKCkgPT0gdHJ1ZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpIHsKLQlGb250RGF0YSBmb250RGF0YSA9IHRleHQuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0JaW50IGxpbmVIZWlnaHQ7Ci0JRm9udCBmb250OwotCQotCWZvbnQgPSBuZXcgRm9udCh0ZXh0LmdldERpc3BsYXkoKSwgZm9udERhdGEuZ2V0TmFtZSgpLCA4LCBmb250RGF0YS5nZXRTdHlsZSgpKTsKLQl0ZXh0LnNldEZvbnQoZm9udCk7Ci0JbGluZUhlaWdodCA9IHRleHQuZ2V0TGluZUhlaWdodCgpOwotCXRleHQuc2V0Rm9udChudWxsKTsKLQlmb250LmRpc3Bvc2UoKTsKLQlmb250ID0gbmV3IEZvbnQodGV4dC5nZXREaXNwbGF5KCksIGZvbnREYXRhLmdldE5hbWUoKSwgMTIsIGZvbnREYXRhLmdldFN0eWxlKCkpOwotCXRleHQuc2V0Rm9udChmb250KTsKLQlhc3NlcnRUcnVlKCI6YToiLCB0ZXh0LmdldExpbmVIZWlnaHQoKSA+IGxpbmVIZWlnaHQgJiYgZm9udC5lcXVhbHModGV4dC5nZXRGb250KCkpKTsKLQl0ZXh0LnNldEZvbnQobnVsbCk7Ci0JZm9udC5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0T3JpZW50YXRpb25JKCkgewotCXRleHQuc2V0T3JpZW50YXRpb24oU1dULlJJR0hUX1RPX0xFRlQpOwotCWlmICgodGV4dC5nZXRTdHlsZSgpICYgU1dULk1JUlJPUkVEKSAhPSAwKSB7Ci0JCWFzc2VydFRydWUoIjphOiIsIHRleHQuZ2V0T3JpZW50YXRpb24oKT09U1dULlJJR0hUX1RPX0xFRlQpOwotCX0KLQl0ZXh0LnNldE9yaWVudGF0aW9uKFNXVC5MRUZUX1RPX1JJR0hUKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldE9yaWVudGF0aW9uKCk9PVNXVC5MRUZUX1RPX1JJR0hUKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZWRyYXdaKCkgewotCXRleHQuc2V0UmVkcmF3KGZhbHNlKTsKLQl0ZXh0LnNldFJlZHJhdyh0cnVlKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25JKCkgewotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0U2VsZWN0aW9uVGV4dCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigzLCA3KTsKLQlhc3NlcnRFcXVhbHMoIjM0NTYiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oMywgMCk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFNlbGVjdGlvblRleHQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKSB7Ci0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjMiICsgZGVsaW1pdGVyU3RyaW5nICsiNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDEwMCk7Ci0JYXNzZXJ0RXF1YWxzKDkgKyBkZWxpbWl0ZXJTdHJpbmcubGVuZ3RoKCksIHRleHQuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCA0KTsKLQlhc3NlcnRFcXVhbHMoMiwgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMDApOwotCWFzc2VydEVxdWFscyg5LCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiMDEyMyIrIGRlbGltaXRlclN0cmluZysiNDU2Nzg5MCIpOwotCWFzc2VydEVxdWFscygwLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRleHQuc2V0U2VsZWN0aW9uKDIsIDQpOwotCWFzc2VydEVxdWFscygyLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCWlmIChmQ2hlY2tCb2d1c1Rlc3RDYXNlcykgewotCQl0ZXh0LnNldFNlbGVjdGlvbigyLCAxMDApOwotCQlhc3NlcnRFcXVhbHMoOSArZGVsaW1pdGVyU3RyaW5nLmxlbmd0aCgpLCB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXRleHQuc2V0VGV4dCgiZHNkc2Rhc2RzbGFhc2RhcyIpOwotCXRyeSB7Ci0JCXRleHQuc2V0U2VsZWN0aW9uKChQb2ludCkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMiksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDIpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIsIDMpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDMsIDExKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5zZXRTZWxlY3Rpb24oNCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBQb2ludCg0LCA0KSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbigxMDApOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMTEsIDExKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2V0VGV4dCgiZHNkc2Rhc2RzbGFhc2RhcyIpOwotCXRyeSB7Ci0JCXRleHQuc2V0U2VsZWN0aW9uKChQb2ludCkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbiA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0KLQl0ZXh0LnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMiwgMikpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoMiwgMiksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDMsIDIpKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDIsIDMpLCB0ZXh0LmdldFNlbGVjdGlvbigpKTsKLQotCXRleHQuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgzLCAxMDApKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDMsIDExKSwgdGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkvLyB0ZXN0cyBhIFNJTkdMRSBsaW5lIHRleHQgZWRpdG9yCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7Ci0JCi0JdGV4dC5zZXRUZXh0KCIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0U2VsZWN0aW9uKDQpOwotCWFzc2VydEVxdWFscyhuZXcgUG9pbnQoNCwgNCksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCi0JdGV4dC5zZXRTZWxlY3Rpb24oMTAwKTsKLQlhc3NlcnRFcXVhbHMobmV3IFBvaW50KDExLCAxMSksIHRleHQuZ2V0U2VsZWN0aW9uKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRhYnNJKCkgewotCWlmIChTd3RKdW5pdC5pc01vdGlmKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCXRleHQuc2V0VGFicyhpKTsKLQkJCWFzc2VydEVxdWFscyg4LCB0ZXh0LmdldFRhYnMoKSk7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0JCQl0ZXh0LnNldFRhYnMoaSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSwgdGV4dC5nZXRUYWJzKCkpOwotCQl9Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMaW1pdEkoKSB7Ci0JYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkKLQl0ZXh0LnNldFRleHRMaW1pdCgxMCk7Ci0JYXNzZXJ0VHJ1ZSgiOmE6IiwgdGV4dC5nZXRUZXh0TGltaXQoKSA9PSAxMCk7Ci0KLQl0ZXh0LnNldFRleHRMaW1pdChUZXh0LkxJTUlUKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0ZXh0LmdldFRleHRMaW1pdCgpID09IFRleHQuTElNSVQpOwotCi0JdHJ5IHsKLQkJdGV4dC5zZXRUZXh0TGltaXQoMCk7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQlleGNlcHRpb25UaHJvd24gPSB0cnVlOwotCX0KLQlhc3NlcnRUcnVlKCI6YzoiLCBleGNlcHRpb25UaHJvd24pOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQl0cnkgewotCQl0ZXh0LnNldFRleHQobnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRleHQuc2V0VGV4dCgiIik7Ci0JCi0JLy8gdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCXRleHQuc2V0VGV4dCgiIik7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoKSk7Ci0JaWYgKGZDaGVja0JvZ3VzVGVzdENhc2VzKSB7Ci0JCXRleHQuc2V0VGV4dCgiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZysgIjY3ODkwIik7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQ1IiArIGRlbGltaXRlclN0cmluZyArIjY3ODkwIiwgdGV4dC5nZXRUZXh0KCkpOwotCX0KLQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgpKTsKLQotCXRleHQuc2V0VGV4dCgiMDEyMzQ1Njc4OTAiKTsKLQlhc3NlcnRFcXVhbHMoIjM0NSIsIHRleHQuZ2V0VGV4dCgzLCA1KSk7Ci0JYXNzZXJ0RXF1YWxzKCIwMTIiLCB0ZXh0LmdldFRleHQoLTEsIDIpKTsKLQlhc3NlcnRFcXVhbHMoIjM0NTY3ODkwIiwgdGV4dC5nZXRUZXh0KDMsIDEwMCkpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KDUsIDMpKTsKLQkKLQl0ZXh0LnNldFRleHQoIiIpOwotCWFzc2VydEVxdWFscygiIiwgdGV4dC5nZXRUZXh0KC0xLCAwKSk7Ci0JYXNzZXJ0RXF1YWxzKCIiLCB0ZXh0LmdldFRleHQoMCwgMTApKTsKLQlhc3NlcnRFcXVhbHMoIiIsIHRleHQuZ2V0VGV4dCgxLCAwKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSW5kZXhJKCkgewotCWludCBudW1iZXIgPSAxMDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LmFwcGVuZCgiMDEyMzRcbiIpOwotCX0KLQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCXRleHQuc2V0VG9wSW5kZXgoaSk7Ci0JCWFzc2VydEVxdWFscyhpLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCX0KLQkKLQl0ZXh0LnNldFRvcEluZGV4KG51bWJlcis1KTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0ZXh0LmdldFRvcEluZGV4KCkpOwotCQotCS8vIHRlc3RzIGEgU0lOR0xFIGxpbmUgdGV4dCBlZGl0b3IKLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLQkKLQl0ZXh0LnNldFRleHQoIjAxMjM0NTY3ODkwIik7Ci0JdGV4dC5hcHBlbmQoVGV4dC5ERUxJTUlURVIgKyIwMTIzNDU2Nzg5MCIpOwotCXRleHQuc2V0VG9wSW5kZXgoMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRleHQuZ2V0VG9wSW5kZXgoKSk7Ci0JdGV4dC5zZXRUb3BJbmRleCgxKTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl0ZXh0LnNldFRvcEluZGV4KDE3KTsKLQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQotCXRleHQuc2V0VGV4dCgiIik7CQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKLQkJdGV4dC5hcHBlbmQoIjAxMjM0IiArIFRleHQuREVMSU1JVEVSKTsKLQl9Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQl0ZXh0LnNldFRvcEluZGV4KGkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGV4dC5nZXRUb3BJbmRleCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LnNldFRleHQoIjAwMDAwIik7Ci0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JCi0JLy8gdGhpcyBtZXRob2QgdGVzdHMgYSBTSU5HTEUgbGluZSB0ZXh0IGVkaXRvcgotCW1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCQotCXRleHQuc2hvd1NlbGVjdGlvbigpOwotCi0JdGV4dC5zZWxlY3RBbGwoKTsKLQl0ZXh0LnNob3dTZWxlY3Rpb24oKTsKLQotCi0JdGV4dC5zZXRUZXh0KCIwMDAwMCIpOwotCXRleHQuc2VsZWN0QWxsKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0KLQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JdGV4dC5zaG93U2VsZWN0aW9uKCk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVGV4dCgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hcHBlbmRMamF2YV9sYW5nX1N0cmluZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY2xlYXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb3B5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jdXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENhcmV0TGluZU51bWJlciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRMb2NhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2FyZXRQb3NpdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q2hhckNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREb3VibGVDbGlja0VuYWJsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEVjaG9DaGFyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRFZGl0YWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0TGluZUNvdW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lRGVsaW1pdGVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRMaW5lSGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRPcmllbnRhdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGFicyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VGV4dElJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUZXh0TGltaXQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRvcEluZGV4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb3BQaXhlbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Bhc3RlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVWZXJpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1ZlcmlmeUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZWxlY3RBbGwiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEVjaG9DaGFyQyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RWRpdGFibGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRPcmllbnRhdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlZHJhd1oiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbkkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFNlbGVjdGlvbklJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUYWJzSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExpbWl0SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJbmRleEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19TY3JvbGxhYmxlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZE1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9hZGRNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfYWRkVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X2FkZFZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FwcGVuZExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfYXBwZW5kTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NsZWFyU2VsZWN0aW9uIikpIHRlc3RfY2xlYXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvcHkiKSkgdGVzdF9jb3B5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jdXQiKSkgdGVzdF9jdXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0TGluZU51bWJlciIpKSB0ZXN0X2dldENhcmV0TGluZU51bWJlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2FyZXRMb2NhdGlvbiIpKSB0ZXN0X2dldENhcmV0TG9jYXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENhcmV0UG9zaXRpb24iKSkgdGVzdF9nZXRDYXJldFBvc2l0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDaGFyQ291bnQiKSkgdGVzdF9nZXRDaGFyQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCIpKSB0ZXN0X2dldERvdWJsZUNsaWNrRW5hYmxlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWNob0NoYXIiKSkgdGVzdF9nZXRFY2hvQ2hhcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RWRpdGFibGUiKSkgdGVzdF9nZXRFZGl0YWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUNvdW50IikpIHRlc3RfZ2V0TGluZUNvdW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRMaW5lRGVsaW1pdGVyIikpIHRlc3RfZ2V0TGluZURlbGltaXRlcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0TGluZUhlaWdodCIpKSB0ZXN0X2dldExpbmVIZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldE9yaWVudGF0aW9uIikpIHRlc3RfZ2V0T3JpZW50YXRpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uVGV4dCIpKSB0ZXN0X2dldFNlbGVjdGlvblRleHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRhYnMiKSkgdGVzdF9nZXRUYWJzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0IikpIHRlc3RfZ2V0VGV4dCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dElJIikpIHRlc3RfZ2V0VGV4dElJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUZXh0TGltaXQiKSkgdGVzdF9nZXRUZXh0TGltaXQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcEluZGV4IikpIHRlc3RfZ2V0VG9wSW5kZXgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFRvcFBpeGVsIikpIHRlc3RfZ2V0VG9wUGl4ZWwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luc2VydExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3RfaW5zZXJ0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Bhc3RlIikpIHRlc3RfcGFzdGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZU1vZGlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfTW9kaWZ5TGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVNb2RpZnlMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX01vZGlmeUxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlVmVyaWZ5TGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19WZXJpZnlMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVZlcmlmeUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVmVyaWZ5TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NlbGVjdEFsbCIpKSB0ZXN0X3NlbGVjdEFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RG91YmxlQ2xpY2tFbmFibGVkWiIpKSB0ZXN0X3NldERvdWJsZUNsaWNrRW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVjaG9DaGFyQyIpKSB0ZXN0X3NldEVjaG9DaGFyQygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0RWRpdGFibGVaIikpIHRlc3Rfc2V0RWRpdGFibGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0T3JpZW50YXRpb25JIikpIHRlc3Rfc2V0T3JpZW50YXRpb25JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uSSIpKSB0ZXN0X3NldFNlbGVjdGlvbkkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbklJIikpIHRlc3Rfc2V0U2VsZWN0aW9uSUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFNlbGVjdGlvbkxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQiKSkgdGVzdF9zZXRTZWxlY3Rpb25Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUYWJzSSIpKSB0ZXN0X3NldFRhYnNJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGltaXRJIikpIHRlc3Rfc2V0VGV4dExpbWl0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb3BJbmRleEkiKSkgdGVzdF9zZXRUb3BJbmRleEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkiKSkgdGVzdF9jb25zaXN0ZW5jeV9Nb2RpZnkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCgpOwotCWVsc2Ugc3VwZXIucnVuVGVzdCgpOwotfQotCi0vKiBjdXN0b20gKi8KLVRleHQgdGV4dDsKLVN0cmluZyBkZWxpbWl0ZXJTdHJpbmc7Ci0KLS8qKgotICogQ2xlYW4gdXAgdGhlIGVudmlyb25tZW50IGZvciBhIG5ldyB0ZXN0LgotICogCi0gKiBAcGFyYW0gc2luZ2xlIHRydWUgaWYgdGhlIG5ldyB0ZXh0IHdpZGdldCBzaG91bGQgYmUgc2luZ2xlLWxpbmUuCi0gKi8KLXByaXZhdGUgdm9pZCBtYWtlQ2xlYW5FbnZpcm9ubWVudChib29sZWFuIHNpbmdsZSkgewotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotCWlmICggdGV4dCAhPSBudWxsICkgdGV4dC5kaXNwb3NlKCk7Ci0KLQlpZiAoIHNpbmdsZSA9PSB0cnVlICkKLQkJdGV4dCA9IG5ldyBUZXh0KHNoZWxsLCBTV1QuU0lOR0xFKTsJCi0JZWxzZQotCQl0ZXh0ID0gbmV3IFRleHQoc2hlbGwsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0Jc2V0V2lkZ2V0KHRleHQpOwotCWRlbGltaXRlclN0cmluZyA9IFRleHQuREVMSU1JVEVSOwotfQotcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0KFdpZGdldCB3KSB7Ci0JdGV4dCA9IChUZXh0KXc7Ci0Jc3VwZXIuc2V0V2lkZ2V0KHcpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uICgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEzLCAxMCwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTW9kaWZ5KCkgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJ2EnLCAwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBtYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDEwLCAxMCwgMywgQ29uc2lzdGVuY3lVdGlsaXR5LkVTQ0FQRV9NRU5VLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0spOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCA1MCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0RSQUcpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MTg3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0b29sQmFyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXRyeSB7Ci0JCW5ldyBUb29sQmFyKG51bGwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVNpemVJSVooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2NvbXB1dGVTaXplSUlaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9jb21wdXRlVHJpbUlJSUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0b29sQmFyLmdldEl0ZW1Db3VudCgpPT1pKTsKLQkgIAluZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1JKCkgewotCWludCBudW1iZXIgPSA1OwotCVRvb2xJdGVtW10gaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCQlhc3NlcnRUcnVlKCI6YToiLCB0b29sQmFyLmdldEl0ZW0oaSk9PWl0ZW1zW2ldKTsKLQl9Ci0KLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCW51bWJlciA9IDU7Ci0JaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQl0cnkgewotCQl0b29sQmFyLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbXMoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVG9vbEl0ZW1bXSBpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWFzc2VydEVxdWFscyhpdGVtcywgdG9vbEJhci5nZXRJdGVtcygpKTsKLQkKLQl0b29sQmFyLmdldEl0ZW1zKClbMF0uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVG9vbEl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0sIHRvb2xCYXIuZ2V0SXRlbXMoKSk7Ci0KLQl0b29sQmFyLmdldEl0ZW1zKClbM10uZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscyhuZXcgVG9vbEl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdG9vbEJhci5nZXRJdGVtcygpKTsKLQotCXRvb2xCYXIuZ2V0SXRlbXMoKVsxXS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUb29sSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1szXX0sIHRvb2xCYXIuZ2V0SXRlbXMoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Um93Q291bnQoKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuV1JBUCk7Ci0JaW50IG51bWJlciA9IDU7Ci0JVG9vbEl0ZW1bXSBpdGVtcyA9IG5ldyBUb29sSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JICAJaXRlbXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWFzc2VydFRydWUoIjphOiIgKyB0b29sQmFyLmdldFJvd0NvdW50KCksIHRvb2xCYXIuZ2V0Um93Q291bnQoKT09bnVtYmVyKTsgIC8vPz8/PyAgYmVjYXVzZSBvZiBTaXplKDAsIDApCi0KLQl0b29sQmFyID0gbmV3IFRvb2xCYXIoc2hlbGwsIDApOwotCW51bWJlciA9IDU7Ci0JaXRlbXMgPSBuZXcgVG9vbEl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaTxudW1iZXIgOyBpKyspewotCSAgCWl0ZW1zW2ldID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIDApOwotCX0KLQlhc3NlcnRUcnVlKCI6YToiLCB0b29sQmFyLmdldFJvd0NvdW50KCk9PTEpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDEwOwotCVRvb2xJdGVtW10gdGlzID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCWFzc2VydFRydWUoIjphOiIgKyBpLCB0b29sQmFyLmluZGV4T2YodGlzW2ldKT09aSk7Ci0JfQotCi0JbnVtYmVyID0gMTA7Ci0JdGlzID0gbmV3IFRvb2xJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGk8bnVtYmVyIDsgaSsrKXsKLQkgIAl0aXNbaV0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgMCk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpPG51bWJlciA7IGkrKyl7Ci0JCXRyeSB7Ci0JCQl0b29sQmFyLmluZGV4T2YobnVsbCk7CQkKLQkJCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHRvb2xJdGVtID09IG51bGwiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFyKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbXB1dGVTaXplSUlaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb21wdXRlVHJpbUlJSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Um93Q291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGUubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVNpemVJSVoiKSkgdGVzdF9jb21wdXRlU2l6ZUlJWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29tcHV0ZVRyaW1JSUlJIikpIHRlc3RfY29tcHV0ZVRyaW1JSUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJdGVtQ291bnQiKSkgdGVzdF9nZXRJdGVtQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJvd0NvdW50IikpIHRlc3RfZ2V0Um93Q291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2luZGV4T2ZMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0iKSkgdGVzdF9pbmRleE9mTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0IikpIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRHJhZ0RldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1wcm90ZWN0ZWQgVG9vbEJhciB0b29sQmFyOwotCi1wcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihWZWN0b3IgZXZlbnRzKSB7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCBTV1QuRkxBVCB8IFNXVC5IT1JJWk9OVEFMKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQlUb29sSXRlbSBpdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJaXRlbS5zZXRUZXh0KCJUb29sQmFyIiArIGkpOwotCQlpdGVtLnNldFRvb2xUaXBUZXh0KCJUb29sSXRlbSBUb29sVGlwIiArIGkpOwotCQlob29rRXhwZWN0ZWRFdmVudHMoaXRlbSwgZ2V0VGVzdE5hbWUoKSwgZXZlbnRzKTsKLQl9Ci0Jc2V0V2lkZ2V0KHRvb2xCYXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVG9vbEJhcihldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTMsIDEwLCAwLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuS0VZX1BSRVNTLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KCcgJywgMzIsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUb29sQmFyKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCg1MCwgMTUsIDMsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9DTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRvb2xCYXIoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAyMCwgNTAsIDIwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfRFJBRywgZXZlbnRzKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNGIwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbQotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW0KLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0gZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0gewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sSXRlbShTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdG9vbEJhciA9IG5ldyBUb29sQmFyKHNoZWxsLCAwKTsKLQl0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCAwKTsgCi0Jc2V0V2lkZ2V0KHRvb2xJdGVtKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySSgpIHsKLQl0cnkgewotCQluZXcgVG9vbEl0ZW0obnVsbCwgU1dULk5VTEwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEJhcklJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Qm91bmRzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRCb3VuZHMgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb250cm9sKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRDb250cm9sIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEVuYWJsZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldEVuYWJsZWQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRIb3RJbWFnZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0SG90SW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRQYXJlbnQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFBhcmVudCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFNlbGVjdGlvbigpIHsKLQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbS5nZXRTZWxlY3Rpb24oKQotCXdhcm5VbmltcGwoICJUZXN0IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0udGVzdF81X2dldFNlbGVjdGlvbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFRvb2xUaXBUZXh0KCkgewotCXRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkIik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRvb2xJdGVtLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKCJmcmVkIikpOwotCXRvb2xJdGVtLnNldFRvb2xUaXBUZXh0KCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Iik7Ci0JYXNzZXJ0VHJ1ZSgiOmE6ICIsIHRvb2xJdGVtLmdldFRvb2xUaXBUZXh0KCkuZXF1YWxzKCJmcmVkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpZHRoKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRXaWR0aCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2lzRW5hYmxlZCgpIHsKLQkvLyBUZXN0IGZvciBtZXRob2QgYm9vbGVhbiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbS5pc0VuYWJsZWQoKQotCXdhcm5VbmltcGwoICJUZXN0IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVG9vbEl0ZW0udGVzdF83X2lzRW5hYmxlZCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldENvbnRyb2xMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29udHJvbCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEVuYWJsZWRaKCkgewotCS8vIFRlc3QgZm9yIG1ldGhvZCB2b2lkIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtLnNldEVuYWJsZWQoYm9vbGVhbikKLQl3YXJuVW5pbXBsKCAiVGVzdCBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtLnRlc3RfOF9zZXRFbmFibGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SG90SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRIb3RJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvblooKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFNlbGVjdGlvblogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmcgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRXaWR0aEkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldFdpZHRoSSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xJdGVtKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJvdW5kcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29udHJvbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGlzYWJsZWRJbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SG90SW1hZ2UiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRUb29sVGlwVGV4dCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0V2lkdGgiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2lzRW5hYmxlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q29udHJvbExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db250cm9sIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXREaXNhYmxlZEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RW5hYmxlZFoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb25aIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFRvb2xUaXBUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFdpZHRoSSIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0l0ZW0ubWV0aG9kTmFtZXMoKSk7IC8vIGFkZCBzdXBlcmNsYXNzIG1ldGhvZCBuYW1lcwotCXJldHVybiBtZXRob2ROYW1lczsKLX0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQlpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1Rvb2xCYXJJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Ub29sQmFySUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCb3VuZHMiKSkgdGVzdF9nZXRCb3VuZHMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbnRyb2wiKSkgdGVzdF9nZXRDb250cm9sKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREaXNhYmxlZEltYWdlIikpIHRlc3RfZ2V0RGlzYWJsZWRJbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RW5hYmxlZCIpKSB0ZXN0X2dldEVuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhvdEltYWdlIikpIHRlc3RfZ2V0SG90SW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uIikpIHRlc3RfZ2V0U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRUb29sVGlwVGV4dCIpKSB0ZXN0X2dldFRvb2xUaXBUZXh0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXaWR0aCIpKSB0ZXN0X2dldFdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0VuYWJsZWQiKSkgdGVzdF9pc0VuYWJsZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2wiKSkgdGVzdF9zZXRDb250cm9sTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbnRyb2woKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERpc2FibGVkSW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0RGlzYWJsZWRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEVuYWJsZWRaIikpIHRlc3Rfc2V0RW5hYmxlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEhvdEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRTZWxlY3Rpb25aIikpIHRlc3Rfc2V0U2VsZWN0aW9uWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUb29sVGlwVGV4dExqYXZhX2xhbmdfU3RyaW5nIikpIHRlc3Rfc2V0VG9vbFRpcFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotVG9vbEJhciB0b29sQmFyOwotVG9vbEl0ZW0gdG9vbEl0ZW07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZDE3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmFja2VyCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmFja2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyYWNrZXIgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldCB7Ci0JCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmFja2VyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQl0cmFja2VyID0gbmV3IFRyYWNrZXIoc2hlbGwsIDApOwotCXNldFdpZGdldCh0cmFja2VyKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRGlzcGxheUkoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jbG9zZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY2xvc2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZWN0YW5nbGVzKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRSZWN0YW5nbGVzIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U3RpcHBsZWQoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFN0aXBwbGVkIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfb3BlbigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfb3BlbiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFN0aXBwbGVkWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0U3RpcHBsZWRaIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJhY2tlcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jbG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UmVjdGFuZ2xlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U3RpcHBsZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X29wZW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Q3Vyc29yTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19DdXJzb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFJlY3RhbmdsZXMkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19SZWN0YW5nbGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldFN0aXBwbGVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEFsbChUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldC5tZXRob2ROYW1lcygpKTsgLy8gYWRkIHN1cGVyY2xhc3MgbWV0aG9kIG5hbWVzCi0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19Db21wb3NpdGVJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19EaXNwbGF5SSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0Rpc3BsYXlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Nsb3NlIikpIHRlc3RfY2xvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFJlY3RhbmdsZXMiKSkgdGVzdF9nZXRSZWN0YW5nbGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdGlwcGxlZCIpKSB0ZXN0X2dldFN0aXBwbGVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9vcGVuIikpIHRlc3Rfb3BlbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDdXJzb3JMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0N1cnNvciIpKSB0ZXN0X3NldEN1cnNvckxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ3Vyc29yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWN0YW5nbGVzJExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUmVjdGFuZ2xlIikpIHRlc3Rfc2V0UmVjdGFuZ2xlcyRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1JlY3RhbmdsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U3RpcHBsZWRaIikpIHRlc3Rfc2V0U3RpcHBsZWRaKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotCVRyYWNrZXIgdHJhY2tlcjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E2ZjgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUgZXh0ZW5kcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZSB7Ci0KLXB1YmxpYyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgU1dULk1VTFRJKTsKLQlzZXRXaWRnZXQodHJlZSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSgpIHsKLQl0cnkgewotCQl0cmVlID0gbmV3IFRyZWUobnVsbCwgMCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWludFtdIGNhc2VzID0gezAsIFNXVC5CT1JERVJ9OwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2FzZXMubGVuZ3RoOyBpKyspCi0JCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgY2FzZXNbaV0pOwotCi0JY2FzZXMgPSBuZXcgaW50W117MCwgMTAsIDEwMH07Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCW5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoY2FzZXNbal0sIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCQl0cmVlLnJlbW92ZUFsbCgpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb21wdXRlU2l6ZUlJWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfY29tcHV0ZVNpemVJSVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9kZXNlbGVjdEFsbCgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1syXSwgaXRlbXNbNF0sIGl0ZW1zWzVdLCBpdGVtc1sxMF19KTsKLQkKLQlhc3NlcnRFcXVhbHMoNCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNlbGVjdEFsbCgpOwotCWFzc2VydEVxdWFscyhudW1iZXIsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLmRlc2VsZWN0QWxsKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uQ291bnQoKSB7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldENvbHVtbkNvdW50KCkpOwotCVRyZWVDb2x1bW4gY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQlhc3NlcnRFcXVhbHMoMiwgdHJlZS5nZXRDb2x1bW5Db3VudCgpKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSk7Ci0JYXNzZXJ0RXF1YWxzKDMsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMC5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMS5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JY29sdW1uMi5kaXNwb3NlKCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0Q29sdW1uQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sdW1uSSgpIHsKLQl0cnkgewotCQl0cmVlLmdldENvbHVtbigwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQlUcmVlQ29sdW1uIGNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRDb2x1bW4oMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGluZGV4IG91dCBvZiByYW5nZSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIHRyZWUuZ2V0Q29sdW1uKDApKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIHRyZWUuZ2V0Q29sdW1uKDEpKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0cmVlLmdldENvbHVtbigxKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQljb2x1bW4wLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0cmVlLmdldENvbHVtbigwKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRDb2x1bW5zKCkgewotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbnMoKS5sZW5ndGgpOwotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWFzc2VydEVxdWFscygxLCBjb2x1bW5zLmxlbmd0aCk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjAsIGNvbHVtbnNbMF0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldENvbHVtbnMoKS5sZW5ndGgpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULlJJR0hULCAxKTsKLQljb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JYXNzZXJ0RXF1YWxzKDIsIGNvbHVtbnMubGVuZ3RoKTsKLQlhc3NlcnRFcXVhbHMoY29sdW1uMCwgY29sdW1uc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGNvbHVtbjEsIGNvbHVtbnNbMV0pOwotCWNvbHVtbjAuZGlzcG9zZSgpOwotCWNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQlhc3NlcnRFcXVhbHMoMSwgY29sdW1ucy5sZW5ndGgpOwotCWFzc2VydEVxdWFscyhjb2x1bW4xLCBjb2x1bW5zWzBdKTsKLQljb2x1bW4xLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRDb2x1bW5zKCkubGVuZ3RoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRHcmlkTGluZVdpZHRoKCkgewotCXRyZWUuZ2V0R3JpZExpbmVXaWR0aCgpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlYWRlckhlaWdodCgpIHsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRIZWFkZXJIZWlnaHQoKSk7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodHJlZS5nZXRIZWFkZXJIZWlnaHQoKSA+IDApOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SGVhZGVySGVpZ2h0KCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEhlYWRlclZpc2libGUoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JLy90ZXN0ZWQgaW4gdGVzdF9zZXRJdGVtQ291bnRJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUhlaWdodCgpIHsKLQlhc3NlcnRUcnVlKCI6YTogSXRlbSBoZWlnaHQgaXMgMCIsIHRyZWUuZ2V0SXRlbUhlaWdodCgpID4gMCk7Ci0JbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCWFzc2VydFRydWUoIjpiOiBJdGVtIGhlaWdodCBpcyAwIiwgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgPiAwKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SXRlbUkoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgaXRlbXNbaV0sIHRyZWUuZ2V0SXRlbShpKSk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRJdGVtKG51bWJlcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRyZWUuZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRyZWUuZ2V0SXRlbSgtMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEl0ZW1zKCkgewotCWludFtdIGNhc2VzID0gezAsIDEwLCAxMDB9OwotCVRyZWVJdGVtIFtdW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW0gW2Nhc2VzLmxlbmd0aF1bXTsKLQlmb3IgKGludCBqID0gMDsgaiA8IGNhc2VzLmxlbmd0aDsgaisrKSB7Ci0JCWl0ZW1zIFtqXSA9IG5ldyBUcmVlSXRlbSBbY2FzZXMgW2pdXTsKLQl9Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCVRyZWVJdGVtIHRpID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCQkJaXRlbXMgW2pdW2ldID0gdGk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zW2pdLCB0cmVlLmdldEl0ZW1zKCkpOwotCQl0cmVlLnJlbW92ZUFsbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoZmFsc2UpOwotCQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQkJCXRpLnNldFRleHQoU3RyaW5nLnZhbHVlT2YoaSkpOwotCQl9Ci0JCVRyZWVJdGVtW10gaXRlbXMyID0gdHJlZS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zMi5sZW5ndGg7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkpLCBpdGVtczJbaV0uZ2V0VGV4dCgpKTsKLQkJfQotCQl0cmVlLnJlbW92ZUFsbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldExpbmVzVmlzaWJsZSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRIZWFkZXJWaXNpYmxlWgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFBhcmVudEl0ZW0oKSB7Ci0JYXNzZXJ0TnVsbCh0cmVlLmdldFBhcmVudEl0ZW0oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uKCkgewotCS8vIFRlc3RlZCBpbiBzZXRTZWxlY3Rpb24uCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VsZWN0aW9uQ291bnQoKSB7Ci0JaW50IG51bWJlciA9IDE1OwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMywgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDE1LCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117fSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7IC8vIHVzZSBzaW5nbGUtc2VsZWN0aW9uIHRyZWUuCi0JCi0JaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1tudW1iZXItMV19KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbbnVtYmVyLTFdLCBpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXt9KTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUb3BJdGVtKCkgewotLy8gdGVzdGVkIGluIHRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUFsbCgpIHsKLQl0cmVlLnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQotCWludCBudW1iZXIgPSAyMDsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKG51bWJlciwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQl0cmVlLnJlbW92ZUFsbCgpOwotCWFzc2VydEVxdWFscygwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlVHJlZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfVHJlZUxpc3RlbmVyKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZWxlY3RBbGwoKSB7Ci0JaW50IG51bWJlciA9IDU7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdHJlZS5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMobnVtYmVyLCB0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkpOwotCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQodHJ1ZSk7IC8vIHNpbmdsZS1zZWxlY3Rpb24gdHJlZQotCQkKLQlpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JdHJlZS5zZWxlY3RBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVogbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpIHsKLQlhc3NlcnRGYWxzZSh0cmVlLmdldEhlYWRlclZpc2libGUoKSk7Ci0JdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCWFzc2VydFRydWUodHJlZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotCXRyZWUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodHJlZS5nZXRIZWFkZXJWaXNpYmxlKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEl0ZW1Db3VudEkoKSB7Ci0JdHJlZS5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JZm9yIChpbnQgaT0wOyBpPDg7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5VTEwpOwotCQlhc3NlcnRFcXVhbHMoaSsxLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0JYXNzZXJ0RXF1YWxzKDgsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCWFzc2VydEVxdWFscyg0LCB0cmVlLmluZGV4T2YodHJlZS5nZXRJdGVtcygpWzRdKSk7Ci0JdHJlZS5nZXRJdGVtKDEpLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoNywgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JbmV3IFRyZWVJdGVtICh0cmVlLCBTV1QuTlVMTCwgMCk7Ci0JYXNzZXJ0RXF1YWxzKDEsIHRyZWUuaW5kZXhPZih0cmVlLmdldEl0ZW1zKClbMV0pKTsKLQlhc3NlcnRFcXVhbHMoOCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJlZS5yZW1vdmVBbGwoKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJlZS5zZXRJdGVtQ291bnQoMCk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCXRyZWUuc2V0SXRlbUNvdW50KC0xKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJlZS5zZXRJdGVtQ291bnQoMTApOwotCWFzc2VydEVxdWFscygxMCwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJlZS5nZXRJdGVtKDEpLmRpc3Bvc2UoKTsKLQlhc3NlcnRFcXVhbHMoOSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JYXNzZXJ0RXF1YWxzKDQsIHRyZWUuaW5kZXhPZih0cmVlLmdldEl0ZW1zKClbNF0pKTsKLQl0cmVlLnNldEl0ZW1Db3VudCgzKTsKLQlhc3NlcnRFcXVhbHMoMywgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci0JdHJ5IHsKLQkJdHJlZS5nZXRJdGVtKDQpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQl0cmVlLnNldEl0ZW1Db3VudCg0MCk7Ci0JYXNzZXJ0RXF1YWxzKDQwLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLQl0cmVlLmdldEl0ZW0oMzkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldExpbmVzVmlzaWJsZVooKSB7Ci0JaWYgKFN3dEp1bml0LmlzQ2FyYm9uKSB7Ci0JCS8vIGNhcmJvbiBkb2VzIG5vdCBzdXBwb3J0IGxpbmVzCi0JCXRyZWUuZ2V0TGluZXNWaXNpYmxlKCk7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0RmFsc2UodHJlZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci0JdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldExpbmVzVmlzaWJsZSgpKTsKLQl0cmVlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RmFsc2UodHJlZS5nZXRMaW5lc1Zpc2libGUoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVkcmF3WigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0UmVkcmF3WiBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKSB7Ci0JaW50IG51bWJlciA9IDIwOwotCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCX0KLQotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzE2XSwgaXRlbXNbMTldfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzE2XSwgaXRlbXNbMTldfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JYXNzZXJ0U2FtZShpdGVtcywgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24odHJlZS5nZXRJdGVtcygpKTsKLQlhc3NlcnRTYW1lKHRyZWUuZ2V0SXRlbXMoKSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge30pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCi0JdHJ5IHsKLQkJdHJlZS5zZXRTZWxlY3Rpb24oKFRyZWVJdGVtW10pIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtcyA9PSBudWxsIik7Ci0JfSAKLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtudWxsfSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzEwXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zW251bWJlci0xXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbbnVtYmVyLTFdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMTBdLCBpdGVtc1tudW1iZXItMV0sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl0sIGl0ZW1zWzEwXSwgaXRlbXNbbnVtYmVyIC0gMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbM10sIGl0ZW1zWzJdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbMl0sIGl0ZW1zWzNdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbM10sIGl0ZW1zWzJdLCBpdGVtc1sxXX0pOwotCWFzc2VydFNhbWUobmV3IFRyZWVJdGVtW117aXRlbXNbMV0sIGl0ZW1zWzJdLCBpdGVtc1szXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzFdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRTYW1lKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1sxXSwgaXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1swXSwgaXRlbXNbNF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0U2FtZShuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXSwgaXRlbXNbM10sIGl0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXtpdGVtc1s0XX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1szXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbM119LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge30pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCh0cnVlKTsgLy8gc2luZ2xlLXNlbGVjdGlvbiB0cmVlCi0JCi0JaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKQotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNV0sIGl0ZW1zWzE2XSwgaXRlbXNbMTldfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKHRyZWUuZ2V0SXRlbXMoKSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7fSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkKLQl0cnkgewotCQl0cmVlLnNldFNlbGVjdGlvbigoVHJlZUl0ZW1bXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGl0ZW1zID09IG51bGwiKTsKLQl9IAotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzEwXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMTBdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbbnVtYmVyLTFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1tudW1iZXItMV19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1syXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQkKLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxMF0sIGl0ZW1zW251bWJlci0xXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1szXSwgaXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbM10sIGl0ZW1zWzJdLCBpdGVtc1sxXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1sxXSwgaXRlbXNbNF0sIGl0ZW1zWzBdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtde2l0ZW1zWzBdLCBpdGVtc1s0XSwgaXRlbXNbMF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW117fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbXNbMl0sIGl0ZW1zWzNdLCBpdGVtc1s0XX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXXt9LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXXtpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdLCBpdGVtc1s0XSwgaXRlbXNbNF0sIGl0ZW1zWzRdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtde30sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwkKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1swXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMF19LCB0cmVlLmdldFNlbGVjdGlvbigpKTsKLQotCXRyZWUuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1szXX0pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbM119LCB0cmVlLmdldFNlbGVjdGlvbigpKTsJCi0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbNF19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzRdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl0cmVlLnNldFNlbGVjdGlvbihuZXcgVHJlZUl0ZW1bXSB7aXRlbXNbMl19KTsKLQlhc3NlcnRFcXVhbHMobmV3IFRyZWVJdGVtW10ge2l0ZW1zWzJdfSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7CQotCi0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge2l0ZW1zWzFdfSk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBUcmVlSXRlbVtdIHtpdGVtc1sxXX0sIHRyZWUuZ2V0U2VsZWN0aW9uKCkpOwotCQotCXRyZWUucmVtb3ZlQWxsKCk7Ci0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10ge30pOwotCWFzc2VydEVxdWFscyhuZXcgVHJlZUl0ZW1bXSB7fSwgdHJlZS5nZXRTZWxlY3Rpb24oKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VG9wSXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQl0cmVlLnJlbW92ZUFsbCgpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgMCk7CQotCX0KLQlUcmVlSXRlbSB0b3AgPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCAwKTsJCi0JfQotCXRyZWUuc2V0U2l6ZSg1MCw1MCk7Ci0Jc2hlbGwub3BlbigpOwotCXRyZWUuc2V0VG9wSXRlbSh0b3ApOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQluZXcgVHJlZUl0ZW0odHJlZSwgMCk7CQotCX0KLQlUcmVlSXRlbSB0b3AyID0gdHJlZS5nZXRUb3BJdGVtKCk7Ci0Jc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKHRvcCwgdG9wMik7Ci0JdHJ5IHsKLQkJc2hlbGwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRUb3BJdGVtKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gZmluYWxseSB7Ci0JCXNoZWxsLnNldFZpc2libGUgKGZhbHNlKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd0NvbHVtbkxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4gbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zaG93SXRlbUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgpIHsKLQl0cnkgewotCQl0cmVlLnNob3dJdGVtKG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpdGVtID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCWludCBudW1iZXIgPSAyMDsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtW251bWJlcl07Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgewotCQlpdGVtc1tpXSA9IG5ldyBUcmVlSXRlbSh0cmVlLCAwKTsKLQl9Ci0JZm9yKGludCBpPTA7IGk8bnVtYmVyOyBpKyspCi0JCXRyZWUuc2hvd0l0ZW0oaXRlbXNbaV0pOwotCi0JdHJlZS5yZW1vdmVBbGwoKTsKLQotCW1ha2VDbGVhbkVudmlyb25tZW50KGZhbHNlKTsKLQkvL3Nob3dpbmcgc29tZWJvZHkgZWxzZSdzIGl0ZW1zCi0JCi0JaXRlbXMgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWUsIDApOwotCX0KLQotCVRyZWUgdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgMCk7Ci0JVHJlZUl0ZW1bXSBpdGVtczIgPSBuZXcgVHJlZUl0ZW1bbnVtYmVyXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7Ci0JCWl0ZW1zMltpXSA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgMCk7Ci0JfQotCi0JZm9yKGludCBpPTA7IGk8bnVtYmVyOyBpKyspCi0JCXRyZWUuc2hvd0l0ZW0oaXRlbXMyW2ldKTsKLQotCXRyZWUucmVtb3ZlQWxsKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2hvd1NlbGVjdGlvbigpIHsKLQlUcmVlSXRlbSBpdGVtOwotCQotCXRyZWUuc2hvd1NlbGVjdGlvbigpOwotCWl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0JdHJlZS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW117aXRlbX0pOwotCXRyZWUuc2hvd1NlbGVjdGlvbigpOwkKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlKChTdHJpbmcpZS5uZXh0RWxlbWVudCgpKSk7Ci0JfQotCXJldHVybiBzdWl0ZTsKLX0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29tcHV0ZVNpemVJSVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2Rlc2VsZWN0QWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRDb2x1bW5Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1uSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Q29sdW1ucyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0R3JpZExpbmVXaWR0aCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SGVhZGVySGVpZ2h0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRIZWFkZXJWaXNpYmxlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1IZWlnaHQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Qb2ludCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SXRlbXMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldExpbmVzVmlzaWJsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50SXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTZWxlY3Rpb25Db3VudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0VG9wSXRlbSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlQWxsIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NlbGVjdEFsbCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEluc2VydE1hcmtMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW1aIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRJdGVtQ291bnRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRMaW5lc1Zpc2libGVaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRSZWRyYXdaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRTZWxlY3Rpb24kTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zaG93U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfS2V5U2VsZWN0aW9uIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9TcGFjZVNlbGVjdGlvbiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9LZXlFeHBhbmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2NvbnNpc3RlbmN5X0RvdWJsZUNsaWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0Iik7Ci0JbWV0aG9kTmFtZXMuYWRkQWxsKFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfQ29tcG9zaXRlSSIpKSB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0NvbXBvc2l0ZUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIiKSkgdGVzdF9hZGRUcmVlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19UcmVlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbXB1dGVTaXplSUlaIikpIHRlc3RfY29tcHV0ZVNpemVJSVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2Rlc2VsZWN0QWxsIikpIHRlc3RfZGVzZWxlY3RBbGwoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbkNvdW50IikpIHRlc3RfZ2V0Q29sdW1uQ291bnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldENvbHVtbkkiKSkgdGVzdF9nZXRDb2x1bW5JKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRDb2x1bW5zIikpIHRlc3RfZ2V0Q29sdW1ucygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JpZExpbmVXaWR0aCIpKSB0ZXN0X2dldEdyaWRMaW5lV2lkdGgoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEhlYWRlckhlaWdodCIpKSB0ZXN0X2dldEhlYWRlckhlaWdodCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SGVhZGVyVmlzaWJsZSIpKSB0ZXN0X2dldEhlYWRlclZpc2libGUoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUhlaWdodCIpKSB0ZXN0X2dldEl0ZW1IZWlnaHQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1JIikpIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX1BvaW50IikpIHRlc3RfZ2V0SXRlbUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfUG9pbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1zIikpIHRlc3RfZ2V0SXRlbXMoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldExpbmVzVmlzaWJsZSIpKSB0ZXN0X2dldExpbmVzVmlzaWJsZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50SXRlbSIpKSB0ZXN0X2dldFBhcmVudEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFNlbGVjdGlvbiIpKSB0ZXN0X2dldFNlbGVjdGlvbigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0U2VsZWN0aW9uQ291bnQiKSkgdGVzdF9nZXRTZWxlY3Rpb25Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VG9wSXRlbSIpKSB0ZXN0X2dldFRvcEl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZUFsbCIpKSB0ZXN0X3JlbW92ZUFsbCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZVRyZWVMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1RyZWVMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2VsZWN0QWxsIikpIHRlc3Rfc2VsZWN0QWxsKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SGVhZGVyVmlzaWJsZVoiKSkgdGVzdF9zZXRIZWFkZXJWaXNpYmxlWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW5zZXJ0TWFya0xvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbVoiKSkgdGVzdF9zZXRJbnNlcnRNYXJrTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtWigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SXRlbUNvdW50SSIpKSB0ZXN0X3NldEl0ZW1Db3VudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldExpbmVzVmlzaWJsZVoiKSkgdGVzdF9zZXRMaW5lc1Zpc2libGVaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRSZWRyYXdaIikpIHRlc3Rfc2V0UmVkcmF3WigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0U2VsZWN0aW9uJExvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSIpKSB0ZXN0X3NldFNlbGVjdGlvbiRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRvcEl0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0iKSkgdGVzdF9zZXRUb3BJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4iKSkgdGVzdF9zaG93Q29sdW1uTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dJdGVtTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIikpIHRlc3Rfc2hvd0l0ZW1Mb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3Nob3dTZWxlY3Rpb24iKSkgdGVzdF9zaG93U2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbiIpKSB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlU2VsZWN0aW9uKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24iKSkgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0VudGVyU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfRW50ZXJTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X1NwYWNlU2VsZWN0aW9uIikpIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24oKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kIikpIHRlc3RfY29uc2lzdGVuY3lfTW91c2VFeHBhbmQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCIpKSB0ZXN0X2NvbnNpc3RlbmN5X0tleUV4cGFuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfRG91YmxlQ2xpY2siKSkgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfY29uc2lzdGVuY3lfTWVudURldGVjdCIpKSB0ZXN0X2NvbnNpc3RlbmN5X01lbnVEZXRlY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QiKSkgdGVzdF9jb25zaXN0ZW5jeV9EcmFnRGV0ZWN0KCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHVibGljIFRyZWUgdHJlZTsKLQotLyoqCi0gKiBDbGVhbiB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIGEgbmV3IHRlc3QuCi0gKiAKLSAqIEBwYXJhbSBzaW5nbGUgdHJ1ZSBpZiB0aGUgbmV3IHRyZWUgc2hvdWxkIGJlIGEgc2luZ2xlLXNlbGVjdGlvbiBvbmUsCi0gKiBvdGhlcndpc2UgdXNlIG11bHRpLXNlbGVjdGlvbi4KLSAqLwotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KGJvb2xlYW4gc2luZ2xlKSB7Ci0vLyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByaXZhdGUgb3IgcHJvdGVjdGVkIHNvIHRoZSBhdXRvLWdlbiB0b29sIGtlZXBzIGl0Ci0JaWYgKHRyZWUgIT0gbnVsbCkgdHJlZS5kaXNwb3NlKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBzaW5nbGU/U1dULlNJTkdMRTpTV1QuTVVMVEkpOwotCXNldFdpZGdldCh0cmVlKTsKLX0KLQotcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWUoVmVjdG9yIGV2ZW50cykgewotICAgIG1ha2VDbGVhbkVudmlyb25tZW50KHRydWUpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCVRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoIlRyZWVJdGVtIiArIGkpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgewotCQkJVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0oaXRlbSwgU1dULk5PTkUpOwotCQkJdGkuc2V0VGV4dCgiVHJlZUl0ZW0iICsgaSArIGopOwotCQkJaG9va0V4cGVjdGVkRXZlbnRzKHRpLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCQl9Ci0JCWhvb2tFeHBlY3RlZEV2ZW50cyhpdGVtLCBnZXRUZXN0TmFtZSgpLCBldmVudHMpOwotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9LZXlTZWxlY3Rpb24oKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgwLCBTV1QuQVJST1dfRE9XTiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Nb3VzZVNlbGVjdGlvbigpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDMwLCAzMCwgMSwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X01vdXNlRXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMTEsIDEwLCAxLCAwLCBDb25zaXN0ZW5jeVV0aWxpdHkuTU9VU0VfQ0xJQ0ssIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfS2V5RXhwYW5kKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGludCBjb2RlPVNXVC5BUlJPV19SSUdIVDsKLSAgICBpZihTd3RKdW5pdC5pc0dUSykKLSAgICAgICAgY29kZSA9IFNXVC5LRVlQQURfQUREOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMCwgY29kZSwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9Eb3VibGVDbGljayAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lQcmVQYWNrU2hlbGwoKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDIwLCB0cmVlLmdldEl0ZW1IZWlnaHQoKSoyLCAxLCAwLCAKLSAgICAgICAgICAgIAkgICAgIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9ET1VCTEVDTElDSywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9FbnRlclNlbGVjdGlvbiAoKSB7Ci0gICAgVmVjdG9yIGV2ZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjcmVhdGVUcmVlKGV2ZW50cyk7Ci0gICAgY29uc2lzdGVuY3lFdmVudCgxMywgMTAsIDAsIDAsIENvbnNpc3RlbmN5VXRpbGl0eS5LRVlfUFJFU1MsIGV2ZW50cyk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY29uc2lzdGVuY3lfU3BhY2VTZWxlY3Rpb24gKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoJyAnLCAzMiwgMCwgMCwgQ29uc2lzdGVuY3lVdGlsaXR5LktFWV9QUkVTUywgZXZlbnRzKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9jb25zaXN0ZW5jeV9NZW51RGV0ZWN0ICgpIHsKLSAgICBWZWN0b3IgZXZlbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGNyZWF0ZVRyZWUoZXZlbnRzKTsKLSAgICBjb25zaXN0ZW5jeUV2ZW50KDUwLCAyNSwgMywgMCwgQ29uc2lzdGVuY3lVdGlsaXR5Lk1PVVNFX0NMSUNLLCBldmVudHMpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2NvbnNpc3RlbmN5X0RyYWdEZXRlY3QgKCkgewotICAgIFZlY3RvciBldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY3JlYXRlVHJlZShldmVudHMpOwotICAgIGNvbnNpc3RlbmN5RXZlbnQoMzAsIDIwLCA1MCwgMzAsIENvbnNpc3RlbmN5VXRpbGl0eS5NT1VTRV9EUkFHLCBldmVudHMpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9UZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmMGU1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlQ29sdW1uIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbihTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgewotCXN1cGVyLnNldFVwKCk7Ci0JdHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuU0lOR0xFKTsJCQotCXRyZWVDb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCk7CQotCXNldFdpZGdldCh0cmVlQ29sdW1uKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpIHsKLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbihudWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVDb2x1bW4obnVsbCwgU1dULk5VTEwsIDApOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBwYXJlbnQgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCwgLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbmRleCA9PSAtMSIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0KLQl0cnkgewotCQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTlVMTCwgMik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZENvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfYWRkQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl0cmVlQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEFsaWdubWVudCgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfZ2V0QWxpZ25tZW50IG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9nZXRQYXJlbnQgbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRSZXNpemFibGUoKSB7Ci0Jd2FyblVuaW1wbCgiVGVzdCB0ZXN0X2dldFJlc2l6YWJsZSBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldFdpZHRoKCkgewotCWludCB0ZXN0V2lkdGggPSA0MjsKLQkKLS8vCXRyeSB7Ci0vLwkJdHJlZUNvbHVtbi5zZXRXaWR0aCgtMSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIHRocm93biIsIGZhbHNlKTsKLS8vCX0KLS8vCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotLy8JCWFzc2VydFRydWUoIldyb25nIGVycm9yIHRocm93bjogIiArIGUsIGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiQXJndW1lbnQgbm90IHZhbGlkIikpOwotLy8JfQotLy8JY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0vLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgZXJyb3IgdGhyb3duOiAiICsgZSwgZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJBcmd1bWVudCBub3QgdmFsaWQiKSk7Ci0vLwl9Ci0KLQl0cmVlQ29sdW1uLnNldFdpZHRoKDApOwotCWFzc2VydFRydWUoIjphOiB3aWR0aD0iICsgdHJlZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIDAsIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSA9PSAwKTsKLQotCXRyZWVDb2x1bW4uc2V0V2lkdGgodGVzdFdpZHRoKTsKLQlhc3NlcnRUcnVlKCI6Yjogd2lkdGg9IiArIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSArICIgc2hvdWxkIGJlPSIgKyB0ZXN0V2lkdGgsIHRyZWVDb2x1bW4uZ2V0V2lkdGgoKSA9PSB0ZXN0V2lkdGgpOwotCi0JdHJlZUNvbHVtbi5zZXRXaWR0aCh0ZXN0V2lkdGgpOwotCWFzc2VydFRydWUoIjpjOiB3aWR0aD0iICsgdHJlZUNvbHVtbi5nZXRXaWR0aCgpICsgIiBzaG91bGQgYmU9IiArIHRlc3RXaWR0aCwgdHJlZUNvbHVtbi5nZXRXaWR0aCgpID09IHRlc3RXaWR0aCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcGFjaygpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcGFjayBub3Qgd3JpdHRlbiIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZUNvbnRyb2xMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0NvbnRyb2xMaXN0ZW5lcigpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQlTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fX07Ci0KLQl0cmVlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJlZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CQkKLQl0cmVlQ29sdW1uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsJCi0JdHJ5IHsKLQkJdHJlZUNvbHVtbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihudWxsKTsJCQotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBbGlnbm1lbnRJKCkgewotCVRyZWVDb2x1bW4gY29sdW1uMjsKLQkKLQlhc3NlcnRUcnVlKCI6YToiLCB0cmVlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRyZWVDb2x1bW4uc2V0QWxpZ25tZW50KC0xKTsKLQlhc3NlcnRUcnVlKCI6YjoiLCB0cmVlQ29sdW1uLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsKLQotCXRyZWVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5SSUdIVCk7Ci0JYXNzZXJ0VHJ1ZSgKLQkJIjpjOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gc2V0IGFsaWdubWVudCBvZiB0aGUgZmlyc3QgY29sdW1uIiwgCi0JCXRyZWVDb2x1bW4uZ2V0QWxpZ25tZW50KCkgPT0gU1dULkxFRlQpOwotCi0JY29sdW1uMiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OVUxMKTsKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuUklHSFQpOwotCWFzc2VydFRydWUoIjpkOiIsIGNvbHVtbjIuZ2V0QWxpZ25tZW50KCkgPT0gU1dULlJJR0hUKTsKLQkKLQljb2x1bW4yLnNldEFsaWdubWVudChTV1QuQ0VOVEVSKTsKLQlhc3NlcnRUcnVlKCI6ZToiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5DRU5URVIpOwkKLQotCWNvbHVtbjIuc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQlhc3NlcnRUcnVlKCI6ZjoiLCBjb2x1bW4yLmdldEFsaWdubWVudCgpID09IFNXVC5MRUZUKTsJCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlKCkgewotCXdhcm5VbmltcGwoIlRlc3QgdGVzdF9zZXRJbWFnZUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2Ugbm90IHdyaXR0ZW4iKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRSZXNpemFibGVaKCkgewotCWFzc2VydFRydWUoIjphOiIsIHRyZWVDb2x1bW4uZ2V0UmVzaXphYmxlKCkgPT0gdHJ1ZSk7Ci0KLQl0cmVlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmI6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0cmVlQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JYXNzZXJ0VHJ1ZSgiOmM6IiwgdHJlZUNvbHVtbi5nZXRSZXNpemFibGUoKSA9PSBmYWxzZSk7Ci0KLQl0cmVlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQlhc3NlcnRUcnVlKCI6ZDoiLCB0cmVlQ29sdW1uLmdldFJlc2l6YWJsZSgpID09IHRydWUpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpIHsKLQlhc3NlcnRFcXVhbHMoIjphOiIsIHRyZWVDb2x1bW4uZ2V0VGV4dCgpLCAiIik7Ci0KLQl0cmVlQ29sdW1uLnNldFRleHQoInRleHQiKTsKLQlhc3NlcnRFcXVhbHMoIjpiOiIsIHRyZWVDb2x1bW4uZ2V0VGV4dCgpLCAidGV4dCIpOwotCi0JdHJ5IHsKLQkJdHJlZUNvbHVtbi5zZXRUZXh0KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBjb2x1bW4gaGVhZGVyID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFdpZHRoSSgpIHsKLQl3YXJuVW5pbXBsKCJUZXN0IHRlc3Rfc2V0V2lkdGhJIG5vdCB3cml0dGVuIik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUNvbHVtbigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEFsaWdubWVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0UGFyZW50Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRSZXNpemFibGUiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFdpZHRoIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9wYWNrIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3JlbW92ZVNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEFsaWdubWVudEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0UmVzaXphYmxlWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRXaWR0aEkiKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIiKSkgdGVzdF9hZGRDb250cm9sTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19Db250cm9sTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZFNlbGVjdGlvbkxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfU2VsZWN0aW9uTGlzdGVuZXIiKSkgdGVzdF9hZGRTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRBbGlnbm1lbnQiKSkgdGVzdF9nZXRBbGlnbm1lbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldFBhcmVudCIpKSB0ZXN0X2dldFBhcmVudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UmVzaXphYmxlIikpIHRlc3RfZ2V0UmVzaXphYmxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRXaWR0aCIpKSB0ZXN0X2dldFdpZHRoKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9wYWNrIikpIHRlc3RfcGFjaygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyIikpIHRlc3RfcmVtb3ZlQ29udHJvbExpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfQ29udHJvbExpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX1NlbGVjdGlvbkxpc3RlbmVyIikpIHRlc3RfcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19TZWxlY3Rpb25MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QWxpZ25tZW50SSIpKSB0ZXN0X3NldEFsaWdubWVudEkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0UmVzaXphYmxlWiIpKSB0ZXN0X3NldFJlc2l6YWJsZVooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHRMamF2YV9sYW5nX1N0cmluZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0V2lkdGhJIikpIHRlc3Rfc2V0V2lkdGhJKCk7Ci0JZWxzZSBzdXBlci5ydW5UZXN0KCk7Ci19Ci0KLS8qIGN1c3RvbSAqLwotcHJvdGVjdGVkIFRyZWVDb2x1bW4gdHJlZUNvbHVtbjsKLXByb3RlY3RlZCBUcmVlIHRyZWU7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjZkYzVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQudGV4dHVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0X29yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtIGV4dGVuZHMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtIHsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUl0ZW0oU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQlzdXBlci5zZXRVcCgpOwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCXN1cGVyLnRlYXJEb3duKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkoKSB7Ci0JdHJ5IHsKLQkJbmV3IFRyZWVJdGVtKChUcmVlSXRlbSludWxsLCBTV1QuTlVMTCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHBhcmVudCA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCWZvciAoaW50IGk9MDsgaTwxMDsgaSsrKSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSk7CQotCX0KLQlhc3NlcnRFcXVhbHMoMTEsIHRyZWUuZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgNSk7CQotCWFzc2VydEVxdWFscygxMiwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlLCBTV1QuTk9ORSwgNSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSSgpIHsKLQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JfQotCWFzc2VydEVxdWFscygxMCwgdHJlZUl0ZW0uZ2V0SXRlbUNvdW50KCkpOwotCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUsIDUpOwotCWFzc2VydEVxdWFscygxLCB0cmVlLmdldEl0ZW1Db3VudCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJKCkgewotCXRyeSB7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUsIDUpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge30KLQlhc3NlcnRFcXVhbHMoMSwgdHJlZS5nZXRJdGVtQ291bnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0QmFja2dyb3VuZCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJhY2tncm91bmRJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEJhY2tncm91bmRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcgotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kcygpIHsKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCVN0cmluZyBzdHJpbmcgPSAiaGVsbG8iOwotCQotCS8vIG5vIGNvbHVtbnMKLSAJYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JCi0JdHJlZUl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IGV4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBleHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBleHRlbnQueCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxYzoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSByZWN0LmhlaWdodCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZDoiLCBib3VuZHMueCA+PSBib3VuZHMyLnggKyBib3VuZHMyLndpZHRoKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JVHJlZUl0ZW0gc3ViSXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxZjoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFnOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCQotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0uc2V0VGV4dChzdHJpbmcpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCWFzc2VydFRydWUoIjoxaDoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gZXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gZXh0ZW50LngpOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQlzdWJJdGVtID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCBTV1QuTk9ORSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0Jc3ViSXRlbS5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoKTsKLQlhc3NlcnRUcnVlKCI6MWk6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPj0gcmVjdC5oZWlnaHQpOwotCWJvdW5kczIgPSBzdWJJdGVtLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxajoiLCBib3VuZHMueCA+PSBib3VuZHMyLnggKyBib3VuZHMyLndpZHRoKTsKLQkKLQkvLyBUT0RPIG5vIGNvbHVtbnMgYW5kIENIRUNLIHN0eWxlCi0JLy8gVE9ETyB3aXRoIGNvbHVtbnMKLQkvLyBUT0RPIHdpdGggY29sdW1ucyBhbmQgQ0hFQ0sgc3R5bGUKLX0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJQSgpIHsJCi0JLy8gbm8gY29sdW1ucyAtIHBsYWluIHN0eWxlCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07Ci0JUmVjdGFuZ2xlIGltYWdlQm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JU3RyaW5nIHN0cmluZyA9ICJoZWxsbyI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgc3RyaW5nRXh0ZW50ID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZyk7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6MWI6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjFjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MWQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFlOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxZzoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50LnkgJiYgYm91bmRzLndpZHRoID4gc3RyaW5nRXh0ZW50LngpOwkKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZyk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxaDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JLy9hc3NlcnRUcnVlKCI6MW5ldzoiLCBib3VuZHMuZXF1YWxzKGJvdW5kczIpKTsgLy8gVE9ETyBzaG91bGQgYm91bmRzIGJlIGVxdWFsPwotCXRyZWVJdGVtLnNldFRleHQoIiIpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFpOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6MWo6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7Ci0JCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFrOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPj0gaW1hZ2VCb3VuZHMud2lkdGgpOwotCXRyZWVJdGVtLnNldEltYWdlKChJbWFnZSludWxsKTsKLQlib3VuZHMyID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoxbDoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0vLwlhc3NlcnRUcnVlKCI6MW06IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7IC8vIG9uY2UgYW4gaW1hZ2UgaXMgYWRkZWQgdGhlIHNwYWNlIGZvciBpdCBpcyBhbHdheXMgdGhlcmUKLSAJCi0JLy8KLQltYWtlQ2xlYW5FbnZpcm9ubWVudCgpOwotCQotCXRyZWVJdGVtLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoaW1hZ2UpOwotCWJvdW5kczIgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFuOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6MW86IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFwIiwgYm91bmRzMi53aWR0aCA+PSBzdHJpbmdFeHRlbnQueCArIGltYWdlQm91bmRzLndpZHRoICYmIGJvdW5kczIuaGVpZ2h0ID49IE1hdGgubWF4KHN0cmluZ0V4dGVudC55LCBpbWFnZUJvdW5kcy5oZWlnaHQpKTsKLX0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJQigpIHsKLQkvLyBubyBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcgPSAiaGVsbG8iOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudCA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCVRyZWUgdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OT05FKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyYToiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjoyYjoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjJjOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtMiwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmQ6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmU6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6MmY6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0yLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJnOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQueSAmJiBib3VuZHMud2lkdGggPiBzdHJpbmdFeHRlbnQueCk7CQotCi0JdHJlZUl0ZW0yLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyaDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudC55ICYmIGJvdW5kcy53aWR0aCA+IHN0cmluZ0V4dGVudC54KTsKLQlib3VuZHMyID0gdHJlZUl0ZW0yLmdldEJvdW5kcygpOwotCS8vYXNzZXJ0VHJ1ZSgiOjJuZXc6IiwgYm91bmRzLmVxdWFscyhib3VuZHMyKSk7IC8vIFRPRE8gc2hvdWxkIGJvdW5kcyBiZSBlcXVhbD8KLQl0cmVlSXRlbTIuc2V0VGV4dCgiIik7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJpOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6Mmo6IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7Ci0JCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JdHJlZUl0ZW0yLnNldEltYWdlKGltYWdlKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoyazoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID49IGltYWdlQm91bmRzLndpZHRoKTsKLQl0cmVlSXRlbTIuc2V0SW1hZ2UoKEltYWdlKW51bGwpOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjoybDoiLCBib3VuZHMyLnggPiAwICYmIGJvdW5kczIuaGVpZ2h0ID4gMCk7Ci0JLy9hc3NlcnRUcnVlKCI6Mm06IiwgYm91bmRzMi53aWR0aCA8IGJvdW5kcy53aWR0aCk7ICAvLyBvbmNlIGFuIGltYWdlIGlzIGFkZGVkIHRoZSBzcGFjZSBmb3IgaXQgaXMgYWx3YXlzIHRoZXJlCi0JCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JCi0JdHJlZUl0ZW0yLnNldFRleHQoc3RyaW5nKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCXRyZWVJdGVtMi5zZXRJbWFnZShpbWFnZSk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjJuOiIsIGJvdW5kczIueCA+IDAgJiYgYm91bmRzMi5oZWlnaHQgPiAwKTsKLQlhc3NlcnRUcnVlKCI6Mm86IiwgYm91bmRzMi53aWR0aCA+IGJvdW5kcy53aWR0aCk7Ci0JYXNzZXJ0VHJ1ZSgiOjFwIiwgYm91bmRzMi53aWR0aCA+PSBzdHJpbmdFeHRlbnQueCArIGltYWdlQm91bmRzLndpZHRoICYmIGJvdW5kczIuaGVpZ2h0ID49IE1hdGgubWF4KHN0cmluZ0V4dGVudC55LCBpbWFnZUJvdW5kcy5oZWlnaHQpKTsKLX0KLXZvaWQgdGVzdF9nZXRCb3VuZHNJQygpIHsKLQkvLyB3aXRoIGNvbHVtbnMKLQkKLQlJbWFnZSBpbWFnZSA9IGltYWdlc1swXTsKLQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLQlTdHJpbmcgc3RyaW5nMSA9ICJoZWxsbyI7Ci0JU3RyaW5nIHN0cmluZzIgPSAid29ybGQiOwotCUdDIGdjID0gbmV3IEdDKHRyZWUpOwotCVBvaW50IHN0cmluZ0V4dGVudDEgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nMSk7Ci0JLy9Qb2ludCBzdHJpbmdFeHRlbnQyID0gZ2Muc3RyaW5nRXh0ZW50KHN0cmluZzIpOwotCWdjLmRpc3Bvc2UoKTsKLQkKLQlSZWN0YW5nbGUgYm91bmRzOwotCVJlY3RhbmdsZSBib3VuZHMyOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQlUcmVlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQkKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozYjoiLCAvKmJvdW5kcy54ID4gMCAmJiovIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsgLy8gVE9ETyBib3VuZHMueCA9PSAwIElzIHRoaXMgcmlnaHQ/Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKC0xKTsKLQlhc3NlcnRUcnVlKCI6M2M6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7CQotIAlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMik7Ci0JYXNzZXJ0VHJ1ZSgiOjNkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OT05FKTsKLQlib3VuZHMgPSBzdWJJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2U6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNmOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozZzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlzdWJJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2g6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPT0gMCk7CQotCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2k6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNqOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gc3ViSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2s6IiwgYm91bmRzLnggPiBib3VuZHMyLnggJiYgYm91bmRzLnkgPj0gYm91bmRzMi55ICsgYm91bmRzMi5oZWlnaHQgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7CQotCi0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M2w6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNtOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M246IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M286IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCXRyZWVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHsiIiwgIiJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjNwOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjNxOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQljb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozcjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3M6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLSAJdHJlZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge251bGwsIG51bGx9KTsKLQlib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjN0OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjozdToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQljb2x1bW4wID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6M3Y6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6M3c6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KHN0cmluZzEpOwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5SSUdIVCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjozeDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggID09IDApOwotfQotCi12b2lkIHRlc3RfZ2V0Qm91bmRzSUQoKSB7Ci0JLy8gd2l0aCBjb2x1bW5zIGFuZCBDSEVDSyBzdHlsZQotCUltYWdlIGltYWdlID0gaW1hZ2VzWzBdOwotCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotCVN0cmluZyBzdHJpbmcxID0gImhlbGxvIjsKLQlTdHJpbmcgc3RyaW5nMiA9ICJ3b3JsZCI7Ci0JR0MgZ2MgPSBuZXcgR0ModHJlZSk7Ci0JUG9pbnQgc3RyaW5nRXh0ZW50MSA9IGdjLnN0cmluZ0V4dGVudChzdHJpbmcxKTsKLQkvL1BvaW50IHN0cmluZ0V4dGVudDIgPSBnYy5zdHJpbmdFeHRlbnQoc3RyaW5nMik7Ci0JZ2MuZGlzcG9zZSgpOwotCQotCVJlY3RhbmdsZSBib3VuZHM7Ci0JUmVjdGFuZ2xlIGJvdW5kczI7Ci0JCi0JVHJlZSB0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCVRyZWVDb2x1bW4gY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTEVGVCk7Ci0JVHJlZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRyZWVDb2x1bW4odHJlZTIsIFNXVC5DRU5URVIpOwotCQotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRhOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGI6IiwgLypib3VuZHMueCA+IDAgJiYqLyBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMCk7IC8vIFRPRE8gYm91bmRzLnggPT0gMCBJcyB0aGlzIHJpZ2h0PwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoLTEpOwotCWFzc2VydFRydWUoIjo0YzoiLCBib3VuZHMuZXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCkpKTsJCi0gCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMik7Ci0JYXNzZXJ0VHJ1ZSgiOjRkOiIsIGJvdW5kcy5lcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSkpOwotCS8vIHVuZXhwYW5kZWQgaXRlbQotCVRyZWVJdGVtIHN1Ykl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtMiwgU1dULk5PTkUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGU6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGY6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKTsKLQl0cmVlSXRlbTIuc2V0RXhwYW5kZWQoZmFsc2UpOwotCWJvdW5kcyA9IHN1Ykl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NGc6IiwgYm91bmRzLmVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApKSk7Ci0JdHJlZUl0ZW0yLnNldEV4cGFuZGVkKHRydWUpOwotCXN1Ykl0ZW0yLnNldFRleHQobmV3IFN0cmluZ1tdIHtzdHJpbmcxLCBzdHJpbmcyfSk7Ci0JYm91bmRzID0gc3ViSXRlbTIuZ2V0Qm91bmRzKDApOwotCWJvdW5kczIgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0aDoiLCBib3VuZHMueCA+IGJvdW5kczIueCAmJiBib3VuZHMueSA+PSBib3VuZHMyLnkgKyBib3VuZHMyLmhlaWdodCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCA9PSAwKTsJCi0JCi0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRpOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NGo6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA9PSAwKTsKLQlib3VuZHMgPSBzdWJJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYm91bmRzMiA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRrOiIsIGJvdW5kcy54ID4gYm91bmRzMi54ICYmIGJvdW5kcy55ID49IGJvdW5kczIueSArIGJvdW5kczIuaGVpZ2h0ICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwkKLQotCQotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0bDoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRtOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCAmJiBib3VuZHMud2lkdGggPT0gMjAwKTsKLQkKLQl0cmVlSXRlbTIuc2V0VGV4dChuZXcgU3RyaW5nW10ge3N0cmluZzEsIHN0cmluZzJ9KTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDApOwotCWFzc2VydFRydWUoIjo0bjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLmhlaWdodCA+IHN0cmluZ0V4dGVudDEueSAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NG86IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCXRyZWVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7IiIsICIifSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHA6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjRxOiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCWNvbHVtbjAgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkxFRlQpOwotCWNvbHVtbjEgPSBuZXcgVHJlZUNvbHVtbih0cmVlMiwgU1dULkNFTlRFUik7Ci0JY29sdW1uMC5zZXRXaWR0aCgxMDApOwotCWNvbHVtbjEuc2V0V2lkdGgoMjAwKTsKLQkKLQl0cmVlSXRlbTIuc2V0SW1hZ2UobmV3IEltYWdlW10ge2ltYWdlLCBpbWFnZX0pOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjRyOiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID49IGltYWdlQm91bmRzLmhlaWdodCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy53aWR0aCA8IDEwMCk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygxKTsKLQlhc3NlcnRUcnVlKCI6NHM6IiwgYm91bmRzLnggPj0gMTAwICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLSAJdHJlZUl0ZW0yLnNldEltYWdlKG5ldyBJbWFnZVtdIHtudWxsLCBudWxsfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHQ6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwICYmIGJvdW5kcy53aWR0aCA+IDAgJiYgYm91bmRzLndpZHRoIDwgMTAwKTsKLQlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0Qm91bmRzKDEpOwotCWFzc2VydFRydWUoIjo0dToiLCBib3VuZHMueCA+PSAxMDAgJiYgYm91bmRzLmhlaWdodCA+IDAgJiYgYm91bmRzLndpZHRoICA9PSAyMDApOwotCQotCS8vCi0JdHJlZTIuZGlzcG9zZSgpOwotCXRyZWUyID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTk9ORSk7Ci0JY29sdW1uMCA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuTEVGVCk7Ci0JY29sdW1uMSA9IG5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuQ0VOVEVSKTsKLQljb2x1bW4wLnNldFdpZHRoKDEwMCk7Ci0JY29sdW1uMS5zZXRXaWR0aCgyMDApOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7c3RyaW5nMSwgc3RyaW5nMn0pOwotCXRyZWVJdGVtMi5zZXRJbWFnZShuZXcgSW1hZ2VbXSB7aW1hZ2UsIGltYWdlfSk7Ci0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEJvdW5kcygwKTsKLQlhc3NlcnRUcnVlKCI6NHY6IiwgYm91bmRzLnggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiBzdHJpbmdFeHRlbnQxLnkgJiYgYm91bmRzLmhlaWdodCA+PSBpbWFnZUJvdW5kcy5oZWlnaHQgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMud2lkdGggPCAxMDApOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMSk7Ci0JYXNzZXJ0VHJ1ZSgiOjR3OiIsIGJvdW5kcy54ID49IDEwMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy5oZWlnaHQgPj0gaW1hZ2VCb3VuZHMuaGVpZ2h0ICYmIGJvdW5kcy53aWR0aCAgPT0gMjAwKTsKLQkKLQkvLwotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMiA9IG5ldyBUcmVlSXRlbSh0cmVlMiwgU1dULk5PTkUpOwotCQotCXRyZWVJdGVtMi5zZXRUZXh0KHN0cmluZzEpOwotCW5ldyBUcmVlQ29sdW1uKHRyZWUyLCBTV1QuUklHSFQpOwotCWJvdW5kcyA9IHRyZWVJdGVtMi5nZXRCb3VuZHMoMCk7Ci0JYXNzZXJ0VHJ1ZSgiOjR4OiIsIGJvdW5kcy54ID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gc3RyaW5nRXh0ZW50MS55ICYmIGJvdW5kcy53aWR0aCAgPT0gMCk7Ci19Ci1wdWJsaWMgdm9pZCB0ZXN0X2dldEJvdW5kc0koKSB7Ci0JdGVzdF9nZXRCb3VuZHNJQSgpOwotCXRlc3RfZ2V0Qm91bmRzSUIoKTsKLQl0ZXN0X2dldEJvdW5kc0lDKCk7Ci0JdGVzdF9nZXRCb3VuZHNJRCgpOwotfQotcHVibGljIHZvaWQgdGVzdF9nZXRDaGVja2VkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldENoZWNrZWRaCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RXhwYW5kZWQoKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQkvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBzdWJpdGVtIGJlZm9yZSB5b3UgY2FuIHNldCB0aGUgdHJlZWl0ZW0gZXhwYW5kZWQKLQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIDApOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci0JdHJlZUl0ZW0uc2V0RXhwYW5kZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdHJlZUl0ZW0uZ2V0RXhwYW5kZWQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udCgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9udEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRGb3JlZ3JvdW5kKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0Rm9yZWdyb3VuZEkoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0R3JheWVkKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEdyYXllZFoKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJbWFnZUJvdW5kc0koKSB7Ci0vKioKLSAqIFRlc3Qgd2l0aG91dCBpdGVtIGltYWdlCi0gKi8KLQlSZWN0YW5nbGUgYm91bmRzOwotCVRyZWUgdHJlZTIgPSBuZXcgVHJlZShzaGVsbCwgU1dULkNIRUNLKTsKLQlUcmVlSXRlbSB0cmVlSXRlbTIgPSBuZXcgVHJlZUl0ZW0odHJlZTIsIFNXVC5OVUxMKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQkvLyBUT0RPIC0gc2hvdWxkIHRoaXMgd2lkdGggYmUgMCBvciBhIHZhbHVlPwotCWJvdW5kcyA9IHRyZWVJdGVtLmdldEltYWdlQm91bmRzKDApOwotCWFzc2VydFRydWUoIjpiOiIsIGJvdW5kcy53aWR0aCA9PSAwKTsKLQkKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMSkpOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoLTEpKTsKLQkKLQkvLyBUT0RPIC0gc2hvdWxkIHRoaXMgd2lkdGggYmUgMCBvciBhIHZhbHVlPwotCS8vYm91bmRzID0gdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwotCS8vYXNzZXJ0VHJ1ZSgiOmU6IiwgYm91bmRzLndpZHRoID09IDApOwotCQotCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMSkpOwotIAkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JSW1hZ2UgaW1hZ2UgPSBpbWFnZXNbMF07CQotLy8JaW50IGltYWdlV2lkdGggPSBpbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLS8vCWludCBpbWFnZUhlaWdodDsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0vLwlpbWFnZUhlaWdodCA9IHRyZWUuZ2V0SXRlbUhlaWdodCgpIC0gdHJlZS5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0uZ2V0SW1hZ2VCb3VuZHMoMCk7Ci0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID09IGltYWdlV2lkdGggJiYgYm91bmRzLmhlaWdodCA9PSBpbWFnZUhlaWdodCk7CQotLy8gCWFzc2VydEVxdWFscyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDAsIDApLCB0cmVlSXRlbS5nZXRJbWFnZUJvdW5kcygxKSk7CQotCi0KLQkvLwotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7CQotCQotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMi5kaXNwb3NlKCk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTlVMTCk7Ci0vLwlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLS8vCWltYWdlV2lkdGggPSBpbWFnZUJvdW5kcy53aWR0aDsgCXRyZWVJdGVtMi5zZXRJbWFnZSgwLCBpbWFnZSk7Ci0vLwlpbWFnZUhlaWdodCA9IHRyZWUyLmdldEl0ZW1IZWlnaHQoKSAtIHRyZWUyLmdldEdyaWRMaW5lV2lkdGgoKTsKLQlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKC0xKSk7Ci0JCi0JYm91bmRzID0gdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDApOwkvLyBib3VuZHMud2lkdGggc2hvdWxkIGJlIGNoZWNrIGJveCB3aWR0aCBpZiB0aGV5IGFyZSB3aWRlciB0aGFuIGltYWdlCi0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLS8vIAlhc3NlcnRFcXVhbHMobmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKSwgdHJlZUl0ZW0yLmdldEltYWdlQm91bmRzKDEpKTsJCi0KLQotCS8vCi0JbWFrZUNsZWFuRW52aXJvbm1lbnQoKTsKLQotCXRyZWUyLmRpc3Bvc2UoKTsKLQl0cmVlMiA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCXRyZWVJdGVtMi5kaXNwb3NlKCk7Ci0JdHJlZUl0ZW0yID0gbmV3IFRyZWVJdGVtKHRyZWUyLCBTV1QuTlVMTCk7Ci0JaW1hZ2UgPSBpbWFnZXNbMV07Ci0vLwlpbWFnZUJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOwotLy8JaW1hZ2VXaWR0aCA9IGltYWdlQm91bmRzLndpZHRoOwotIAl0cmVlSXRlbTIuc2V0SW1hZ2UoMCwgaW1hZ2UpOwotLy8JaW1hZ2VIZWlnaHQgPSB0cmVlMi5nZXRJdGVtSGVpZ2h0KCkgLSB0cmVlMi5nZXRHcmlkTGluZVdpZHRoKCk7Ci0JYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygtMSkpOwotIAlib3VuZHMgPSB0cmVlSXRlbTIuZ2V0SW1hZ2VCb3VuZHMoMCk7CS8vIGJvdW5kcy53aWR0aCBzaG91bGQgYmUgY2hlY2sgYm94IHdpZHRoIGlmIGNoZWNrIGJveCBpcyB3aWRlciB0aGFuIGltYWdlCi0vLwlhc3NlcnRUcnVlKCI6YjoiLCBib3VuZHMueCA+IDAgJiYgYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID09IGltYWdlSGVpZ2h0KTsKLSAJYXNzZXJ0RXF1YWxzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCksIHRyZWVJdGVtMi5nZXRJbWFnZUJvdW5kcygxKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0SW1hZ2VJKCkgewotCS8vIHRlc3RlZCBpbiB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtSSgpIHsKLQlpbnQgbnVtYmVyID0gMTU7Ci0JVHJlZUl0ZW1bXSBpdGVtcyA9IG5ldyBUcmVlSXRlbVtudW1iZXJdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWl0ZW1zW2ldID0gbmV3IFRyZWVJdGVtKHRyZWVJdGVtLCAwKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspCi0JCWFzc2VydEVxdWFscygiaT0iICsgaSwgaXRlbXNbaV0sIHRyZWVJdGVtLmdldEl0ZW0oaSkpOwotCXRyeSB7Ci0JCXRyZWVJdGVtLmdldEl0ZW0obnVtYmVyKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaWxsZWdhbCBpbmRleCBhcmd1bWVudCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0JdHJ5IHsKLQkJdHJlZUl0ZW0uZ2V0SXRlbShudW1iZXIrMSk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGlsbGVnYWwgaW5kZXggYXJndW1lbnQiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLmdldEl0ZW0oLTEpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBpbGxlZ2FsIGluZGV4IGFyZ3VtZW50Iik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtQ291bnQoKSB7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpLCB0cmVlSXRlbS5nZXRJdGVtQ291bnQoKSk7Ci0JCW5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgMCk7Ci0JfQotCWFzc2VydFRydWUoImI6ICIsIHRyZWVJdGVtLmdldEl0ZW1Db3VudCgpID09IDEwKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRJdGVtcygpIHsKLQlpbnRbXSBjYXNlcyA9IHswLCAxMCwgMTAwfTsKLQlUcmVlSXRlbSBbXVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtIFtjYXNlcy5sZW5ndGhdW107Ci0JZm9yIChpbnQgaiA9IDA7IGogPCBjYXNlcy5sZW5ndGg7IGorKykgewotCQlpdGVtcyBbal0gPSBuZXcgVHJlZUl0ZW0gW2Nhc2VzIFtqXV07Ci0JfQotCWZvciAoaW50IGogPSAwOyBqIDwgY2FzZXMubGVuZ3RoOyBqKyspIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXNlc1tqXTsgaSsrKSB7Ci0JCQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgMCk7Ci0JCQlpdGVtcyBbal1baV0gPSB0aTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaXRlbXNbal0sIHRyZWVJdGVtLmdldEl0ZW1zKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhc2VzW2pdOyBpKyspIHsKLQkJCWl0ZW1zIFtqXVtpXS5kaXNwb3NlKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50KCkgewotCWFzc2VydEVxdWFscyh0cmVlLCB0cmVlSXRlbS5nZXRQYXJlbnQoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0UGFyZW50SXRlbSgpIHsKLQlUcmVlSXRlbSB0SXRlbSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5VTEwpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbSwgdEl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRUZXh0SSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXRUZXh0SUxKYXZhX2xhbmdfU3RyaW5nCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRyZWVJdGVtLmdldERpc3BsYXkoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0QmFja2dyb3VuZCgpLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDApKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCksIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgpLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKDEwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0QmFja2dyb3VuZCgpLHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZCgwLCBibHVlKTsKLQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRyZWVJdGVtLmdldEJhY2tncm91bmQoMCkpOwotCQotCXRyZWVJdGVtLnNldEJhY2tncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRCYWNrZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0QmFja2dyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcih0cmVlSXRlbS5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JdHJlZUl0ZW0uc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0cmVlSXRlbS5nZXRCYWNrZ3JvdW5kKCkpOwotCXRyZWVJdGVtLnNldEJhY2tncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0QmFja2dyb3VuZCgpLHRyZWVJdGVtLmdldEJhY2tncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQl0cmVlSXRlbS5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsJCQotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2hlY2tlZFooKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRDaGVja2VkKCkpOwotCQotCXRyZWVJdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRDaGVja2VkKCkpOwotCi0JVHJlZSB0ID0gbmV3IFRyZWUoc2hlbGwsIFNXVC5DSEVDSyk7Ci0JVHJlZUl0ZW0gdGkgPSBuZXcgVHJlZUl0ZW0odCwgU1dULk5VTEwpOwotCXRpLnNldENoZWNrZWQodHJ1ZSk7Ci0JYXNzZXJ0VHJ1ZSh0aS5nZXRDaGVja2VkKCkpOwotCQotCXRpLnNldENoZWNrZWQoZmFsc2UpOwotCWFzc2VydEVxdWFscyhmYWxzZSwgdGkuZ2V0Q2hlY2tlZCgpKTsKLQl0LmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRFeHBhbmRlZFooKSB7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0cmVlSXRlbS5nZXRFeHBhbmRlZCgpKTsKLQkKLQkvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBzdWJpdGVtIGJlZm9yZSB5b3UgY2FuIHNldCB0aGUgdHJlZWl0ZW0gZXhwYW5kZWQKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCi0KLQluZXcgVHJlZUl0ZW0odHJlZUl0ZW0sIFNXVC5OVUxMKTsKLQl0cmVlSXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRyZWVJdGVtLmdldEV4cGFuZGVkKCkpOwotCQkKLQlUcmVlSXRlbSB0aSA9IG5ldyBUcmVlSXRlbSh0cmVlSXRlbSwgU1dULk5VTEwpOwotCXRpLnNldEV4cGFuZGVkKHRydWUpOwotCXRyZWVJdGVtLnNldEV4cGFuZGVkKGZhbHNlKTsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRpLmdldEV4cGFuZGVkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRm9udCBmb250ID0gdHJlZUl0ZW0uZ2V0Rm9udCgpOwotCXRyZWVJdGVtLnNldEZvbnQoZm9udCk7Ci0JYXNzZXJ0VHJ1ZShmb250LmVxdWFscyh0cmVlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250ID0gbmV3IEZvbnQodHJlZUl0ZW0uZ2V0RGlzcGxheSgpLCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDEwLCBTV1QuTk9STUFMKTsKLQl0cmVlSXRlbS5zZXRGb250KGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgpKSk7Ci0KLQl0cmVlSXRlbS5zZXRGb250KG51bGwpOwotCWFzc2VydFRydWUodHJlZS5nZXRGb250KCkuZXF1YWxzKCB0cmVlSXRlbS5nZXRGb250KCkpKTsKLQkKLQlmb250LmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRGb250KGZvbnQpOwotCQl0cmVlSXRlbS5zZXRGb250KG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKSB7Ci0JRGlzcGxheSBkaXNwbGF5ID0gdHJlZUl0ZW0uZ2V0RGlzcGxheSgpOwotCUZvbnQgZm9udCA9IG5ldyBGb250KGRpc3BsYXksIFN3dEp1bml0LnRlc3RGb250TmFtZSwgMTAsIFNXVC5OT1JNQUwpOwotCQotCS8vIG5vIGNvbHVtbnMKLQlhc3NlcnRUcnVlKHRyZWUuZ2V0Rm9udCgpLmVxdWFscyggdHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDApKSk7Ci0JdHJlZUl0ZW0uc2V0Rm9udCgwLCBmb250KTsKLQlhc3NlcnRUcnVlKGZvbnQuZXF1YWxzKHRyZWVJdGVtLmdldEZvbnQoMCkpKTsKLQkKLQkvLyBpbmRleCBiZXlvbmQgcmFuZ2UgLSBubyBlcnJvcgotCXRyZWVJdGVtLnNldEZvbnQoMTAsIGZvbnQpOwotCWFzc2VydFRydWUodHJlZUl0ZW0uZ2V0Rm9udCgpLmVxdWFscyh0cmVlSXRlbS5nZXRGb250KDEwKSkpOwotCQotCS8vIHdpdGggY29sdW1ucwotCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5MRUZUKTsKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRGb250KDEwLCBmb250KTsKLQlhc3NlcnRUcnVlKHRyZWVJdGVtLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgxMCkpKTsKLQkKLQl0cmVlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCXRyZWVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCBTd3RKdW5pdC50ZXN0Rm9udE5hbWUsIDIwLCBTV1QuTk9STUFMKTsKLQkKLQl0cmVlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCXRyZWVJdGVtLnNldEZvbnQoZm9udDIpOwotCWFzc2VydFRydWUoZm9udC5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCXRyZWVJdGVtLnNldEZvbnQoMCwgbnVsbCk7Ci0JYXNzZXJ0VHJ1ZShmb250Mi5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCXRyZWVJdGVtLnNldEZvbnQobnVsbCk7Ci0JYXNzZXJ0VHJ1ZSh0cmVlLmdldEZvbnQoKS5lcXVhbHModHJlZUl0ZW0uZ2V0Rm9udCgwKSkpOwotCQotCWZvbnQuZGlzcG9zZSgpOwotCWZvbnQyLmRpc3Bvc2UoKTsKLQkKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRGb250KDAsIGZvbnQpOwotCQl0cmVlSXRlbS5zZXRGb250KDAsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBkaXNwb3NlZCBmb250Iik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCkgewotCURpc3BsYXkgZGlzcGxheSA9IHRyZWVJdGVtLmdldERpc3BsYXkoKTsKLQlDb2xvciByZWQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCUNvbG9yIGJsdWUgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTFVFKTsKLQkKLQkvLyBubyBjb2x1bW5zCi0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0Rm9yZWdyb3VuZCgpLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDApKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDAsIHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKDEwLCByZWQpOwotCWFzc2VydEVxdWFscyh0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCksIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgxMCwgcmVkKTsKLQlhc3NlcnRFcXVhbHModHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgpLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKDEwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCByZWQpOwotCWFzc2VydEVxdWFscyhyZWQsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0Rm9yZWdyb3VuZCgpLHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZCgwLCBibHVlKTsKLQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKHJlZCk7Ci0JYXNzZXJ0RXF1YWxzKGJsdWUsIHRyZWVJdGVtLmdldEZvcmVncm91bmQoMCkpOwotCQotCXRyZWVJdGVtLnNldEZvcmVncm91bmQoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHJlZCwgdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChudWxsKTsKLQlhc3NlcnRFcXVhbHModHJlZS5nZXRGb3JlZ3JvdW5kKCksdHJlZUl0ZW0uZ2V0Rm9yZWdyb3VuZCgwKSk7Ci0JCi0JdHJ5IHsgCi0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDI1NSwgMCwgMCk7Ci0JCWNvbG9yLmRpc3Bvc2UoKTsKLQkJdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGNvbG9yIGRpc3Bvc2VkIik7CQkKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvcigpIHsKLQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcih0cmVlSXRlbS5nZXREaXNwbGF5KCksIDI1NSwgMCwgMCk7Ci0JdHJlZUl0ZW0uc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JYXNzZXJ0RXF1YWxzKGNvbG9yLCB0cmVlSXRlbS5nZXRGb3JlZ3JvdW5kKCkpOwotCXRyZWVJdGVtLnNldEZvcmVncm91bmQobnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0Rm9yZWdyb3VuZCgpLHRyZWVJdGVtLmdldEZvcmVncm91bmQoKSk7Ci0JY29sb3IuZGlzcG9zZSgpOwotCXRyeSB7IAotCQl0cmVlSXRlbS5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgY29sb3IgZGlzcG9zZWQiKTsKLQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRHcmF5ZWRaKCkgewotCVRyZWUgbmV3VHJlZSA9IG5ldyBUcmVlKHNoZWxsLCBTV1QuQ0hFQ0spOwotCVRyZWVJdGVtIHRJdGVtID0gbmV3IFRyZWVJdGVtKG5ld1RyZWUsMCk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JdEl0ZW0uc2V0R3JheWVkKHRydWUpOwotCWFzc2VydFRydWUodEl0ZW0uZ2V0R3JheWVkKCkpOwotCXRJdGVtLnNldEdyYXllZChmYWxzZSk7Ci0JYXNzZXJ0RXF1YWxzKGZhbHNlLCB0SXRlbS5nZXRHcmF5ZWQoKSk7Ci0JbmV3VHJlZS5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpIHsKLQlhc3NlcnROdWxsKHRyZWVJdGVtLmdldEltYWdlKDEpKTsJCi0gCXRyZWVJdGVtLnNldEltYWdlKC0xLCBudWxsKTsJCQotCWFzc2VydE51bGwodHJlZUl0ZW0uZ2V0SW1hZ2UoLTEpKTsJCi0JCQotCXRyZWVJdGVtLnNldEltYWdlKDAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1swXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwkKLSAJU3RyaW5nIHRleHRzW10gPSBuZXcgU3RyaW5nW2ltYWdlcy5sZW5ndGhdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJdGV4dHNbaV0gPSBTdHJpbmcudmFsdWVPZihpKTsKLQl9Ci0JCi0JLy90cmVlLnNldFRleHQodGV4dHMpOwkJCQkvLyBjcmVhdGUgZW5vdWdoIGNvbHVtbnMgZm9yIFRyZWVJdGVtLnNldEltYWdlKEltYWdlW10pIHRvIHdvcmsKLQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgdGV4dHMubGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBjb2x1bW5Db3VudDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKXsKLQkJCW5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FKTsKLQkJfQotCX0KLQlUcmVlQ29sdW1uW10gY29sdW1ucyA9IHRyZWUuZ2V0Q29sdW1ucygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJY29sdW1uc1tpXS5zZXRUZXh0KHRleHRzW2ldKTsKLQl9Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMSwgaW1hZ2VzWzFdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzFdLCB0cmVlSXRlbS5nZXRJbWFnZSgxKSk7CQotIAl0cmVlSXRlbS5zZXRJbWFnZShpbWFnZXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCWFzc2VydEVxdWFscyhpbWFnZXNbaV0sIHRyZWVJdGVtLmdldEltYWdlKGkpKTsKLQl9Ci0JdHJ5IHsKLQkJdHJlZUl0ZW0uc2V0SW1hZ2UoKEltYWdlIFtdKSBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgaW1hZ2VzID09IG51bGwiKTsKLQl9Ci0JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKSB7Ci0JLy8gbm8gY29sdW1ucwotCWFzc2VydEVxdWFscyhudWxsLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JLy8gaW5kZXggYmV5b25kIHJhbmdlIC0gbm8gZXJyb3IKLQl0cmVlSXRlbS5zZXRJbWFnZSgxMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMobnVsbCwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMTApKTsKLQkKLQkvLyB3aXRoIGNvbHVtbnMKLQluZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTEVGVCk7Ci0JbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQpOwotCQotCS8vIGluZGV4IGJleW9uZCByYW5nZSAtIG5vIGVycm9yCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMTAsIGltYWdlc1swXSk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDEwKSk7Ci0JCi0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgbnVsbCk7Ci0JYXNzZXJ0RXF1YWxzKG51bGwsIHRyZWVJdGVtLmdldEltYWdlKDApKTsKLQkKLQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKGltYWdlc1sxXSwgdHJlZUl0ZW0uZ2V0SW1hZ2UoMCkpOwotCQotCXRyZWVJdGVtLnNldEltYWdlKGltYWdlc1sxXSk7Ci0JdHJlZUl0ZW0uc2V0SW1hZ2UoMCwgaW1hZ2VzWzBdKTsKLQlhc3NlcnRFcXVhbHMoaW1hZ2VzWzBdLCB0cmVlSXRlbS5nZXRJbWFnZSgwKSk7Ci0JCi0JaW1hZ2VzWzBdLmRpc3Bvc2UoKTsKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBpbWFnZXNbMF0pOwotCQl0cmVlSXRlbS5zZXRJbWFnZSgwLCBudWxsKTsKLQkJZmFpbCgiTm8gZXhjZXB0aW9uIHRocm93biBmb3IgZGlzcG9zZWQgZm9udCIpOwotCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JfQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldFRleHQoKFN0cmluZyBbXSkgbnVsbCk7Ci0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZ3MgPT0gbnVsbCIpOwotCX0KLQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQl9Ci0JCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBoYXMgb25seSAKLSAJKiB0aGUgZGVmYXVsdCBjb2x1bW4uCi0gCSovCi0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwotCQotCXRyZWVJdGVtLnNldFRleHQoVGVzdFN0cmluZ3MpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nc1swXSwgdHJlZUl0ZW0uZ2V0VGV4dCgwKSk7Ci0JZm9yIChpbnQgaSA9IDE7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dChpKS5sZW5ndGgoKSk7Ci0JfQotCQotCQotICAgLyoKLSAJKiBUZXN0IHRoZSBnZXRUZXh0L3NldFRleHQgQVBJIHdpdGggYSBUcmVlIHRoYXQgZW5vdWdoIAotIAkqIGNvbHVtbnMgdG8gZml0IGFsbCB0ZXN0IGl0ZW0gdGV4dHMuCi0gCSovCi0gCQkKLQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgaW1hZ2VzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7Ci0KLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCl7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmcgPSAidGVzdCI7Ci0JZmluYWwgU3RyaW5nIFRlc3RTdHJpbmdzW10gPSBuZXcgU3RyaW5nW10ge1Rlc3RTdHJpbmcsIFRlc3RTdHJpbmcgKyAiMSIsIFRlc3RTdHJpbmcgKyAiMiJ9OwotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBoYXMgb25seSAKLSAJKiB0aGUgZGVmYXVsdCBjb2x1bW4uCi0gCSovCi0JCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMSkubGVuZ3RoKCkpOwkKLSAJdHJlZUl0ZW0uc2V0VGV4dCgxLCBUZXN0U3RyaW5nKTsKLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KDApLmxlbmd0aCgpKTsKLQkKLQl0cmVlSXRlbS5zZXRUZXh0KDAsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0cmVlSXRlbS5nZXRUZXh0KDApKTsKLSAJdHJlZUl0ZW0uc2V0VGV4dCgtMSwgVGVzdFN0cmluZ3NbMV0pOwotCWFzc2VydEVxdWFscygwLCB0cmVlSXRlbS5nZXRUZXh0KC0xKS5sZW5ndGgoKSk7CQotCi0gICAvKgotIAkqIFRlc3QgdGhlIGdldFRleHQvc2V0VGV4dCBBUEkgd2l0aCBhIFRyZWUgdGhhdCBlbm91Z2ggCi0gCSogY29sdW1ucyB0byBmaXQgYWxsIHRlc3QgaXRlbSB0ZXh0cy4KLSAJKi8KLQotCW1ha2VDbGVhbkVudmlyb25tZW50KCk7Ci0JCi0JLy90cmVlLnNldFRleHQoVGVzdFN0cmluZ3MpOwkJCQkvLyBjcmVhdGUgYW5vdWdoIGNvbHVtbnMgZm9yIFRyZWVJdGVtLnNldFRleHQoU3RyaW5nW10pIHRvIHdvcmsKLQlpbnQgY29sdW1uQ291bnQgPSB0cmVlLmdldENvbHVtbkNvdW50KCk7Ci0JaWYgKGNvbHVtbkNvdW50IDwgaW1hZ2VzLmxlbmd0aCkgewotCQlmb3IgKGludCBpID0gY29sdW1uQ291bnQ7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspewotCQkJbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUpOwotCQl9Ci0JfQotCVRyZWVDb2x1bW5bXSBjb2x1bW5zID0gdHJlZS5nZXRDb2x1bW5zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBUZXN0U3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQljb2x1bW5zW2ldLnNldFRleHQoVGVzdFN0cmluZ3NbaV0pOwotCX0KLQlhc3NlcnRFcXVhbHMoMCwgdHJlZUl0ZW0uZ2V0VGV4dCgxKS5sZW5ndGgoKSk7CQotCi0KLQl0cmVlSXRlbS5zZXRUZXh0KDEsIFRlc3RTdHJpbmcpOwotCWFzc2VydEVxdWFscyhUZXN0U3RyaW5nLCB0cmVlSXRlbS5nZXRUZXh0KDEpKTsJCi0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoMCkubGVuZ3RoKCkpOwotCQotCXRyZWVJdGVtLnNldFRleHQoMCwgVGVzdFN0cmluZyk7Ci0JYXNzZXJ0RXF1YWxzKFRlc3RTdHJpbmcsIHRyZWVJdGVtLmdldFRleHQoMCkpOwotCi0KLQl0cmVlSXRlbS5zZXRUZXh0KC0xLCBUZXN0U3RyaW5nc1sxXSk7Ci0JYXNzZXJ0RXF1YWxzKDAsIHRyZWVJdGVtLmdldFRleHQoLTEpLmxlbmd0aCgpKTsJCi0KLQotCXRyeSB7Ci0JCXRyZWVJdGVtLnNldFRleHQoLTEsIG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQkKLQl0cnkgewotCQl0cmVlSXRlbS5zZXRUZXh0KDAsIG51bGwpOwkJCi0JCWZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIHN0cmluZyA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0gCi0KLQotfQotCi0vL3B1YmxpYyB2b2lkIHRlc3Rfc2V0VGV4dExqYXZhX2xhbmdfU3RyaW5nKCkgewotLy8JdHJ5IHsKLS8vCQl0cmVlSXRlbS5zZXRUZXh0KChTdHJpbmcpbnVsbCk7CQkKLS8vCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBzdHJpbmcgPT0gbnVsbCIpOwotLy8JfQotLy8JY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0vLwl9Ci0vL30KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEJhY2tncm91bmRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRCb3VuZHMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldENoZWNrZWQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEV4cGFuZGVkIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRGb250SSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEdyYXllZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0SW1hZ2VCb3VuZHNJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJbWFnZUkiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1JIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRJdGVtQ291bnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldEl0ZW1zIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRQYXJlbnQiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFBhcmVudEl0ZW0iKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2dldFRleHRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRCYWNrZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRDaGVja2VkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RXhwYW5kZWRaIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb250SUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9udExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfRm9udCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0Rm9yZWdyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRGb3JlZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0R3JheWVkWiIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0SW1hZ2VMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0JExqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKTsKLQltZXRob2ROYW1lcy5hZGRBbGwoVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19JdGVtLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJIikpIHRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHJlZUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1RyZWVJdGVtSUkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UcmVlSXRlbUlJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRCYWNrZ3JvdW5kIikpIHRlc3RfZ2V0QmFja2dyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0QmFja2dyb3VuZEkiKSkgdGVzdF9nZXRCYWNrZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Qm91bmRzSSIpKSB0ZXN0X2dldEJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEJvdW5kcyIpKSB0ZXN0X2dldEJvdW5kcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Q2hlY2tlZCIpKSB0ZXN0X2dldENoZWNrZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEV4cGFuZGVkIikpIHRlc3RfZ2V0RXhwYW5kZWQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEZvbnQiKSkgdGVzdF9nZXRGb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb250SSIpKSB0ZXN0X2dldEZvbnRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRGb3JlZ3JvdW5kIikpIHRlc3RfZ2V0Rm9yZWdyb3VuZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0Rm9yZWdyb3VuZEkiKSkgdGVzdF9nZXRGb3JlZ3JvdW5kSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0R3JheWVkIikpIHRlc3RfZ2V0R3JheWVkKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRJbWFnZUJvdW5kc0kiKSkgdGVzdF9nZXRJbWFnZUJvdW5kc0koKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEltYWdlSSIpKSB0ZXN0X2dldEltYWdlSSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbUkiKSkgIHRlc3RfZ2V0SXRlbUkoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldEl0ZW1Db3VudCIpKSB0ZXN0X2dldEl0ZW1Db3VudCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0SXRlbXMiKSkgdGVzdF9nZXRJdGVtcygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0UGFyZW50IikpIHRlc3RfZ2V0UGFyZW50KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRQYXJlbnRJdGVtIikpIHRlc3RfZ2V0UGFyZW50SXRlbSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0VGV4dEkiKSkgdGVzdF9nZXRUZXh0SSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0QmFja2dyb3VuZElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRCYWNrZ3JvdW5kTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Db2xvciIpKSB0ZXN0X3NldEJhY2tncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRDaGVja2VkWiIpKSB0ZXN0X3NldENoZWNrZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRFeHBhbmRlZFoiKSkgdGVzdF9zZXRFeHBhbmRlZFooKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250IikpIHRlc3Rfc2V0Rm9udElMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvbnRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ZvbnQiKSkgdGVzdF9zZXRGb250TG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19Gb250KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IiKSkgdGVzdF9zZXRGb3JlZ3JvdW5kSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEZvcmVncm91bmRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0NvbG9yIikpIHRlc3Rfc2V0Rm9yZWdyb3VuZExvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfQ29sb3IoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEdyYXllZFoiKSkgdGVzdF9zZXRHcmF5ZWRaKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRJbWFnZSRMb3JnX2VjbGlwc2Vfc3d0X2dyYXBoaWNzX0ltYWdlIikpIHRlc3Rfc2V0SW1hZ2UkTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0SW1hZ2VJTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlSUxvcmdfZWNsaXBzZV9zd3RfZ3JhcGhpY3NfSW1hZ2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSIpKSB0ZXN0X3NldEltYWdlTG9yZ19lY2xpcHNlX3N3dF9ncmFwaGljc19JbWFnZSgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfc2V0VGV4dCRMamF2YV9sYW5nX1N0cmluZyIpKSB0ZXN0X3NldFRleHQkTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldFRleHRJTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0SUxqYXZhX2xhbmdfU3RyaW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9zZXRUZXh0TGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIHN1cGVyLnJ1blRlc3QoKTsKLX0KLQotLyogY3VzdG9tICovCi1UcmVlSXRlbSB0cmVlSXRlbTsKLVRyZWUgdHJlZTsKLQotLy8gdGhpcyBtZXRob2QgbXVzdCBiZSBwcml2YXRlIG9yIHByb3RlY3RlZCBzbyB0aGUgYXV0by1nZW4gdG9vbCBrZWVwcyBpdAotcHJpdmF0ZSB2b2lkIG1ha2VDbGVhbkVudmlyb25tZW50KCkgewotCWlmICggdHJlZUl0ZW0gIT0gbnVsbCApIHRyZWVJdGVtLmRpc3Bvc2UoKTsKLQlpZiAoIHRyZWUgIT0gbnVsbCApIHRyZWUuZGlzcG9zZSgpOwotCXRyZWUgPSBuZXcgVHJlZShzaGVsbCwgMCk7Ci0JdHJlZUl0ZW0gPSBuZXcgVHJlZUl0ZW0odHJlZSwgMCk7Ci0Jc2V0V2lkZ2V0KHRyZWVJdGVtKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRjMjljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0OwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyIGV4dGVuZHMgU3d0VGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19UeXBlZExpc3RlbmVyKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF9pbnRlcm5hbF9TV1RFdmVudExpc3RlbmVyKCkgewotCS8vIGRvIG5vdCB0ZXN0IGludGVybmFsIHB1YmxpYyBtZXRob2RzIChub24tQVBJKQotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2dldEV2ZW50TGlzdGVuZXIoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0JLy8gZG8gbm90IHRlc3QgaW50ZXJuYWwgcHVibGljIG1ldGhvZHMgKG5vbi1BUEkpCi19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfVHlwZWRMaXN0ZW5lcigoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RXZlbnRMaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfQ29uc3RydWN0b3JMb3JnX2VjbGlwc2Vfc3d0X2ludGVybmFsX1NXVEV2ZW50TGlzdGVuZXIiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3RfaW50ZXJuYWxfU1dURXZlbnRMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZ2V0RXZlbnRMaXN0ZW5lciIpKSB0ZXN0X2dldEV2ZW50TGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2hhbmRsZUV2ZW50TG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0V2ZW50IikpIHRlc3RfaGFuZGxlRXZlbnRMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwNGNkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L1Rlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLQotLyoqCi0gKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3Mgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQKLSAqLwotcHVibGljIGNsYXNzIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0IGV4dGVuZHMgU3d0VGVzdENhc2UgewotCS8vIFVzZSB0aGlzIHZhcmlhYmxlIHRvIGhlbHAgdmFsaWRhdGUgY2FsbGJhY2tzCi0JYm9vbGVhbiBsaXN0ZW5lckNhbGxlZDsKLQotcHVibGljIFRlc3Rfb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfV2lkZ2V0KFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0Jc2hlbGwgPSBuZXcgU2hlbGwoKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7Ci0JaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgd2lkZ2V0LmlzRGlzcG9zZWQoKSk7Ci0JfQotCWFzc2VydEVxdWFscyhmYWxzZSwgc2hlbGwuaXNEaXNwb3NlZCgpKTsKLQlzaGVsbC5kaXNwb3NlKCk7Ci0JaWYgKHdpZGdldCAhPSBudWxsKSB7Ci0JCWFzc2VydFRydWUod2lkZ2V0LmlzRGlzcG9zZWQoKSk7Ci0JfQotCWFzc2VydFRydWUoc2hlbGwuaXNEaXNwb3NlZCgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCkgewotCS8vIGFic3RyYWN0IGNsYXNzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyKCkgewotCURpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXdpZGdldC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCXdpZGdldC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpIHsKLQl0cnkgewotCQl3aWRnZXQuYWRkTGlzdGVuZXIoU1dULkRpc3Bvc2UsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCX0KLQl9OwotCXdpZGdldC5hZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Rpc3Bvc2UoKSB7Ci0JLy8gdGVzdGVkIGluIHRlYXJEb3duCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfZ2V0RGF0YSgpIHsKLQkvLyB0ZXN0ZWQgaW4gdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5KCkgewotCWFzc2VydEVxdWFscyh3aWRnZXQuZ2V0RGlzcGxheSgpLCB3aWRnZXQuZ2V0RGlzcGxheSgpKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9nZXRTdHlsZSgpIHsKLQkvLyB0aGlzIHRlc3Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgbGVhZiBzdWJjbGFzc2VzCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfaXNEaXNwb3NlZCgpIHsKLQlhc3NlcnRFcXVhbHMoZmFsc2UsIHdpZGdldC5pc0Rpc3Bvc2VkKCkpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKSB7Ci0Jd2lkZ2V0Lm5vdGlmeUxpc3RlbmVycygwLCBudWxsKTsKLQlFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotCUdDIGdjID0gbnVsbDsKLQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkgewotCQlnYyA9IGV2ZW50LmdjID0gbmV3IEdDKChDb250cm9sKXdpZGdldCk7Ci0JfQotCXdpZGdldC5ub3RpZnlMaXN0ZW5lcnMoU1dULlBhaW50LCBldmVudCk7Ci0JaWYgKGdjICE9IG51bGwpIGdjLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JLy8gdGVzdGVkIGluIHRlc3RfYWRkRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyCi19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCkgewotCS8vIHRoaXMgbWV0aG9kIGlzIGZ1cnRoZXIgdGVzdGVkIGJ5IGFsbCBvZiB0aGUgcmVtb3ZlVHlwZWRMaXN0ZW5lciB0ZXN0cwotCXRyeSB7Ci0JCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuUGFpbnQsIG51bGwpOwotCQlmYWlsKCJObyBleGNlcHRpb24gdGhyb3duIGZvciBsaXN0ZW5lciA9PSBudWxsIik7Ci0JfQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCX0KLQotCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQl9Ci0JfSk7Ci0JCi0JTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJfQotCX07Ci0Jd2lkZ2V0LmFkZExpc3RlbmVyKFNXVC5QYWludCwgbGlzdGVuZXIpOwotCXdpZGdldC5yZW1vdmVMaXN0ZW5lcihTV1QuUGFpbnQsIGxpc3RlbmVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0Jd2lkZ2V0LnNldERhdGEod2lkZ2V0KTsKLQlhc3NlcnRFcXVhbHMod2lkZ2V0LCB3aWRnZXQuZ2V0RGF0YSgpKTsKLQotCXdpZGdldC5zZXREYXRhKG51bGwpOwotCWFzc2VydE51bGwod2lkZ2V0LmdldERhdGEoKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKSB7Ci0Jd2lkZ2V0LnNldERhdGEoInRoZSB3aWRnZXQiLCB3aWRnZXQpOwotCWFzc2VydEVxdWFscyh3aWRnZXQsIHdpZGdldC5nZXREYXRhKCJ0aGUgd2lkZ2V0IikpOwotCi0Jd2lkZ2V0LnNldERhdGEoInRoZSB3aWRnZXQiLCBudWxsKTsKLQlhc3NlcnROdWxsKHdpZGdldC5nZXREYXRhKCJ0aGUgd2lkZ2V0IikpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X3RvU3RyaW5nKCkgewotCWFzc2VydE5vdE51bGwod2lkZ2V0LnRvU3RyaW5nKCkpOwotCWFzc2VydFRydWUod2lkZ2V0LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKTsKLX0KLQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbWV0aG9kTmFtZXMoKTsKLQlqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG1ldGhvZE5hbWVzLmVsZW1lbnRzKCk7Ci0Jd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdF9vcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotCi1wdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZGlzcG9zZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF0YSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfZ2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXREaXNwbGF5Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9nZXRTdHlsZSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaXNEaXNwb3NlZCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfcmVtb3ZlRGlzcG9zZUxpc3RlbmVyTG9yZ19lY2xpcHNlX3N3dF9ldmVudHNfRGlzcG9zZUxpc3RlbmVyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9yZW1vdmVMaXN0ZW5lcklMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfTGlzdGVuZXIiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX09iamVjdCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJ0ZXN0X3RvU3RyaW5nIik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X0NvbnN0cnVjdG9yTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX1dpZGdldEkiKSkgdGVzdF9Db25zdHJ1Y3RvckxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19XaWRnZXRJKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIiKSkgdGVzdF9hZGREaXNwb3NlTGlzdGVuZXJMb3JnX2VjbGlwc2Vfc3d0X2V2ZW50c19EaXNwb3NlTGlzdGVuZXIoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lciIpKSB0ZXN0X2FkZExpc3RlbmVySUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19MaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZGlzcG9zZSIpKSB0ZXN0X2Rpc3Bvc2UoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERhdGEiKSkgdGVzdF9nZXREYXRhKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmciKSkgdGVzdF9nZXREYXRhTGphdmFfbGFuZ19TdHJpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2dldERpc3BsYXkiKSkgdGVzdF9nZXREaXNwbGF5KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9nZXRTdHlsZSIpKSB0ZXN0X2dldFN0eWxlKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pc0Rpc3Bvc2VkIikpIHRlc3RfaXNEaXNwb3NlZCgpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3Rfbm90aWZ5TGlzdGVuZXJzSUxvcmdfZWNsaXBzZV9zd3Rfd2lkZ2V0c19FdmVudCIpKSB0ZXN0X25vdGlmeUxpc3RlbmVyc0lMb3JnX2VjbGlwc2Vfc3d0X3dpZGdldHNfRXZlbnQoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lciIpKSB0ZXN0X3JlbW92ZURpc3Bvc2VMaXN0ZW5lckxvcmdfZWNsaXBzZV9zd3RfZXZlbnRzX0Rpc3Bvc2VMaXN0ZW5lcigpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyIikpIHRlc3RfcmVtb3ZlTGlzdGVuZXJJTG9yZ19lY2xpcHNlX3N3dF93aWRnZXRzX0xpc3RlbmVyKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QiKSkgdGVzdF9zZXREYXRhTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3NldERhdGFMamF2YV9sYW5nX1N0cmluZ0xqYXZhX2xhbmdfT2JqZWN0IikpIHRlc3Rfc2V0RGF0YUxqYXZhX2xhbmdfU3RyaW5nTGphdmFfbGFuZ19PYmplY3QoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3RvU3RyaW5nIikpIHRlc3RfdG9TdHJpbmcoKTsKLX0KLQotLyogY3VzdG9tICovCi1wdWJsaWMgU2hlbGwgc2hlbGw7Ci1wcml2YXRlIFdpZGdldCB3aWRnZXQ7Ci0KLXByb3RlY3RlZCB2b2lkIHNldFdpZGdldChXaWRnZXQgdykgewotCXdpZGdldCA9IHc7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGhvb2tMaXN0ZW5lcnMoV2lkZ2V0IHcsIGludFtdIHR5cGVzLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdy5hZGRMaXN0ZW5lcih0eXBlc1tpXSwgbGlzdGVuZXIpOwotICAgIH0KLX0KLQotcHJvdGVjdGVkIFN0cmluZ1tdIGhvb2tFeHBlY3RlZEV2ZW50cyhTdHJpbmcgdHlwZSwgZmluYWwgamF2YS51dGlsLlZlY3RvciBldmVudHMpIHsKLSAgICByZXR1cm4gaG9va0V4cGVjdGVkRXZlbnRzKHdpZGdldCwgdHlwZSwgZXZlbnRzKTsKLX0KLQotcHJvdGVjdGVkIFN0cmluZ1tdIGhvb2tFeHBlY3RlZEV2ZW50cyhXaWRnZXQgdywgU3RyaW5nIHR5cGUsIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZXZlbnRzKSB7Ci0gICAgU3RyaW5nW10gZXhwZWN0ZWRFdmVudHMgPSAoU3RyaW5nW10pQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50T3JkZXJpbmcuZ2V0KHR5cGUpOwotICAgIGhvb2tFeHBlY3RlZEV2ZW50cyh3LCBleHBlY3RlZEV2ZW50cywgZXZlbnRzKTsKLSAgICByZXR1cm4gZXhwZWN0ZWRFdmVudHM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIGhvb2tFeHBlY3RlZEV2ZW50cyhXaWRnZXQgdywgU3RyaW5nW10gdHlwZXMsIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZXZlbnRzKSB7Ci0gICAgaG9va0xpc3RlbmVycyh3LCBDb25zaXN0ZW5jeVV0aWxpdHkuY29udmVydEV2ZW50TmFtZXModHlwZXMpLCAKLQkgICAgICAgIG5ldyBMaXN0ZW5lcigpIHsKLQkgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wID0gQ29uc2lzdGVuY3lVdGlsaXR5LmV2ZW50TmFtZXNbZS50eXBlXTsKLQkgICAgICAgICAgICAgICAgaWYoZS50eXBlID09IFNXVC5UcmF2ZXJzZSkKLQkgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjoiK0NvbnNpc3RlbmN5VXRpbGl0eS5nZXRUcmF2ZXJzYWxUeXBlKGUuZGV0YWlsKTsKLQkgICAgICAgICAgICAgICAgZWxzZSBpZihlLnR5cGUgPT0gU1dULlNlbGVjdGlvbikKLQkgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjoiK0NvbnNpc3RlbmN5VXRpbGl0eS5nZXRTZWxlY3Rpb25UeXBlKGUuZGV0YWlsKTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmFkZCh0ZW1wKTsKLQkgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlbXAgKyBlLndpZGdldCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfSk7Ci19Ci0KLXByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7Ci0gICAgU3RyaW5nIHRlc3QgPSBnZXROYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gdGVzdC5sYXN0SW5kZXhPZignXycpOwotICAgIGlmKGluZGV4ICE9IC0xKQotICAgICAgICB0ZXN0ID0gdGVzdC5zdWJzdHJpbmcoaW5kZXgrMSwgdGVzdC5sZW5ndGgoKSk7Ci0gICAgU3RyaW5nIGNsc3MgPSBnZXRDbGFzc05hbWUoKTsKLSAgICBpZigoIXRlc3QuZXF1YWxzKCJNZW51RGV0ZWN0IikgfHwgY2xzcy5lcXVhbHMoIlRhYmxlIikgfHwgY2xzcy5lcXVhbHMoIlRhYmxlVHJlZSIpIHx8IHRlc3Quc3RhcnRzV2l0aCgiQ2hldnJvbiIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIkRyYWdEZXRlY3QiKSB8fCBjbHNzLmVxdWFscygiVHJlZSIpIHx8IGNsc3MuZXF1YWxzKCJUYWJsZVRyZWUiKSB8fCB0ZXN0LnN0YXJ0c1dpdGgoIkNoZXZyb24iKSkgJiYKLSAgICAgICAoIXRlc3QuZXF1YWxzKCJEb3VibGVDbGljayIpIHx8IGNsc3MuZXF1YWxzKCJMaXN0IikpICYmCi0gICAgICAgKCF0ZXN0LmVxdWFscygiS2V5U2VsZWN0aW9uIikgfHwgY2xzcy5lcXVhbHMoIlNsaWRlciIpIHx8IGNsc3MuZXF1YWxzKCJDb21ibyIpIHx8IGNsc3MuZXF1YWxzKCJDQ29tYm8iKSB8fCBjbHNzLmVxdWFscygiQ1RhYkZvbGRlciIpKSAmJgotICAgICAgICghdGVzdC5lcXVhbHMoIkVudGVyU2VsZWN0aW9uIikgfHwgY2xzcy5lcXVhbHMoIkJ1dHRvbiIpIHx8IGNsc3MuZXF1YWxzKCJUb29sQmFyIikgfHwgY2xzcy5lcXVhbHMoIkNDb21ibyIpIHx8IGNsc3MuZXF1YWxzKCJFeHBhbmRCYXIiKSkpCi0gICAgICAgIHRlc3QgPSBjbHNzICsgdGVzdDsKLSAgICByZXR1cm4gdGVzdDsKLX0KLQotcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgU3RyaW5nIGNsYXp6ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgaW50IGluZGV4ID0gY2xhenoubGFzdEluZGV4T2YoJ18nKTsKLSAgICBpZihpbmRleCAhPSAtMSkKLSAgICAgICAgY2xhenogPSBjbGF6ei5zdWJzdHJpbmcoaW5kZXgrMSwgY2xhenoubGVuZ3RoKCkpOwotICAgIHJldHVybiBjbGF6ejsKLX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDY2YjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXIxIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGxvY2F0aW9uQ2hhbmdpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2VkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVVJMIExvYWRpbmcgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBMb2NhdGlvbi5jaGFuZ2luZyA+IExvY2F0aW9uLmNoYW5nZWQgKHRvcCB0cnVlKT4gUHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5naW5nICIrZXZlbnQubG9jYXRpb24pOwotCQkJCS8qIGNlcnRhaW4gYnJvd3NlcnMgZG8gc2VuZCBtdWx0aXBsZSBjaGFuZ2luZyBldmVudHMuIFNhZmFyaSBkb2VzIHRoaXMuICovCi0JCQkJLyogdmVyaWZ5IHRoZSBwYWdlIGhhcyBub3QgYmVlbiByZXBvcnRlZCBhcyBiZWluZyBsb2FkZWQgKi8KLQkJCQlwYXNzZWQgPSAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24pOwotCQkJCS8qIGlnbm9yZSBub24gdG9wIGZyYW1lIGxvYWRpbmcgKi8KLQkJCQlpZiAoIWV2ZW50LnRvcCkgcmV0dXJuOwotCQkJCS8qIHZlcmlmeSBhIGNoYW5nZWQgZm9sbG93cyBhdCBsZWFzdCBvbmUgY2hhbmdpbmcgKi8KLQkJCQkvKiB2ZXJpZnkgdGhlIHBhZ2UgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIGFzIGJlaW5nIGxvYWRlZCAqLwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uQ2hhbmdpbmcgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkIik7Ci0JCQkJcGFzc2VkID0gbG9jYXRpb25DaGFuZ2luZyAmJiBsb2NhdGlvbkNoYW5nZWQgJiYgIXByb2dyZXNzQ29tcGxldGVkOwotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCQkvLyBURU1QT1JBUklMWSBDT01NRU5URUQgT1VUCi0JCQkJLyppZiAoIXBhc3NlZCkqLyBzaGVsbC5jbG9zZSgpOwotLyoJCQkJaWYgKHBhc3NlZCkgewotCQkJCQkgd2FpdCBhIGxpdHRsZSBiaXQgbW9yZSBiZWZvcmUgZGVjbGFyaW5nIGl0IGEgc3VjY2VzcywKLQkJCQkJICogaW4gY2FzZSBib2d1cyBldmVudHMgZm9sbG93IHRoaXMgb25lLgotCQkJCQkgCi0JCQkJCW5ldyBUaHJlYWQoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCQl0cnkgeyBzbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OwotCQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQkJfTsKLQkJCQkJfS5zdGFydCgpOwotCQkJCX0KLSovCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QyKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVVJMIExvYWRpbmcgRmlsdGVyaW5nIC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgPiBubyBMb2NhdGlvbi5jaGFuZ2VkLCBubyBQcm9ncmVzcy5jb21wbGV0ZWQiKTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdpbmcgIitldmVudC5sb2NhdGlvbik7Ci0JCQkJcGFzc2VkID0gIWxvY2F0aW9uQ2hhbmdpbmcgJiYgIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCX0KLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCXBhc3NlZCA9IGV2ZW50LmxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCAiK2V2ZW50LmxvY2F0aW9uKyIgIitwYXNzZWQpOwotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJLyoKLQkJCQkgKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IGxvY2F0aW9uLCBJRSBzdGlsbCBmaXJlcyBhIERvY3VtZW50Q29tcGxldGUKLQkJCQkgKiBmb2xsb3dpbmcgdGhlIEJlZm9yZU5hdmlnYXRlMiBjYW5jZWwgZXZlbnQuIFRoaXMgRG9jdW1lbnRDb21wbGV0ZSBldmVudCBjb250YWlucyBhbiBlbXB0eSBVUkwKLQkJCQkgKiBzaW5jZSB0aGUgVVJMIGluIEJlZm9yZU5hdmlnYXRlMiB3YXMgY29ycmVjdGx5IGNhbmNlbGxlZC4KLQkJCQkgKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gc2VuZCBhIExvY2F0aW9uLmNoYW5nZWQgYW5kIGEgUHJvZ3Jlc3MuY29tcGxldGVkIGV2ZW50cyBhZnRlcgotCQkJCSAqIGEgTG9jYXRpb24uY2hhbmdpbmcgY2FuY2VsIHRydWUgLSBhdCB0aGUgY29uZGl0aW9uIHRoYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgZW1wdHksCi0JCQkJICogb3RoZXJ3aXNlIGl0IGlzIGNvbnNpZGVyZWQgdGhhdCB0aGUgbG9jYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLiAKLQkJCQkgKi8KLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBicm93c2VyLmdldFVybCgpOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVkICIrcGFzc2VkKTsKLQkJCQlwcm9ncmVzc0NvbXBsZXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCVN0cmluZ1tdIHVybHMgPSB7Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbSJ9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0Mih1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZjY1YWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXIyIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGxvY2F0aW9uQ2hhbmdpbmcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbG9jYXRpb25DaGFuZ2VkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyBodG1sKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInNldFRleHQgLSBhcmdzOiAiK2h0bWwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogTG9jYXRpb24uY2hhbmdpbmcgPiBMb2NhdGlvbi5jaGFuZ2VkID4gUHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQlsb2NhdGlvbkNoYW5naW5nID0gbG9jYXRpb25DaGFuZ2VkID0gcHJvZ3Jlc3NDb21wbGV0ZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5naW5nICIrZXZlbnQubG9jYXRpb24pOwotCQkJCS8qIGNlcnRhaW4gYnJvd3NlcnMgZG8gc2VuZCBtdWx0aXBsZSBjaGFuZ2luZyBldmVudHMuIFNhZmFyaSBkb2VzIHRoaXMuICovCi0JCQkJcGFzc2VkID0gIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2VkICIrZXZlbnQubG9jYXRpb24pOwotCQkJCXBhc3NlZCA9IGxvY2F0aW9uQ2hhbmdpbmcgJiYgIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCQlpZiAoIXBhc3NlZCkgc2hlbGwuY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkUHJvZ3Jlc3NMaXN0ZW5lcihuZXcgUHJvZ3Jlc3NMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZWQiKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbkNoYW5naW5nICYmIGxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJCWlmICghcGFzc2VkKSBzaGVsbC5jbG9zZSgpOwotCQkJCWlmIChwYXNzZWQpIHsKLQkJCQkJLyogd2FpdCBhIGxpdHRsZSBiaXQgbW9yZSBiZWZvcmUgZGVjbGFyaW5nIGl0IGEgc3VjY2VzcywKLQkJCQkJICogaW4gY2FzZSBib2d1cyBldmVudHMgZm9sbG93IHRoaXMgb25lLgotCQkJCQkgKi8KLQkJCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBzdGFydCIpOwotCQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwuY2xvc2UoKTsJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIG92ZXIiKTsKLQkJCQkJCX0KLQkJCQkJfS5zdGFydCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VGV4dChodG1sKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QyKFN0cmluZyBodG1sKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInNldFRleHQgVVJMIExvYWRpbmcgRmlsdGVyaW5nIC0gYXJnczogIitodG1sKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlID4gbm8gTG9jYXRpb24uY2hhbmdlZCwgbm8gUHJvZ3Jlc3MuY29tcGxldGVkIik7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRMb2NhdGlvbkxpc3RlbmVyKG5ldyBMb2NhdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5naW5nICIrZXZlbnQubG9jYXRpb24pOwotCQkJCS8qCi0JCQkJKiBGZWF0dXJlIG9uIEludGVybmV0IEV4cGxvcmVyLiAgV2hlbiBwZW5kaW5nIHJlcXVlc3RzIGFyZSBzdG9wcGVkLCBJRQotCQkJCSogZW1pdHMgYSBMb2NhdGlvbi5jaGFuZ2luZyB3aXRoIHJlczovL0M6XFdJTkRPV1NcU3lzdGVtMzJcc2hkb2NsYy5kbGwvbmF2Y2FuY2wuaHRtLgotCQkJCSogUGVuZGluZyByZXF1ZXN0cyBhcmUgc3RvcHBlZCBiZWZvcmUgZ29pbmcgdG8gdGhlIGJsYW5rIHBhZ2UgdG8gc2V0IEhUTUwgaW4gbWVtb3J5Ci0JCQkJKiB3aXRoIHNldFRleHQuCi0JCQkJKiBUaGUgdGVzdCBjb25zaWRlcnMgaXQgaXMgT0sgdG8gZ2V0IG11bHRpcGxlIExvY2F0aW9uLmNoYW5naW5nIGV2ZW50cyBhdCB0aGUgY29uZGl0aW9uCi0JCQkJKiB0aGF0IG5vIGxvY2F0aW9uQ2hhbmdlZCBhbmQgcHJvZ3Jlc3NDb21wbGV0ZWQgYXJlIHJlcG9ydGVkLgotCQkJCSovCi0JCQkJcGFzc2VkID0gIWxvY2F0aW9uQ2hhbmdlZCAmJiAhcHJvZ3Jlc3NDb21wbGV0ZWQ7Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQkJaWYgKCFwYXNzZWQpIHsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlldmVudC5kb2l0ID0gZmFsc2U7Ci0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCl7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oInRpbWVyIGFzeW5jZXhlYyBzaGVsbC5jbG9zZSIpOwotCQkJCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLmNsb3NlKCk7CQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBvdmVyIik7Ci0JCQkJCX0KLQkJCQl9LnN0YXJ0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvKgotCQkJCSAqIEZlYXR1cmUgb24gSW50ZXJuZXQgRXhwbG9yZXIuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgbG9jYXRpb24sIElFIHN0aWxsIGZpcmVzIGEgRG9jdW1lbnRDb21wbGV0ZQotCQkJCSAqIGZvbGxvd2luZyB0aGUgQmVmb3JlTmF2aWdhdGUyIGNhbmNlbCBldmVudC4gVGhpcyBEb2N1bWVudENvbXBsZXRlIGV2ZW50IGNvbnRhaW5zIGFuIGVtcHR5IFVSTAotCQkJCSAqIHNpbmNlIHRoZSBVUkwgaW4gQmVmb3JlTmF2aWdhdGUyIHdhcyBjb3JyZWN0bHkgY2FuY2VsbGVkLgotCQkJCSAqIFRoZSB0ZXN0IGNvbnNpZGVycyBpdCBpcyBPSyB0byBzZW5kIGEgTG9jYXRpb24uY2hhbmdlZCBhbmQgYSBQcm9ncmVzcy5jb21wbGV0ZWQgZXZlbnRzIGFmdGVyCi0JCQkJICogYSBMb2NhdGlvbi5jaGFuZ2luZyBjYW5jZWwgdHJ1ZSAtIGF0IHRoZSBjb25kaXRpb24gdGhhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBlbXB0eSwKLQkJCQkgKiBvdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCB0aGF0IHRoZSBsb2NhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQuIAotCQkJCSAqLwotCQkJCXBhc3NlZCA9IGV2ZW50LmxvY2F0aW9uLmxlbmd0aCgpID09IDA7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlZCAiK2V2ZW50LmxvY2F0aW9uKyIgIitwYXNzZWQpOwotCQkJCS8qIGlnbm9yZSBMb2NhdGlvbkNoYW5nZWQgdGhhdCBhcmUgZW1wdHkgKi8KLQkJCQlsb2NhdGlvbkNoYW5nZWQgPSAhcGFzc2VkOwotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCS8qCi0JCQkJICogRmVhdHVyZSBvbiBJbnRlcm5ldCBFeHBsb3Jlci4gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBsb2NhdGlvbiwgSUUgc3RpbGwgZmlyZXMgYSBEb2N1bWVudENvbXBsZXRlCi0JCQkJICogZm9sbG93aW5nIHRoZSBCZWZvcmVOYXZpZ2F0ZTIgY2FuY2VsIGV2ZW50LiBUaGlzIERvY3VtZW50Q29tcGxldGUgZXZlbnQgY29udGFpbnMgYW4gZW1wdHkgVVJMCi0JCQkJICogc2luY2UgdGhlIFVSTCBpbiBCZWZvcmVOYXZpZ2F0ZTIgd2FzIGNvcnJlY3RseSBjYW5jZWxsZWQuCi0JCQkJICogVGhlIHRlc3QgY29uc2lkZXJzIGl0IGlzIE9LIHRvIHNlbmQgYSBMb2NhdGlvbi5jaGFuZ2VkIGFuZCBhIFByb2dyZXNzLmNvbXBsZXRlZCBldmVudHMgYWZ0ZXIKLQkJCQkgKiBhIExvY2F0aW9uLmNoYW5naW5nIGNhbmNlbCB0cnVlIC0gYXQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIGVtcHR5LAotCQkJCSAqIG90aGVyd2lzZSBpdCBpcyBjb25zaWRlcmVkIHRoYXQgdGhlIGxvY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGNhbmNlbGxlZC4gCi0JCQkJICovCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gYnJvd3Nlci5nZXRVcmwoKTsKLQkJCQlwYXNzZWQgPSBsb2NhdGlvbi5sZW5ndGgoKSA9PSAwOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlZCAiK3Bhc3NlZCk7Ci0JCQkJcHJvZ3Jlc3NDb21wbGV0ZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFRleHQoaHRtbCk7Ci0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7Ci0JCVN0cmluZ1tdIGh0bWwgPSB7ZmlsZTF9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGh0bWwubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEoaHRtbFtpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MihodG1sW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJcmV0dXJuIGZhaWwgPT0gMDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGUxID0gIjxIVE1MPjxIRUFEPiIrCi0JCSI8TUVUQSBIVFRQLUVRVUlWPVwiQ29udGVudC1UeXBlXCIgQ09OVEVOVD1cInRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xXCI+IisKLQkJIjxUSVRMRT5UZXN0IHdpdGggMiBmcmFtZXM8L1RJVExFPiIrCi0JCSI8L0hFQUQ+PEJPRFk+c29tZSBzaW1wbGUgdGVzdCBjYXNlIGhlcmU8L0JPRFk+PC9IVE1MPiI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyMy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTNlZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXIzIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5XaW5kb3csIGxvY2F0aW9uQ2hhbmdpbmcsIGxvY2F0aW9uQ2hhbmdlZCwgdmlzaWJpbGl0eVNob3csIHByb2dyZXNzQ29tcGxldGVkOwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0MShTdHJpbmcgdXJsKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oImphdmFzY3JpcHQgd2luZG93Lm9wZW4gLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBCcm93c2VyMTpPcGVuV2luZG93Lm9wZW4gPiB7IEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5naW5nLCBCcm93c2VyMjpWaXNpYmlsaXR5LnNob3csIEJyb3dzZXIyOkxvY2F0aW9uLmNoYW5nZWQgfSA+IEJyb3dzZXIyOlByb2dyZXNzLmNvbXBsZXRlZCIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJbG9jYXRpb25DaGFuZ2luZyA9IGxvY2F0aW9uQ2hhbmdlZCA9IHByb2dyZXNzQ29tcGxldGVkID0gZmFsc2U7Ci0JCQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjEgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlmaW5hbCBTaGVsbCBzaGVsbDIgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsMi5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlcjIgPSBuZXcgQnJvd3NlcihzaGVsbDIsIFNXVC5OT05FKTsKLQkJYnJvd3NlcjEuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJb3BlbldpbmRvdyA9IHRydWU7Ci0JCQkJQnJvd3NlciBzcmMgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJaWYgKHNyYyAhPSBicm93c2VyMSkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgIiticm93c2VyMSsiLCBnb3QgIitzcmMpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZXZlbnQuYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBleHBlY3RlZCBudWxsLCBnb3QgIitldmVudC5icm93c2VyKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXIyOwotCQkJfQotCQl9KTsKLQkJYnJvd3NlcjIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdyB8fCAhbG9jYXRpb25DaGFuZ2luZykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gTG9jYXRpb25FdmVudC5jaGFuZ2luZyByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWxvY2F0aW9uQ2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFvcGVuV2luZG93KSB7Ci0JCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBMb2NhdGlvbkV2ZW50LmNoYW5naW5nIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZGlkIG5vdCBleHBlY3QgVmlzaWJpbGl0eUV2ZW50LmhpZGUiKTsKLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gVmlzaWJpbGl0eUV2ZW50LnNob3cgcmVjZWl2ZWQgYXQgd3JvbmcgdGltZSIpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJc2hlbGwuY2xvc2UoKTsKLQkJCQkJcmV0dXJuOwkJCQkJCi0JCQkJfQotCQkJCXNoZWxsMi5vcGVuKCk7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQkJCXBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9Ci0JCQkJfS5zdGFydCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3NlcjEuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwkJCi0JCVN0cmluZyB1cmw7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXIzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXIzLmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjMuaHRtbCI7Ci0JCVN0cmluZ1tdIHVybHMgPSB7dXJsfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjI0MzNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNCB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuV2luZG93LCBsb2NhdGlvbkNoYW5naW5nLCBsb2NhdGlvbkNoYW5nZWQsIHZpc2liaWxpdHlTaG93LCBwcm9ncmVzc0NvbXBsZXRlZCwgY2xvc2VXaW5kb3c7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiamF2YXNjcmlwdCB3aW5kb3cub3BlbiAtIGFyZ3M6ICIrdXJsKyIgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IEJyb3dzZXIxOk9wZW5XaW5kb3cub3BlbiA+IHsgQnJvd3NlcjI6TG9jYXRpb24uY2hhbmdpbmcsIEJyb3dzZXIyOlZpc2liaWxpdHkuc2hvdywgQnJvd3NlcjI6TG9jYXRpb24uY2hhbmdlZCB9ID4gQnJvd3NlcjI6UHJvZ3Jlc3MuY29tcGxldGVkID4gQnJvd3NlcjIuQ2xvc2VXaW5kb3cuY2xvc2UiKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWxvY2F0aW9uQ2hhbmdpbmcgPSBsb2NhdGlvbkNoYW5nZWQgPSBwcm9ncmVzc0NvbXBsZXRlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIxID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwyID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbDIuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIyID0gbmV3IEJyb3dzZXIoc2hlbGwyLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIxLmFkZE9wZW5XaW5kb3dMaXN0ZW5lcihuZXcgT3BlbldpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbihXaW5kb3dFdmVudCBldmVudCkgewotCQkJCW9wZW5XaW5kb3cgPSB0cnVlOwotCQkJCUJyb3dzZXIgc3JjID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCWlmIChzcmMgIT0gYnJvd3NlcjEpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkICIrYnJvd3NlcjErIiwgZ290ICIrc3JjKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGV2ZW50LmJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZXhwZWN0ZWQgbnVsbCwgZ290ICIrZXZlbnQuYnJvd3Nlcik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWV2ZW50LmJyb3dzZXIgPSBicm93c2VyMjsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cgfHwgIWxvY2F0aW9uQ2hhbmdpbmcpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIExvY2F0aW9uLmNoYW5naW5nIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbG9jYXRpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoYW5naW5nKExvY2F0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIW9wZW5XaW5kb3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIExvY2F0aW9uLmNoYW5naW5nIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJbG9jYXRpb25DaGFuZ2luZyA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyMi5hZGRWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIobmV3IFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gZGlkIG5vdCBleHBlY3QgVmlzaWJpbGl0eUV2ZW50LmhpZGUiKTsKLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2hvdyhXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICghb3BlbldpbmRvdykgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIC0gVmlzaWJpbGl0eS5zaG93IHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsJCQkJCQotCQkJCX0KLQkJCQlzaGVsbDIub3BlbigpOwotCQkJCXZpc2liaWxpdHlTaG93ID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY29tcGxldGVkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWxvY2F0aW9uQ2hhbmdpbmcgfHwgIWxvY2F0aW9uQ2hhbmdlZCB8fCAhdmlzaWJpbGl0eVNob3cpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIFByb2dyZXNzLmNvbXBsZXRlZCByZWNlaXZlZCBhdCB3cm9uZyB0aW1lIik7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXByb2dyZXNzQ29tcGxldGVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIyLmFkZENsb3NlV2luZG93TGlzdGVuZXIobmV3IENsb3NlV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCWlmICghcHJvZ3Jlc3NDb21wbGV0ZWQpIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIENsb3NlV2luZG93LmNsb3NlIHJlY2VpdmVkIGF0IHdyb25nIHRpbWUiKTsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY2xvc2VXaW5kb3cgPSB0cnVlOwotCQkJCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTaGVsbCBwYXJlbnQgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJcGFyZW50LmNsb3NlKCk7Ci0JCQkJCi0JCQkJbmV3IFRocmVhZCgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgc3RhcnQiKTsKLQkJCQkJCXRyeSB7IHNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCQkJCXBhc3NlZCA9IHRydWU7Ci0JCQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKQotCQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lciBhc3luY2V4ZWMgc2hlbGwuY2xvc2UiKTsKLQkJCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5jbG9zZSgpOwkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigidGltZXIgb3ZlciIpOwotCQkJCQl9Ci0JCQkJfS5zdGFydCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3NlcjEuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwkJCi0JCVN0cmluZyB1cmw7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI0LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXI0Lmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjQuaHRtbCI7Ci0JCVN0cmluZ1tdIHVybHMgPSB7dXJsfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QxKHVybHNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7CQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE5MjJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyNSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0Jc3RhdGljIFBvaW50W11bXSByZWdyZXNzaW9uQm91bmRzID0gewotCQkJCXtuZXcgUG9pbnQoMTAsMjAwKSwgbmV3IFBvaW50KDMwMCwxMDApfSwKLQkJCQl7bmV3IFBvaW50KDEwLDIwMCksIG51bGx9LAotCQkJCXtudWxsLCBuZXcgUG9pbnQoMzAwLDEwMCl9LAotCQkJCXtudWxsLCBudWxsfX07Ci0Jc3RhdGljIGludCBpbmRleCA9IDA7Ci0Jc3RhdGljIGludCBjbnRQYXNzZWQgPSAwOwotCXN0YXRpYyBpbnQgY250Q2xvc2VkID0gMDsKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdDEoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhc2NyaXB0IHdpbmRvdy5vcGVuIHdpdGggbG9jYXRpb24gYW5kIHNpemUgcGFyYW1ldGVycyAtIGFyZ3M6ICIrdXJsKyJcbiAgRXhwZWN0ZWQgRXZlbnQgU2VxdWVuY2U6IFZpc2liaWxpdHkuc2hvdyIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJZmluYWwgQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJYnJvd3Nlci5hZGRPcGVuV2luZG93TGlzdGVuZXIobmV3IE9wZW5XaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJPcGVuV2luZG93ICIraW5kZXgpOwotCQkJCVNoZWxsIG5ld1NoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQkJCW5ld1NoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihuZXdTaGVsbCwgU1dULk5PTkUpOwotCQkJCWJyb3dzZXIuc2V0RGF0YSgiaW5kZXgiLCBuZXcgSW50ZWdlcihpbmRleCkpOwotCQkJCWJyb3dzZXIuYWRkVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKG5ldyBWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhpZGUoV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJfQotCQkJCQlwdWJsaWMgdm9pZCBzaG93KFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJCQlTaGVsbCBwYXJlbnQgPSBicm93c2VyLmdldFNoZWxsKCk7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGV2ZW50LmxvY2F0aW9uOwotCQkJCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LnNpemU7Ci0JCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgcGFyZW50LnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCQkJCWlmIChzaXplICE9IG51bGwpIHBhcmVudC5zZXRTaXplKHNpemUpOwotCQkJCQkJaW50IGluZGV4ID0gKChJbnRlZ2VyKWJyb3dzZXIuZ2V0RGF0YSgiaW5kZXgiKSkuaW50VmFsdWUoKTsKLQkJCQkJCXBhcmVudC5zZXRUZXh0KCJTV1QgQnJvd3NlciBzaGVsbCAiK2luZGV4KTsKLQkJCQkJCXBhcmVudC5vcGVuKCk7Ci0JCQkJCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQkJCQkJLyogQ2VydGFpbiBicm93c2VycyBmaXJlIG11bHRpcGxlIHNob3cgZXZlbnRzIGZvciBubyBnb29kIHJlYXNvbi4gRnVydGhlciBzaG93IGV2ZW50cwotCQkJCQkJCSAqIGFyZSBjb25zaWRlcmVkICdsZWdhbCcgYXMgbG9uZyBhcyB0aGV5IGRvbid0IGNvbnRhaW4gc2l6ZSBhbmQgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0JCQkJCQkJICovCi0JCQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgfHwgc2l6ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgLSBCcm93c2VyICIraW5kZXgrIiBpcyByZWNlaXZpbmcgbXVsdGlwbGUgc2hvdyBldmVudHMiKTsKLQkJCQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVW5uZWNlc3NhcnkgKGJ1dCBoYXJtbGVzcykgdmlzaWJpbGl0eS5zaG93IGV2ZW50IEJyb3dzZXIgIitpbmRleCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJWaXNpYmlsaXR5LnNob3cgYnJvd3NlciAiK2luZGV4KyIgbG9jYXRpb24gIitsb2NhdGlvbisiIHNpemUgIitzaXplKTsKLQkJCQkJCQlicm93c2VyLnNldERhdGEoImluZGV4IiwgbmV3IEludGVnZXIoLTEwMC1pbmRleCkpOwotCi0JCQkJCQkJLyogQ2VydGFpbiBicm93c2VycyBpbmNsdWRlIGRlY29yYXRpb25zIGluIGFkZGl0aW9uIHRvIHRoZSBleHBlY3RlZCBzaXplLgotCQkJCQkJCSAqIEFjY2VwdCBzaXplcyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIHNpemUuCi0JCQkJCQkJICogQ2VydGFpbiBicm93c2VycyBpbnZlbnQgc2l6ZSBvciBsb2NhdGlvbiB3aGVuIHNvbWUgcGFyYW1ldGVycyBhcmUgbWlzc2luZy4KLQkJCQkJCQkgKiBJZiB3ZSBleHBlY3QgbnVsbCBmb3Igb25lIG9mIHNpemUgb3IgbG9jYXRpb24sIGFsc28gYWNjZXB0IG5vbiBudWxsIGFuc3dlcnMuCi0JCQkJCQkJICovCi0JCQkJCQkJUG9pbnQgZXhwZWN0ZWRMb2NhdGlvbiA9IHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzBdOwotCQkJCQkJCVBvaW50IGV4cGVjdGVkU2l6ZSA9IHJlZ3Jlc3Npb25Cb3VuZHNbaW5kZXhdWzFdOwotCQkJCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkIGxvY2F0aW9uICIrZXhwZWN0ZWRMb2NhdGlvbisiIHNpemUgIitleHBlY3RlZFNpemUpOwotCQkJCQkJCWJvb2xlYW4gY2hlY2tMb2NhdGlvbiA9IChsb2NhdGlvbiA9PSBudWxsICYmIGV4cGVjdGVkTG9jYXRpb24gPT0gbnVsbCkgfHwKLQkJCQkJCQkJKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24uZXF1YWxzKGV4cGVjdGVkTG9jYXRpb24pIHx8Ci0JCQkJCQkJCShsb2NhdGlvbiAhPSBudWxsICYmIGV4cGVjdGVkTG9jYXRpb24gPT0gbnVsbCkpOwotCQkJCQkJCWJvb2xlYW4gY2hlY2tTaXplICA9IChzaXplID09IG51bGwgJiYgZXhwZWN0ZWRTaXplID09IG51bGwpIHx8IAotCQkJCQkJCQkoc2l6ZSAhPSBudWxsICYmIHNpemUuZXF1YWxzKGV4cGVjdGVkU2l6ZSkpIHx8Ci0JCQkJCQkJCShzaXplICE9IG51bGwgJiYgZXhwZWN0ZWRTaXplID09IG51bGwpIHx8Ci0JCQkJCQkJCShzaXplICE9IG51bGwgJiYgc2l6ZS54ID49IGV4cGVjdGVkU2l6ZS54ICYmIHNpemUueSA+PSBleHBlY3RlZFNpemUueSk7Ci0JCQkJCQkJaWYgKCFjaGVja1NpemUgfHwgIWNoZWNrTG9jYXRpb24pIHsKLQkJCQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiCUZhaWx1cmUgIik7Ci0JCQkJCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfSBlbHNlIGNudFBhc3NlZCsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJvd3Nlci5hZGRDbG9zZVdpbmRvd0xpc3RlbmVyKG5ldyBDbG9zZVdpbmRvd0xpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBjbG9zZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCQkJY250Q2xvc2VkKys7Ci0JCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJDbG9zZSIpOwotCQkJCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCQkJYnJvd3Nlci5nZXRTaGVsbCgpLmNsb3NlKCk7Ci0JCQkJCQlpZiAoY250UGFzc2VkID09IHJlZ3Jlc3Npb25Cb3VuZHMubGVuZ3RoKSBwYXNzZWQgPSB0cnVlOwotCQkJCQkJaWYgKGNudENsb3NlZCA9PSByZWdyZXNzaW9uQm91bmRzLmxlbmd0aCkgewotCQkJCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZXZlbnQuYnJvd3NlciA9IGJyb3dzZXI7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfSk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gcnVuTG9vcFRpbWVyKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIGludCBzZWNvbmRzKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSB0aW1lb3V0ID0ge2ZhbHNlfTsKLQkJbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7IGkrKykgewotCQkJCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCQkJaWYgKGRpc3BsYXkuaXNEaXNwb3NlZCgpIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkge30gCi0JCQkJdGltZW91dFswXSA9IHRydWU7Ci0JCQkJLyogd2FrZSB1cCB0aGUgZXZlbnQgbG9vcCAqLwotCQkJCWlmICghZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSBzaGVsbC5yZWRyYXcoKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9LnN0YXJ0KCk7Ci0JCXdoaWxlICghdGltZW91dFswXSAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpIGRpc3BsYXkuc2xlZXAoKTsKLQkJcmV0dXJuIHRpbWVvdXRbMF07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KCkgewotCQlpbnQgZmFpbCA9IDA7CQkKLQkJU3RyaW5nIHVybDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjUuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNS5odG1sIjsKLQkJU3RyaW5nW10gdXJscyA9IHt1cmx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDEodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsJCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5UZXN0cyBGaW5pc2hlZC4gU1VDQ0VTUzogIit0ZXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyNi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGQzZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5icm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLQotcHVibGljIGNsYXNzIEJyb3dzZXI2IHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsJCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QxKFN0cmluZyB1cmwpIHsKLQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVVJMIExvYWRpbmcsIHZlcmlmeSBnZXQgdGl0bGUgZXZlbnQgLSBhcmdzOiAiK3VybCsiIEV4cGVjdGVkIEV2ZW50IFNlcXVlbmNlOiBUaXRsZS5jaGFuZ2VkIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkJCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZFRpdGxlTGlzdGVuZXIobmV3IFRpdGxlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFRpdGxlRXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSAoQnJvd3NlcilldmVudC53aWRnZXQ7Ci0JCQkJU3RyaW5nIHVybCA9IGJyb3dzZXIuZ2V0VXJsKCk7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGUgY2hhbmdlZCA8IitldmVudC50aXRsZSsiPiBmb3IgbG9jYXRpb24gPCIrdXJsKyI+Iik7Ci0JCQkJcGFzc2VkID0gdHJ1ZTsKLQkJCQlzaGVsbC5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgNjAwKTsKLQkJaWYgKHRpbWVvdXQpIHBhc3NlZCA9IGZhbHNlOwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QyKFN0cmluZyB1cmwsIGZpbmFsIFN0cmluZyBleHBlY3RlZFRpdGxlKSB7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlVSTCBMb2FkaW5nLCB2ZXJpZnkgZ2V0IHRpdGxlIGV2ZW50IC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogVGl0bGUuY2hhbmdlZCIpOwotCQlwYXNzZWQgPSBmYWxzZTsKLQkJCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkVGl0bGVMaXN0ZW5lcihuZXcgVGl0bGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoVGl0bGVFdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTdHJpbmcgdXJsID0gYnJvd3Nlci5nZXRVcmwoKTsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBjaGFuZ2VkIDwiK2V2ZW50LnRpdGxlKyI+IGZvciBsb2NhdGlvbiA8Iit1cmwrIj4iKTsKLQkJCQlpZiAoZXZlbnQudGl0bGUuZXF1YWxzKGV4cGVjdGVkVGl0bGUpKSB7Ci0JCQkJCXBhc3NlZCA9IHRydWU7Ci0JCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJYnJvd3Nlci5hZGRQcm9ncmVzc0xpc3RlbmVyKG5ldyBQcm9ncmVzc0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hhbmdlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUHJvZ3Jlc3NFdmVudCBldmVudCkgewotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQotCQlib29sZWFuIHRpbWVvdXQgPSBydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDYwMCk7Ci0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBmYWxzZTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIHJ1bkxvb3BUaW1lcihmaW5hbCBEaXNwbGF5IGRpc3BsYXksIGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBpbnQgc2Vjb25kcykgewotCQlmaW5hbCBib29sZWFuW10gdGltZW91dCA9IHtmYWxzZX07Ci0JCW5ldyBUaHJlYWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWNvbmRzOyBpKyspIHsKLQkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQkJCWlmIChkaXNwbGF5LmlzRGlzcG9zZWQoKSB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQkJCXRpbWVvdXRbMF0gPSB0cnVlOwotCQkJCS8qIHdha2UgdXAgdGhlIGV2ZW50IGxvb3AgKi8KLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgc2hlbGwucmVkcmF3KCk7CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfS5zdGFydCgpOwotCQl3aGlsZSAoIXRpbWVvdXRbMF0gJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKSBkaXNwbGF5LnNsZWVwKCk7Ci0JCXJldHVybiB0aW1lb3V0WzBdOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdCgpIHsKLQkJaW50IGZhaWwgPSAwOwotCQkKLQkJU3RyaW5nW10gdXJscyA9IHsiaHR0cDovL3d3dy5nb29nbGUuY29tIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0MSh1cmxzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJCi0JCVN0cmluZyBwbHVnaW5QYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJQTFVHSU5fUEFUSCIpOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JCVN0cmluZyB1cmw7Ci0JCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHVybCA9IEJyb3dzZXI2LmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImJyb3dzZXI2Lmh0bWwiKS50b1N0cmluZygpOwotCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvYnJvd3NlcjYuaHRtbCI7Ci0JCXVybHMgPSBuZXcgU3RyaW5nW10ge3VybH07Ci0JCVN0cmluZ1tdIHRpdGxlcyA9IHsiVGhpcyBpcyBhIHRlc3QgdGl0bGUgdGhhdCBtdXN0IGJlIGNhcmVmdWxseSBjaGVja2VkIHdoZW4gdGhhdCBwYWdlIGlzIGxvYWRlZCJ9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGVzdDIodXJsc1tpXSwgdGl0bGVzW2ldKTsgCi0JCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludChyZXN1bHQgPyAiLiIgOiAiRSIpOwotCQkJaWYgKCFyZXN1bHQpIGZhaWwrKzsgCi0JCX0KLQkJCi0JCQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL0Jyb3dzZXI3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwYzFjMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjcgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwkKLQkKLQlzdGF0aWMgaW50IGNudE9wZW4gPSAwOwotCXN0YXRpYyBpbnQgY250U2hvdyA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoU3RyaW5nIHVybCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJ3aW5kb3cub3BlbiwgdmVyaWZ5IGdldCBXaW5kb3cub3BlbiBhbmQgV2luZG93LnNob3cgZXZlbnRzIC0gYXJnczogIit1cmwrIiBFeHBlY3RlZCBFdmVudCBTZXF1ZW5jZTogV2luZG93Lm9wZW4sIFdpbmRvdy5zaG93IG11bHRpcGxlIHRpbWVzIik7Ci0JCXBhc3NlZCA9IGZhbHNlOwotCQkKLQkJY250T3BlbiA9IDA7Ci0JCWNudFNob3cgPSAwOwotCQkKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJQnJvd3NlciBicm93c2VyID0gbmV3IEJyb3dzZXIoc2hlbGwsIFNXVC5OT05FKTsKLQkJaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQkJCi0JCXNoZWxsLm9wZW4oKTsKLQkJYnJvd3Nlci5zZXRVcmwodXJsKTsKLQkJCi0JCWJvb2xlYW4gdGltZW91dCA9IHJ1bkxvb3BUaW1lcihkaXNwbGF5LCBzaGVsbCwgMTApOwotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJXaW5kb3cgb3BlbmVkOiAiK2NudE9wZW4rIiBXaW5kb3cgc2hvd246ICIrY250U2hvdyk7Ci0JCS8qCi0JCSAqIEJ1ZyBpbiBNb3ppbGxhLiBNdWx0aXBsZSBzaG93IGV2ZW50cyBhcmUgZmlyZWQgYnkgTW96aWxsYS4KLQkJICovCi0JCWlmICh0aW1lb3V0KSBwYXNzZWQgPSBjbnRPcGVuID09IDQgJiYgY250U2hvdyA+PSA0OwotCQlkaXNwbGF5LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIERpc3BsYXkgZGlzcGxheSwgQnJvd3NlciBicm93c2VyKSB7Ci0JCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvcGVuKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyLm9wZW4iKTsKLQkJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCQlzaGVsbC5zZXRUZXh0KCJOZXcgV2luZG93Iik7Ci0JCQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkJCUJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJaW5pdGlhbGl6ZShkaXNwbGF5LCBicm93c2VyKTsKLQkJCQlldmVudC5icm93c2VyID0gYnJvd3NlcjsKLQkJCQljbnRPcGVuKys7Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VyLmFkZFZpc2liaWxpdHlXaW5kb3dMaXN0ZW5lcihuZXcgVmlzaWJpbGl0eVdpbmRvd0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGlkZShXaW5kb3dFdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQlzaGVsbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNob3coV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJWaXNpYmlsaXR5V2luZG93TGlzdGVuZXIuc2hvdyBsb2NhdGlvbj0iK2V2ZW50LmxvY2F0aW9uKyIgc2l6ZT0iK2V2ZW50LnNpemUrIiBhZGRyZXNzQmFyPSIrZXZlbnQuYWRkcmVzc0JhcisiIG1lbnVCYXI9IitldmVudC5tZW51QmFyKyIgc3RhdHVzQmFyPSIrZXZlbnQuc3RhdHVzQmFyKyIgdG9vbEJhcj0iK2V2ZW50LnRvb2xCYXIpOwotCQkJCUJyb3dzZXIgYnJvd3NlciA9IChCcm93c2VyKWV2ZW50LndpZGdldDsKLQkJCQlTaGVsbCBzaGVsbCA9IGJyb3dzZXIuZ2V0U2hlbGwoKTsKLQkJCQlpZiAoZXZlbnQubG9jYXRpb24gIT0gbnVsbCkgc2hlbGwuc2V0TG9jYXRpb24oZXZlbnQubG9jYXRpb24pOwotCQkJCWlmIChldmVudC5zaXplICE9IG51bGwpIHsKLQkJCQkJUG9pbnQgc2l6ZSA9IGV2ZW50LnNpemU7Ci0JCQkJCXNoZWxsLnNldFNpemUoc2hlbGwuY29tcHV0ZVNpemUoc2l6ZS54LCBzaXplLnkpKTsKLQkJCQl9Ci0JCQkJY250U2hvdysrOwotCQkJCXNoZWxsLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWJyb3dzZXIuYWRkQ2xvc2VXaW5kb3dMaXN0ZW5lcihuZXcgQ2xvc2VXaW5kb3dMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKFdpbmRvd0V2ZW50IGV2ZW50KSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gKEJyb3dzZXIpZXZlbnQud2lkZ2V0OwotCQkJCVNoZWxsIHNoZWxsID0gYnJvd3Nlci5nZXRTaGVsbCgpOwotCQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotfQotCSAKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJCQkKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJU3RyaW5nIHVybDsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjcuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjcuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNy5odG1sIjsKLQkJU3RyaW5nW10gdXJscyA9IG5ldyBTdHJpbmdbXSB7dXJsfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QodXJsc1tpXSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjguamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWY5ZjcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyOCB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCQotCXN0YXRpYyBTdHJpbmcgaHRtbFtdID0geyI8aHRtbD48dGl0bGU+U25pcHBldDwvdGl0bGU+PGJvZHk+PHAgaWQ9J215aWQnPkJlc3QgRnJpZW5kczwvcD48cCBpZD0nbXlpZDInPkNhdCBhbmQgRG9nPC9wPjwvYm9keT48L2h0bWw+In07Ci0Jc3RhdGljIFN0cmluZyBzY3JpcHRbXSA9IHsKLQkJInZhciBuZXdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUCcpOyBcclxuIisKLQkJInZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ0F0IGxlYXN0IHdoZW4gSSBhbSBhcm91bmQnKTtcclxuIisKLQkJIm5ld05vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XHJcbiIrCi0JCSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlpZCcpLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4iKwotCQkiXHJcbiIrCi0JCSJkb2N1bWVudC5iZ0NvbG9yPSd5ZWxsb3cnOyJ9OwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KGZpbmFsIGludCBpbmRleCkgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJKYXZhc2NyaXB0IC0gdmVyaWZ5IGV4ZWN1dGUoKSB3b3JrcyBvbiBIVE1MIHJlbmRlcmVkIGZyb20gbWVtb3J5IHdpdGggZ2V0VGV4dCAtIHNjcmlwdCBpbmRleCAiK2luZGV4KTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCQotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBuZXcgRGlzcGxheSgpOwotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlmaW5hbCBCcm93c2VyIGJyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJcGFzc2VkID0gYnJvd3Nlci5leGVjdXRlKHNjcmlwdFtpbmRleF0pOwotCQkJfQotCQl9KTsKLQkJc2hlbGwub3BlbigpOwotCQlicm93c2VyLnNldFRleHQoaHRtbFtpbmRleF0pOwotCQkKLQkJcnVuTG9vcFRpbWVyKGRpc3BsYXksIHNoZWxsLCAxMCk7Ci0KLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCSAKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJCQkKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJU3RyaW5nIHVybDsKLQkJaWYgKHBsdWdpblBhdGggPT0gbnVsbCkgdXJsID0gQnJvd3NlcjguY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgiYnJvd3NlcjcuaHRtbCIpLnRvU3RyaW5nKCk7Ci0JCWVsc2UgdXJsID0gcGx1Z2luUGF0aCArICIvZGF0YS9icm93c2VyNy5odG1sIjsKLQkJU3RyaW5nW10gdXJscyA9IG5ldyBTdHJpbmdbXSB7dXJsfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRlc3QoaSk7IAotCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnQocmVzdWx0ID8gIi4iIDogIkUiKTsKLQkJCWlmICghcmVzdWx0KSBmYWlsKys7IAotCQl9Ci0JCXJldHVybiBmYWlsID09IDA7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcclxuVGVzdHMgRmluaXNoZWQuIFNVQ0NFU1M6ICIrdGVzdCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvQnJvd3NlcjkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmU0YjBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvYnJvd3Nlci9Ccm93c2VyOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyOSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7CQotCQotCXN0YXRpYyBTdHJpbmcgaHRtbFtdID0geyJicm93c2VyOS5odG1sIn07Ci0Jc3RhdGljIFN0cmluZyBzY3JpcHRbXSA9IHsKLQkJImNoYW5nZVN0YXR1cygnbmV3IHRpdGxlJyk7In07Ci0Jc3RhdGljIFN0cmluZyBzdGF0dXNbXSA9IHsibmV3IHRpdGxlIn07Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoU3RyaW5nIHVybCwgZmluYWwgU3RyaW5nIHNjcmlwdCwgZmluYWwgU3RyaW5nIHN0YXR1cykgewotCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJKYXZhc2NyaXB0IC0gdmVyaWZ5IGV4ZWN1dGUoIitzY3JpcHQrIikgd29ya3Mgb24gYSBzdGF0aWMgSFRNTCBmaWxlICIrdXJsKTsKLQkJcGFzc2VkID0gZmFsc2U7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IG5ldyBEaXNwbGF5KCk7Ci0JCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCWZpbmFsIEJyb3dzZXIgYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIuYWRkU3RhdHVzVGV4dExpc3RlbmVyKG5ldyBTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFN0YXR1c1RleHRFdmVudCBldmVudCkgewotCQkJCWJyb3dzZXIuc2V0RGF0YSgicXVlcnkiLCBldmVudC50ZXh0KTsKLQkJfX0pOwotCQlicm93c2VyLmFkZFByb2dyZXNzTGlzdGVuZXIobmV3IFByb2dyZXNzTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VkKFByb2dyZXNzRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRlZChQcm9ncmVzc0V2ZW50IGV2ZW50KSB7Ci0JCQkJYm9vbGVhbiByZXN1bHQgPSBicm93c2VyLmV4ZWN1dGUoc2NyaXB0KTsKLQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCJleGVjdXRlIGZhaWxlZCBmb3IgIitzY3JpcHQpOwotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvKiBTY3JpcHQgbWF5IGFkZGl0aW9uYWxseSBzZXQgdGhlIFN0YXR1cyB2YWx1ZSAqLwotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYnJvd3Nlci5nZXREYXRhKCJxdWVyeSIpOwotCQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIndpbmRvdy5zdGF0dXMgYWZ0ZXIgc2NyaXB0OiAiK3ZhbHVlKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJcGFzc2VkID0gc3RhdHVzLmVxdWFscyh2YWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbHVyZSAtIGV4cGVjdGVkICIrc2NyaXB0KyIsIG5vdCAiK3ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzaGVsbC5vcGVuKCk7Ci0JCWJyb3dzZXIuc2V0VXJsKHVybCk7Ci0JCQotCQlydW5Mb29wVGltZXIoZGlzcGxheSwgc2hlbGwsIDEwKTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCSAKLQlzdGF0aWMgYm9vbGVhbiBydW5Mb29wVGltZXIoZmluYWwgRGlzcGxheSBkaXNwbGF5LCBmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgaW50IHNlY29uZHMpIHsKLQkJZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSB7ZmFsc2V9OwotCQluZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vjb25kczsgaSsrKSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJCQlpZiAoZGlzcGxheS5pc0Rpc3Bvc2VkKCkgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl0aW1lb3V0WzBdID0gdHJ1ZTsKLQkJCQkvKiB3YWtlIHVwIHRoZSBldmVudCBsb29wICovCi0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotCQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHNoZWxsLnJlZHJhdygpOwkJCQkJCQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQkJd2hpbGUgKCF0aW1lb3V0WzBdICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIGlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkgZGlzcGxheS5zbGVlcCgpOwotCQlyZXR1cm4gdGltZW91dFswXTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3QoKSB7Ci0JCWludCBmYWlsID0gMDsKLQkJCQkKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlBMVUdJTl9QQVRIIDwiK3BsdWdpblBhdGgrIj4iKTsKLQkJU3RyaW5nIHVybDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBodG1sLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGx1Z2luUGF0aCA9PSBudWxsKSB1cmwgPSBCcm93c2VyOS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKGh0bWxbaV0pLnRvU3RyaW5nKCk7Ci0JCQllbHNlIHVybCA9IHBsdWdpblBhdGggKyAiL2RhdGEvIitodG1sW2ldOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0ZXN0KHVybCwgc2NyaXB0W2ldLCBzdGF0dXNbaV0pOyAKLQkJCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50KHJlc3VsdCA/ICIuIiA6ICJFIik7Ci0JCQlpZiAoIXJlc3VsdCkgZmFpbCsrOyAKLQkJfQotCQlyZXR1cm4gZmFpbCA9PSAwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmd2KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXHJcblRlc3RzIEZpbmlzaGVkLiBTVUNDRVNTOiAiK3Rlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9icm93c2VyL1Rlc3RfQnJvd3NlclN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvVGVzdF9Ccm93c2VyU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2NjNiMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2Jyb3dzZXIvVGVzdF9Ccm93c2VyU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LmJyb3dzZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEF1dG9tYXRlZCBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXIKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRMaXN0ZW5lcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9Ccm93c2VyU3VpdGUgZXh0ZW5kcyBTd3RUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQotcHVibGljIFRlc3RfQnJvd3NlclN1aXRlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyMSgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyMSAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjEudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjIoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjIgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXIyLnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXIzKCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXIzICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyMy50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyNCgpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyNCAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjQudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjUoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjUgKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI1LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI2KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI2ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyNi50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgdm9pZCBCcm93c2VyNygpIHsKLQlpZiAodmVyYm9zZSkgU3lzdGVtLm91dC5wcmludGxuKCIqKiBCcm93c2VyNyAqKiIpOwotCWJvb2xlYW4gcmVzdWx0ID0gQnJvd3NlcjcudGVzdCgpOwotCWFzc2VydFRydWUocmVzdWx0KTsKLX0KLQotcHVibGljIHZvaWQgQnJvd3NlcjgoKSB7Ci0JaWYgKHZlcmJvc2UpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogQnJvd3NlcjggKioiKTsKLQlib29sZWFuIHJlc3VsdCA9IEJyb3dzZXI4LnRlc3QoKTsKLQlhc3NlcnRUcnVlKHJlc3VsdCk7Ci19Ci0KLXB1YmxpYyB2b2lkIEJyb3dzZXI5KCkgewotCWlmICh2ZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIioqIEJyb3dzZXI5ICoqIik7Ci0JYm9vbGVhbiByZXN1bHQgPSBCcm93c2VyOS50ZXN0KCk7Ci0JYXNzZXJ0VHJ1ZShyZXN1bHQpOwotfQotCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOwotCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsKLQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0X0Jyb3dzZXJTdWl0ZSgoU3RyaW5nKWUubmV4dEVsZW1lbnQoKSkpOwotCX0KLQlyZXR1cm4gc3VpdGU7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcygpIHsKLQlqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyMSIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXIyIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjMiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNCIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI1Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjYiKTsKLQltZXRob2ROYW1lcy5hZGRFbGVtZW50KCJCcm93c2VyNyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoIkJyb3dzZXI4Iik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgiQnJvd3NlcjkiKTsKLQlyZXR1cm4gbWV0aG9kTmFtZXM7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkvKgotCSAqIFRoZSB0ZXN0cyBpbiB0aGlzIHN1aXRlIG1hbmFnZSB0aGVpciBvd24gRGlzcGxheSBhbmQgZXZlbnQgbG9vcAotCSAqIHRvIHZhbGlkYXRlIGFzeW5jaHJvbm91cyB1c2UgY2FzZXMuCi0JICogRGlzcG9zZSBhbnkgcHJldmlvdXNseSBleGlzdGluZyBkaXNwbGF5IGZvciB0aGUgY2FsbGluZyB0aHJlYWQKLQkgKiBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3RzLgotCSAqLwotCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCWlmIChkaXNwbGF5ICE9IG51bGwpIGRpc3BsYXkuZGlzcG9zZSgpOwotCQotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyMSIpKSBCcm93c2VyMSgpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyMiIpKSBCcm93c2VyMigpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyMyIpKSBCcm93c2VyMygpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyNCIpKSBCcm93c2VyNCgpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyNSIpKSBCcm93c2VyNSgpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyNiIpKSBCcm93c2VyNigpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyNyIpKSBCcm93c2VyNygpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyOCIpKSBCcm93c2VyOCgpOwotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJCcm93c2VyOSIpKSBCcm93c2VyOSgpOwotCi0JLyoKLQkgKiBFbnN1cmUgd2UgZG9uJ3QgbGVhdmUgYSBEaXNwbGF5IGZyb20gdGhlIHRlc3RzIHdlIHJ1bi4KLQkgKi8JCi0JZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCWlmIChkaXNwbGF5ICE9IG51bGwpIGRpc3BsYXkuZGlzcG9zZSgpOwotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWQzYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRjOGUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5naWYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1HSUY4N2ESClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDE5ZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0LmpwZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLf/Y/wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg2MGFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvY29ycnVwdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2NiOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9jb3JydXB0QmFkQml0RGVwdGgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9lbXB0eS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2VtcHR5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2VtcHR5LnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5ibXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDM1MWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuZ2lmIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE3Yzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmpwZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MDE3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5wbmcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjJkYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTEyMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg4NmJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmODg4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2ZvbGRlck9wZW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvZm9sZGVyT3Blbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzZkNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9mb2xkZXJPcGVuLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvaW50ZXJsYWNlZF90YXJnZXQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9pbnRlcmxhY2VkX3RhcmdldC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDc0NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9pbnRlcmxhY2VkX3RhcmdldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2p1bml0R2VuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L2p1bml0R2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTA5MWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9qdW5pdEdlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotLyoqCi0gKiBDcmVhdGUgU1dUIEp1bml0IHN0dWJzIGJhc2VkIG9uIGEgc3d0IGphciB1c2VkIGFzIGEgcmVmZXJlbmNlCi0gKiBDb21tYW5kIGxpbmUgdG9vbCAtIHJ1biB3aXRob3V0IHBhcmFtZXRlcnMgdG8gZ2V0IGhlbHAgaW5mb3JtYXRpb24KLSAqLwotcHVibGljIGNsYXNzIGp1bml0R2VuIHsKLQlTdHJpbmcgZGVzdEZvbGRlciA9IG51bGw7Ci0JaW50IGNvdW50ZXIgPSAwOwotCQotCS8qKgotCSAqIEBwYXJhbSBqYXJmaWxlIHRoZSB1cmwgb2YgYSBqYXIgZmlsZQotCSAqIEByZXR1cm4gYWxsIHB1YmxpYyBjbGFzc2VzIGluIHRoZSBqYXIKLQkgKi8KLQlwdWJsaWMgVmVjdG9yIGdldENsYXNzZXMoU3RyaW5nIGphcmZpbGUpIHsKLQkJVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJdHJ5IHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGphcmZpbGUpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoamFyZmlsZSk7Ci0JCQlVUkwgdXJsID0gZmlsZS50b1VSTCgpOwotCQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IHVybCB9KTsKLQotCQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSllbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0JCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOwotCQkJCQluYW1lID0gbmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKLQkJCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBsb2FkZXIpOwotCQkJCQlpZiAoZmlsdGVyQ2xhc3MoY2xhenopKSB2ZWN0b3IuYWRkKGNsYXp6KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiAiICsgZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdmVjdG9yOwotCX0KLQkvKioKLQkgKiBDcmVhdGUgYSBKdW5pdCBqYXZhIHRlc3QgZmlsZQotCSAqIEBwYXJhbSBjbGF6eiBjbGFzcyB0byBjcmVhdGUgdGhlIHRlc3QgZm9yCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRmlsZVRlc3QoQ2xhc3MgY2xhenopIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0Q2xhc3NOYW1lKGNsYXp6KTsKLQkJCW5hbWUgPSBkZXN0Rm9sZGVyICsgIi8iICsgbmFtZSArICIuamF2YSI7Ci0JCQlGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG5hbWUpOwotCQkJY3JlYXRlU3d0VGVzdCh3cml0ZXIsIGNsYXp6KTsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gIiArIGUpOwotCQl9Ci0JCQotCX0KLQotCXZvaWQgY3JlYXRlU3d0VGVzdChGaWxlV3JpdGVyIHdyaXRlciwgQ2xhc3MgY2xhenopIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN3dFRlc3QgdGVzdCA9IG5ldyBTd3RUZXN0KHdyaXRlciwgY2xhenopOwotCQl0ZXN0LndyaXRlQ29weVJpZ2h0cygpOwotCQl0ZXN0LndyaXRlUGFja2FnZSgpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZUltcG9ydHMoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVDbGFzc0NvbW1lbnRzKCk7Ci0JCXRlc3Qud3JpdGVDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlQ29uc3RydWN0b3IoKTsJCQotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZU1haW4oKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVTZXRVcCgpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZVRlYXJEb3duKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlTWV0aG9kcygpOwotCQl0ZXN0Lm5ld0xpbmUoKTsKLQkJdGVzdC53cml0ZVN1aXRlKCk7Ci0JCXRlc3QubmV3TGluZSgpOwotCQl0ZXN0LndyaXRlTWV0aG9kTmFtZXMoKTsKLQkJdGVzdC5uZXdMaW5lKCk7Ci0JCXRlc3Qud3JpdGVSdW5UZXN0KCk7Ci0JCXRlc3Qud3JpdGVDbGFzc0Nsb3N1cmUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25Gb2xkZXIoU3RyaW5nIGRlc3QpIHsKLQkJZGVzdEZvbGRlciA9IGRlc3Q7CQotCX0KLQotCXB1YmxpYyB2b2lkIGluY3JlbWVudENvdW50ZXIoKSB7Ci0JCWNvdW50ZXIrKzsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRDb3VudGVyKCkgewotCQlyZXR1cm4gY291bnRlcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRlc3RzKFN0cmluZyBqYXJmaWxlLCBTdHJpbmcgZGVzdEZvbGRlcikgewotCQlqdW5pdEdlbiBnZW4gPSBuZXcganVuaXRHZW4oKTsKLQkJVmVjdG9yIGNsYXNzZXMgPSBnZW4uZ2V0Q2xhc3NlcyhqYXJmaWxlKTsKLQkJZ2VuLnNldERlc3RpbmF0aW9uRm9sZGVyKGRlc3RGb2xkZXIpOwotCQlpZiAoY2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNsYXNzZXMgZm91bmQuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGNsYXNzZXMuZWxlbWVudHMoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWdlbi5jcmVhdGVGaWxlVGVzdCgoQ2xhc3MpZW50cmllcy5uZXh0RWxlbWVudCgpKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Qgc3R1YnMgd3JpdHRlbjogIiArIGdlbi5nZXRDb3VudGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpZmYoVmVjdG9yIG9sZENsYXNzZXMsIFZlY3RvciBuZXdDbGFzc2VzKSB7Ci0JCVN3dERpZmYgZGlmZiA9IG5ldyBTd3REaWZmKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpOwotCQlkaWZmLmNvbXB1dGUoKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlmZlRlc3RzKFN0cmluZyBqYXJmaWxlT2xkLCBTdHJpbmcgamFyZmlsZU5ldykgewotCQlqdW5pdEdlbiBnZW4gPSBuZXcganVuaXRHZW4oKTsKLQkJVmVjdG9yIG9sZENsYXNzZXMgPSBnZW4uZ2V0Q2xhc3NlcyhqYXJmaWxlT2xkKTsKLQkJaWYgKG9sZENsYXNzZXMgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJObyBjbGFzc2VzIGZvdW5kIGluIG9sZCBqYXIiKTsKLQkJCXJldHVybjsKLQkJfQotCQlWZWN0b3IgbmV3Q2xhc3NlcyA9IGdlbi5nZXRDbGFzc2VzKGphcmZpbGVOZXcpOwotCQlpZiAobmV3Q2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNsYXNzZXMgZm91bmQgaW4gbmV3IGphciIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWdlbi5kaWZmKG9sZENsYXNzZXMsIG5ld0NsYXNzZXMpOwkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPCAzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIGp1bml0R2VuIGZsYWcgYXJnMSBhcmcyIC4uLiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgd2hlcmUgZmxhZyBpcyBvbmUgb2Y6Iik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZTogY3JlYXRlIHRoZSBqdW5pdCB0ZXN0IHN0dWJzIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICBhcmcxOiBzb3VyY2UgamFyIGUuZy4gZDovc3d0LmphciIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgYXJnMjogZGVzdGluYXRpb24gZS5nLiBkOi90ZXN0cyIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJkaWZmOiAgIGRpZmYgMiBqYXJzIHNob3dpbmcgd2hpY2ggdGVzdHMgbXVzdCBiZSByZW1vdmVkLCIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgIGFuZCBhZGRlZCIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgYXJnMTogb2xkIGphciBlLmcuIGQ6L29sZC9zd3QuamFyIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICBhcmcyOiBuZXcgamFyIGUuZy4gZDovbmV3L3N3dC5qYXIiKTsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGFyZ3NbMF0uZXF1YWxzKCJjcmVhdGUiKSkgY3JlYXRlVGVzdHMoYXJnc1sxXSwgYXJnc1syXSk7Ci0JCWVsc2UgaWYgKGFyZ3NbMF0uZXF1YWxzKCJkaWZmIikpIGRpZmZUZXN0cyhhcmdzWzFdLCBhcmdzWzJdKTsKLQl9Ci0JCi0JYm9vbGVhbiBmaWx0ZXJDbGFzcyhDbGFzcyBjbGF6eikgewotCQkvKiBKVW5pdCB0ZXN0cyBmb3IgcHVibGljIGNsYXNzZXMgb25seSAqLwotCQlpbnQgbW9kaWZpZXJzID0gY2xhenouZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmICghTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgcmV0dXJuIGZhbHNlOwotCi0JCS8qIEpVbml0IHRlc3RzIGZvciBjbGFzc2VzIHdoaWNoIGFyZSBub3QgcGFydCBvZiBhbiBpbnRlcm5hbCBwYWNrYWdlICovCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCWlmIChwYWNrYWdlTmFtZS5pbmRleE9mKCJpbnRlcm5hbCIpICE9IC0xKSByZXR1cm4gZmFsc2U7Ci0KLQkJLyogSlVuaXQgdGVzdHMgZm9yIGNsYXNzZXMgd2l0aCBwdWJsaWMgY29uc3RydWN0b3JzIG9yIHB1YmxpYyBtZXRob2RzICovCi0JCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoY2xhenopOwotCQlNZXRob2RbXSBtZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKGNsYXp6KTsKLQkJaWYgKGNvbnN0cnVjdG9ycy5sZW5ndGggPT0gMCAmJiBtZXRob2RzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCVN0cmluZyBnZXRDbGFzc05hbWUoQ2xhc3MgY2xhenopIHsKLQkJU3RyaW5nIG5hbWUgPSBjbGF6ei5nZXROYW1lKCk7Ci0JCW5hbWUgPSAiVGVzdF8iICsgbmFtZS5yZXBsYWNlKCcuJywgJ18nKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JU3RyaW5nIGdldE1ldGhvZE5hbWUoQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHsKLQkJU3RyaW5nIG5hbWUgPSAidGVzdF9Db25zdHJ1Y3RvciI7Ci0JCUNsYXNzW10gcGFyYW1ldGVycyA9IGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJbmFtZSArPSBnZXRUeXBlU2lnbmF0dXJlKHBhcmFtZXRlcnNbaV0pOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCVN0cmluZyBnZXRNZXRob2ROYW1lKE1ldGhvZCBtZXRob2QpIHsKLQkJU3RyaW5nIG5hbWUgPSAidGVzdF8iICsgbWV0aG9kLmdldE5hbWUoKTsKLQkJQ2xhc3NbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJbmFtZSArPSBnZXRUeXBlU2lnbmF0dXJlKHBhcmFtZXRlcnNbaV0pOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkJCi0JU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoQ2xhc3MgY2xhenopIHsKLQkJaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkgcmV0dXJuICJJIjsKLQkJaWYgKGNsYXp6ID09IEJvb2xlYW4uVFlQRSkgcmV0dXJuICJaIjsKLQkJaWYgKGNsYXp6ID09IExvbmcuVFlQRSkgcmV0dXJuICJKIjsKLQkJaWYgKGNsYXp6ID09IFNob3J0LlRZUEUpIHJldHVybiAiUyI7Ci0JCWlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkgcmV0dXJuICJDIjsKLQkJaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkgcmV0dXJuICJCIjsKLQkJaWYgKGNsYXp6ID09IEZsb2F0LlRZUEUpIHJldHVybiAiRiI7Ci0JCWlmIChjbGF6eiA9PSBEb3VibGUuVFlQRSkgcmV0dXJuICJEIjsKLQkJaWYgKGNsYXp6LmlzQXJyYXkoKSkgewotCQkJQ2xhc3MgY29tcG9uZW50VHlwZSA9IGNsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKLQkJCXJldHVybiAiJCIgKyBnZXRUeXBlU2lnbmF0dXJlKGNvbXBvbmVudFR5cGUpOwotCQl9Ci0JCXJldHVybiAiTCIgKyBjbGF6ei5nZXROYW1lKCkucmVwbGFjZSgnLicsICdfJyk7Ci0JfQotCi0JQ29uc3RydWN0b3JbXSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhDbGFzcyBjbGF6eikgewotCQlDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IGNsYXp6LmdldENvbnN0cnVjdG9ycygpOwotCQlBcnJheXMuc29ydChjb25zdHJ1Y3RvcnMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiAoZ2V0TWV0aG9kTmFtZSgoQ29uc3RydWN0b3IpYSkuY29tcGFyZVRvKGdldE1ldGhvZE5hbWUoKENvbnN0cnVjdG9yKWIpKSk7CQkJCQkKLQkJCX0KLQkJfSk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yc1tpXTsKLQkJCWludCBtb2RpZmllcnMgPSBjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKTsKLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKSB7Ci0JCQkJY29uc3RydWN0b3JzW2NvdW50KytdID0gY29uc3RydWN0b3JzW2ldOwotCQkJfQotCQl9Ci0JCUNvbnN0cnVjdG9yW10gcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShjb25zdHJ1Y3RvcnMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi0JTWV0aG9kW10gZ2V0RmlsdGVyZWRNZXRob2RzKENsYXNzIGNsYXp6KSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJQXJyYXlzLnNvcnQobWV0aG9kcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIChnZXRNZXRob2ROYW1lKChNZXRob2QpYSkuY29tcGFyZVRvKGdldE1ldGhvZE5hbWUoKE1ldGhvZCliKSkpOwkJCQkJCi0JCQl9Ci0JCX0pOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotCQkJaW50IG1vZGlmaWVycyA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKSB7Ci0JCQkJbWV0aG9kc1tjb3VudCsrXSA9IG1ldGhvZHNbaV07Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kW10gcmVzdWx0ID0gbmV3IE1ldGhvZFtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkobWV0aG9kcywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7CQkKLQl9Ci0KLQotCXB1YmxpYyBjbGFzcyBTd3RUZXN0IHsKLQkJRmlsZVdyaXRlciB3cml0ZXI7Ci0JCUNsYXNzIGNsYXp6OwotCQlTdHJpbmcgbGluZVNlcCA9ICJcclxuIjsKLQkJCi0JCVN3dFRlc3QoRmlsZVdyaXRlciB3cml0ZXIsIENsYXNzIGNsYXp6KSB7Ci0JCQl0aGlzLndyaXRlciA9IHdyaXRlcjsKLQkJCXRoaXMuY2xhenogPSBjbGF6ejsKLQkJfQotCQkKLQkJdm9pZCBuZXdMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZVBhY2thZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKCJwYWNrYWdlIG9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdDsiKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNvcHlSaWdodHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iICsgbGluZVNlcCArCi0gCQkJCSIgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIiArIGxpbmVTZXAgKwotIAkJCQkiICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIiArIGxpbmVTZXAgKwotIAkJCQkiICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQiICsgbGluZVNlcCArCi0gCQkJCSIgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCIgKyBsaW5lU2VwICsKLSAJCQkJIiAqICIgKyBsaW5lU2VwICsKLSAJCQkJIiAqIENvbnRyaWJ1dG9yczoiICsgbGluZVNlcCArCi0gCQkJCSIgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiArIGxpbmVTZXAgKwotCQkJCSIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUltcG9ydHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7IiArIGxpbmVTZXAgKwotCQkJCSJpbXBvcnQganVuaXQudGV4dHVpLio7Iik7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDbGFzc0NvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkiLyoqIiArIGxpbmVTZXAgKwotCQkJCSIgKiBBdXRvbWF0ZWQgVGVzdCBTdWl0ZSBmb3IgY2xhc3MgIiArIGNsYXp6LmdldE5hbWUoKSArIGxpbmVTZXAgKwotCQkJCSIgKiIgKyBsaW5lU2VwICsKLQkJCQkiICogQHNlZSAiICsgY2xhenouZ2V0TmFtZSgpICsgbGluZVNlcCArCi0JCQkJIiAqLyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQotCQlib29sZWFuIGhhc1N3dEp1bml0U3VwZXJDbGFzcyhDbGFzcyBjbGF6eikgewotCQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlckNsYXNzID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHN1cGVyQ2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJCWlmICghcGFja2FnZU5hbWUuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2Uuc3d0IikpIHJldHVybiBmYWxzZTsKLQkJCWlmICghZmlsdGVyQ2xhc3Moc3VwZXJDbGFzcykpIHJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0cnVlOwkJCQkJCQotCQl9Ci0JCQotCQlTdHJpbmcgZ2V0U3d0SnVuaXRTdXBlckNsYXNzTmFtZShDbGFzcyBjbGF6eikgewotCQkJU3RyaW5nIGRlZmF1bHRDbGFzcyA9ICJTd3RUZXN0Q2FzZSI7Ci0JCQlDbGFzcyBzdXBlckNsYXNzID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRDbGFzczsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHN1cGVyQ2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQkJCWlmICghcGFja2FnZU5hbWUuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2Uuc3d0IikpIHJldHVybiBkZWZhdWx0Q2xhc3M7Ci0JCQlpZiAoIWZpbHRlckNsYXNzKHN1cGVyQ2xhc3MpKSByZXR1cm4gZGVmYXVsdENsYXNzOwotCQkJcmV0dXJuIGdldENsYXNzTmFtZShzdXBlckNsYXNzKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZUNsYXNzRGVjbGFyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoY2xhenopOwotCQkJU3RyaW5nIHN1cGVyQ2xhc3NOYW1lID0gZ2V0U3d0SnVuaXRTdXBlckNsYXNzTmFtZShjbGF6eik7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyBjbGFzcyAiICsgbmFtZSArICIgZXh0ZW5kcyAiICsgc3VwZXJDbGFzc05hbWUgKyIgeyIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVDb25zdHJ1Y3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyAiICsgbmFtZSArICIoU3RyaW5nIG5hbWUpIHsiICsgbGluZVNlcCArCi0JCQkJIglzdXBlcihuYW1lKTsiICsgbGluZVNlcCArCi0JCQkJIn0iCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9CQkKLQkJCi0JCXZvaWQgd3JpdGVNYWluKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeyIgKyBsaW5lU2VwICsKLQkJCQkiCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQotCQl2b2lkIHdyaXRlU2V0VXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsiCi0JCQkpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJaWYgKGhhc1N3dEp1bml0U3VwZXJDbGFzcyhjbGF6eikpIHsKLQkJCQl3cml0ZXIud3JpdGUoIglzdXBlci5zZXRVcCgpOyIpOwotCQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgifSIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0KLQkJdm9pZCB3cml0ZVRlYXJEb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgKLQkJCQkicHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWlmIChoYXNTd3RKdW5pdFN1cGVyQ2xhc3MoY2xhenopKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCIJc3VwZXIudGVhckRvd24oKTsiKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQl3cml0ZXIud3JpdGUoIn0iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZU1ldGhvZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBnZXRGaWx0ZXJlZENvbnN0cnVjdG9ycyhjbGF6eik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCXdyaXRlTWV0aG9kKGNvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJaWYgKGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoIC0gMSkgd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJCi0JCQlNZXRob2RbXSBtZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKGNsYXp6KTsKLQkJCWlmIChjb25zdHJ1Y3RvcnMubGVuZ3RoID4gMCAmJiBtZXRob2RzLmxlbmd0aCA+IDApIHdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCXdyaXRlTWV0aG9kKG1ldGhvZHNbaV0pOwotCQkJCWlmIChpIDwgbWV0aG9kcy5sZW5ndGggLSAxKSB3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVNZXRob2QoQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldE1ldGhvZE5hbWUoY29uc3RydWN0b3IpOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgdm9pZCAiICsgbmFtZSArICIoKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJd2FyblVuaW1wbChcIlRlc3QgIiArIG5hbWUgKyAiIG5vdCB3cml0dGVuXCIpOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlpbmNyZW1lbnRDb3VudGVyKCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVNZXRob2QoTWV0aG9kIG1ldGhvZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TWV0aG9kTmFtZShtZXRob2QpOwotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgdm9pZCAiICsgbmFtZSArICIoKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJd2FyblVuaW1wbChcIlRlc3QgIiArIG5hbWUgKyAiIG5vdCB3cml0dGVuXCIpOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQlpbmNyZW1lbnRDb3VudGVyKCk7Ci0JCX0KLQkJCi0JCXZvaWQgd3JpdGVTdWl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENsYXNzTmFtZShjbGF6eik7Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJInB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsiICsgbGluZVNlcCArCi0JCQkJIglUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7IiArIGxpbmVTZXAgKwkKLQkJCQkiCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBtZXRob2ROYW1lcygpOyIgKyBsaW5lU2VwICsKLQkJCQkiCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gbWV0aG9kTmFtZXMuZWxlbWVudHMoKTsiICsgbGluZVNlcCArCi0JCQkJIgl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeyIgKyBsaW5lU2VwICsKLQkJCQkiCQlzdWl0ZS5hZGRUZXN0KG5ldyAiICsgbmFtZSArICIoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsiICsgbGluZVNlcCArCi0JCQkJIgl9IiArIGxpbmVTZXAgKwotCQkJCSIJcmV0dXJuIHN1aXRlOyIgKyBsaW5lU2VwICsKLQkJCQkifSIKLQkJCSk7Ci0JCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCX0KLQotCQl2b2lkIHdyaXRlTWV0aG9kTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwdWJsaWMgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMoKSB7IiArIGxpbmVTZXAgKwotCQkJCSIJamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoY2xhenopOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldE1ldGhvZE5hbWUoY29uc3RydWN0b3JzW2ldKTsKLQkJCQl3cml0ZXIud3JpdGUoCi0JCQkJCSIJbWV0aG9kTmFtZXMuYWRkRWxlbWVudChcIiIgKyBuYW1lICsgIlwiKTsiCi0JCQkJKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQlNZXRob2RbXSBtZXRob2RzID0gZ2V0RmlsdGVyZWRNZXRob2RzKGNsYXp6KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZ2V0TWV0aG9kTmFtZShtZXRob2RzW2ldKTsKLQkJCQl3cml0ZXIud3JpdGUoCi0JCQkJCSIJbWV0aG9kTmFtZXMuYWRkRWxlbWVudChcIiIgKyBuYW1lICsgIlwiKTsiCi0JCQkJKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQlpZiAoaGFzU3d0SnVuaXRTdXBlckNsYXNzKGNsYXp6KSkgewotCQkJCVN0cmluZyBzdXBlckNsYXNzTmFtZSA9IGdldFN3dEp1bml0U3VwZXJDbGFzc05hbWUoY2xhenopOwotCQkJCXdyaXRlci53cml0ZSgiCW1ldGhvZE5hbWVzLmFkZEFsbCgiICsgc3VwZXJDbGFzc05hbWUgKyAiLm1ldGhvZE5hbWVzKCkpOyAvLyBhZGQgc3VwZXJjbGFzcyBtZXRob2QgbmFtZXMiKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9Ci0JCQl3cml0ZXIud3JpdGUoCi0JCQkJIglyZXR1cm4gbWV0aG9kTmFtZXM7IiArIGxpbmVTZXAgKwotCQkJCSJ9IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJfQotCQkKLQkJdm9pZCB3cml0ZVJ1blRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJd3JpdGVyLndyaXRlKAotCQkJCSJwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7IgotCQkJKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsKLQkJCUNvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMoY2xhenopOwotCQkJTWV0aG9kW10gbWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhjbGF6eik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGggKyBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPT0gMCkgd3JpdGVyLndyaXRlKCIJaWYiKTsgZWxzZSB3cml0ZXIud3JpdGUoIgllbHNlIGlmIik7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpIDwgY29uc3RydWN0b3JzLmxlbmd0aCA/IGdldE1ldGhvZE5hbWUoY29uc3RydWN0b3JzW2ldKSA6IGdldE1ldGhvZE5hbWUobWV0aG9kc1tpIC0gY29uc3RydWN0b3JzLmxlbmd0aF0pOwotCQkJCXdyaXRlci53cml0ZSgKLQkJCQkJIiAoZ2V0TmFtZSgpLmVxdWFscyhcIiIgKyBuYW1lICsgIlwiKSkgIiArIG5hbWUgKyAiKCk7IgotCQkJCSk7Ci0JCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQkJfQotCQkJaWYgKGhhc1N3dEp1bml0U3VwZXJDbGFzcyhjbGF6eikpIHsKLQkJCQlpZiAoY29uc3RydWN0b3JzLmxlbmd0aCArIG1ldGhvZHMubGVuZ3RoID4gMCkgewotCQkJCQl3cml0ZXIud3JpdGUoIgllbHNlICIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiCSIpOwotCQkJCX0KLQkJCQl3cml0ZXIud3JpdGUoInN1cGVyLnJ1blRlc3QoKTsiKTsKLQkJCQl3cml0ZXIud3JpdGUobGluZVNlcCk7Ci0JCQl9CQkJCi0JCQl3cml0ZXIud3JpdGUoIn0iKTsKLQkJCXdyaXRlci53cml0ZShsaW5lU2VwKTsJCQotCQl9Ci0JCQotCQl2b2lkIHdyaXRlQ2xhc3NDbG9zdXJlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXdyaXRlci53cml0ZSgifSIpOwotCQkJd3JpdGVyLndyaXRlKGxpbmVTZXApOwotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBEaWZmQ2xhc3MgewotCQkvKiB0aGUgbmV3Q2xhc3MgaGFzIGJlZW4gYWRkZWQgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVXID0gMTsKLQkJLyogdGhlIG9sZENsYXNzIGhhcyBiZWVuIHJlbW92ZWQgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRCA9IDI7Ci0JCS8qIHRoZSByZW1vdmVkTWV0aG9kcyBmcm9tIG9sZENsYXNzIGhhdmUgYmVlbiByZW1vdmVkIChpZiBhbnkpCi0JCSAqIHRoZSBuZXdNZXRob2RzIGZyb20gbmV3Q2xhc3MgaGF2ZSBiZWVuIGFkZGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RJRklFRCA9IDM7Ci0JCQotCQlpbnQgdHlwZTsKLQkJQ2xhc3Mgb2xkQ2xhc3M7Ci0JCUNsYXNzIG5ld0NsYXNzOwotCQlNZXRob2RbXSByZW1vdmVkTWV0aG9kczsKLQkJTWV0aG9kW10gbmV3TWV0aG9kczsKLQkJQ29uc3RydWN0b3JbXSByZW1vdmVkQ29uc3RydWN0b3JzOwotCQlDb25zdHJ1Y3RvcltdIG5ld0NvbnN0cnVjdG9yczsKLQotCQlwdWJsaWMgRGlmZkNsYXNzKGludCB0eXBlLCAKLQkJCUNsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcywgCi0JCQlNZXRob2RbXSByZW1vdmVkTWV0aG9kcywgTWV0aG9kW10gbmV3TWV0aG9kcywKLQkJCUNvbnN0cnVjdG9yW10gcmVtb3ZlZENvbnN0cnVjdG9ycywgQ29uc3RydWN0b3JbXSBuZXdDb25zdHJ1Y3RvcnMpIHsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLm9sZENsYXNzID0gb2xkQ2xhc3M7Ci0JCQl0aGlzLm5ld0NsYXNzID0gbmV3Q2xhc3M7Ci0JCQl0aGlzLnJlbW92ZWRNZXRob2RzID0gcmVtb3ZlZE1ldGhvZHM7Ci0JCQl0aGlzLm5ld01ldGhvZHMgPSBuZXdNZXRob2RzOwotCQkJdGhpcy5yZW1vdmVkQ29uc3RydWN0b3JzID0gcmVtb3ZlZENvbnN0cnVjdG9yczsKLQkJCXRoaXMubmV3Q29uc3RydWN0b3JzID0gbmV3Q29uc3RydWN0b3JzOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBORVc6IHsKLQkJCQkJcmV0dXJuICJORVc6ICIgKyBnZXRDbGFzc05hbWUobmV3Q2xhc3MpOwotCQkJCX0KLQkJCQljYXNlIFJFTU9WRUQ6IHsKLQkJCQkJcmV0dXJuICJSRU1PVkVEOiAiICsgZ2V0Q2xhc3NOYW1lKG9sZENsYXNzKTsKLQkJCQl9Ci0JCQkJY2FzZSBNT0RJRklFRDogewotCQkJCQlTdHJpbmcgc3RyaW5nID0gIk1PRElGSUVEOiAiICsgZ2V0Q2xhc3NOYW1lKG9sZENsYXNzKTsKLQkJCQkJaWYgKHJlbW92ZWRDb25zdHJ1Y3RvcnMgIT0gbnVsbCkgewotCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgcmVtb3ZlZENvbnN0cnVjdG9ycy5sZW5ndGggKyAiIGNvbnN0cnVjdG9yKHMpIHJlbW92ZWQiOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVkQ29uc3RydWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgZ2V0TWV0aG9kTmFtZShyZW1vdmVkQ29uc3RydWN0b3JzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChuZXdDb25zdHJ1Y3RvcnMgIT0gbnVsbCkgewotCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgbmV3Q29uc3RydWN0b3JzLmxlbmd0aCArICIgY29uc3RydWN0b3IocykgYWRkZWQiOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdDb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBnZXRNZXRob2ROYW1lKG5ld0NvbnN0cnVjdG9yc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJlbW92ZWRNZXRob2RzICE9IG51bGwpIHsKLQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIHJlbW92ZWRNZXRob2RzLmxlbmd0aCArICIgbWV0aG9kKHMpIHJlbW92ZWQiOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXN0cmluZyArPSAiXHJcblx0IiArIGdldE1ldGhvZE5hbWUocmVtb3ZlZE1ldGhvZHNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKG5ld01ldGhvZHMgIT0gbnVsbCkgewotCQkJCQkJc3RyaW5nICs9ICJcclxuXHQiICsgbmV3TWV0aG9kcy5sZW5ndGggKyAiIG1ldGhvZChzKSBhZGRlZCI7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld01ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlzdHJpbmcgKz0gIlxyXG5cdCIgKyBnZXRNZXRob2ROYW1lKG5ld01ldGhvZHNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzdHJpbmc7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6IHsKLQkJCQkJcmV0dXJuICJpbnZhbGlkIERpZmZDbGFzcyAiK3R5cGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBTd3REaWZmIHsKLQkJQ2xhc3NbXSBvbGRDbGFzc2VzLCBuZXdDbGFzc2VzOwotCQkvKiByZW1vdmVkW2ldIHRydWUgbWVhbnMgb2xkQ2xhc3Nlc1tpXSBoYXMgYmVlbiByZW1vdmVkICovCi0JCWJvb2xlYW5bXSByZW1vdmVkOwotCQkvKiBhZGRlZFtpXSB0cnVlIG1lYW5zIG5ld0NsYXNzZXNbaV0gaGFzIGJlZW4gYWRkZWQgKi8KLQkJYm9vbGVhbltdIGFkZGVkOwotCQkvKiBvbGQyTmV3W2ldID09IGogPj0gMCBtZWFucyBvbGRDbGFzc2VzW2ldIGNvcnJlc3BvbmRzIHRvIG5ld0NsYXNzZXNbal0gKi8KLQkJaW50W10gb2xkMk5ldzsKLQkJaW50W10gbmV3Mk9sZDsKLQkJVmVjdG9yIGRpZmZzID0gbmV3IFZlY3RvcigpOwotCQkKLQkJcHVibGljIFN3dERpZmYoVmVjdG9yIG9sZENsYXNzZXMsIFZlY3RvciBuZXdDbGFzc2VzKSB7Ci0JCQlFbnVtZXJhdGlvbiBvbGRDbGFzc2VzRW51bSA9IG9sZENsYXNzZXMuZWxlbWVudHMoKTsKLQkJCXRoaXMub2xkQ2xhc3NlcyA9IG5ldyBDbGFzc1tvbGRDbGFzc2VzLnNpemUoKV07Ci0JCQlpbnQgY250ID0gMDsKLQkJCXdoaWxlIChvbGRDbGFzc2VzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCXRoaXMub2xkQ2xhc3Nlc1tjbnQrK10gPSAoQ2xhc3Mpb2xkQ2xhc3Nlc0VudW0ubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQotCQkJRW51bWVyYXRpb24gbmV3Q2xhc3Nlc0VudW0gPSBuZXdDbGFzc2VzLmVsZW1lbnRzKCk7Ci0JCQl0aGlzLm5ld0NsYXNzZXMgPSBuZXcgQ2xhc3NbbmV3Q2xhc3Nlcy5zaXplKCldOwotCQkJY250ID0gMDsKLQkJCXdoaWxlIChuZXdDbGFzc2VzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCXRoaXMubmV3Q2xhc3Nlc1tjbnQrK10gPSAoQ2xhc3MpbmV3Q2xhc3Nlc0VudW0ubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQkJCW9sZDJOZXcgPSBuZXcgaW50W3RoaXMub2xkQ2xhc3Nlcy5sZW5ndGhdOwotCQkJbmV3Mk9sZCA9IG5ldyBpbnRbdGhpcy5uZXdDbGFzc2VzLmxlbmd0aF07Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNvbXB1dGUoKSB7Ci0JCQljb21wYXJlQ2xhc3NlcygpOwotCQkJY3JlYXRlQ2xhc3NEaWZmKCk7Ci0JCQlvdXRwdXRDbGFzc0RpZmYoKTsJCQotCQl9Ci0KLQkJdm9pZCBjb21wYXJlQ2xhc3NlcygpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJCW9sZDJOZXdbaV0gPSAtMTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5ld0NsYXNzZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG9sZENsYXNzZXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhuZXdDbGFzc2VzW2pdLmdldE5hbWUoKSkpIHsKLQkJCQkJCW9sZDJOZXdbaV0gPSBqOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXcyT2xkW2ldID0gLTE7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRDbGFzc2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChuZXdDbGFzc2VzW2ldLmdldE5hbWUoKS5lcXVhbHMob2xkQ2xhc3Nlc1tqXS5nZXROYW1lKCkpKSB7Ci0JCQkJCQluZXcyT2xkW2ldID0gajsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJdm9pZCBjcmVhdGVDbGFzc0RpZmYoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZDJOZXcubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2xkMk5ld1tpXSA8IDApIHsKLQkJCQkJLyogRm91bmQgYSBjbGFzcyB3aGljaCBoYXMgYmVlbiByZW1vdmVkICovCi0JCQkJCURpZmZDbGFzcyBkaWZmID0gbmV3IERpZmZDbGFzcygKLQkJCQkJCURpZmZDbGFzcy5SRU1PVkVELAotCQkJCQkJb2xkQ2xhc3Nlc1tpXSwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsKTsKLQkJCQkJZGlmZnMuYWRkKGRpZmYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEZvdW5kIGEgY2xhc3Mgd2hpY2ggaXMgZWl0aGVyIGlkZW50aWNhbCBvciB3aGljaCBjb250YWlucwotCQkJCQkgKiBtb2RpZmllZCBtZXRob2RzCi0JCQkJCSAqLwotCQkJCQlDbGFzcyBvbGRDbGFzcyA9IG9sZENsYXNzZXNbaV07Ci0JCQkJCUNsYXNzIG5ld0NsYXNzID0gbmV3Q2xhc3Nlc1tvbGQyTmV3W2ldXTsKLQkJCQkJTWV0aG9kW10gcmVtb3ZlZE1ldGhvZHMgPSBnZXRSZW1vdmVkTWV0aG9kcyhvbGRDbGFzcywgbmV3Q2xhc3MpOwotCQkJCQlNZXRob2RbXSBhZGRlZE1ldGhvZHMgPSBnZXRBZGRlZE1ldGhvZHMob2xkQ2xhc3MsIG5ld0NsYXNzKTsKLQkJCQkJQ29uc3RydWN0b3JbXSByZW1vdmVkQ29uc3RydWN0b3JzID0gZ2V0UmVtb3ZlZENvbnN0cnVjdG9ycyhvbGRDbGFzcywgbmV3Q2xhc3MpOwotCQkJCQlDb25zdHJ1Y3RvcltdIGFkZGVkQ29uc3RydWN0b3JzID0gZ2V0QWRkZWRDb25zdHJ1Y3RvcnMob2xkQ2xhc3MsIG5ld0NsYXNzKTsKLQkJCQkJaWYgKHJlbW92ZWRNZXRob2RzICE9IG51bGwgfHwgYWRkZWRNZXRob2RzICE9IG51bGwgfHwgCi0JCQkJCQlyZW1vdmVkQ29uc3RydWN0b3JzICE9IG51bGwgfHwgYWRkZWRDb25zdHJ1Y3RvcnMgIT0gbnVsbCkgewotCQkJCQkJRGlmZkNsYXNzIGRpZmYgPSBuZXcgRGlmZkNsYXNzKAotCQkJCQkgCQlEaWZmQ2xhc3MuTU9ESUZJRUQsCi0JCQkJCSAJCW9sZENsYXNzLAotCQkJCQkgCQluZXdDbGFzcywKLQkJCQkJIAkJcmVtb3ZlZE1ldGhvZHMsCi0JCQkJCSAJCWFkZGVkTWV0aG9kcywKLQkJCQkJIAkJcmVtb3ZlZENvbnN0cnVjdG9ycywKLQkJCQkJIAkJYWRkZWRDb25zdHJ1Y3RvcnMKLQkJCQkJIAkpOwotCQkJCQkgCWRpZmZzLmFkZChkaWZmKTsKLQkJCQkJIH0KLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ldzJPbGQubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobmV3Mk9sZFtpXSA8IDApIHsKLQkJCQkJLyogRm91bmQgYSBjbGFzcyB3aGljaCBoYXMgYmVlbiBhZGRlZCAqLwotCQkJCQlEaWZmQ2xhc3MgZGlmZiA9IG5ldyBEaWZmQ2xhc3MoCi0JCQkJCQlEaWZmQ2xhc3MuTkVXLAotCQkJCQkJbnVsbCwKLQkJCQkJCW5ld0NsYXNzZXNbaV0sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsCi0JCQkJCSk7Ci0JCQkJCWRpZmZzLmFkZChkaWZmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlNZXRob2RbXSBnZXRSZW1vdmVkTWV0aG9kcyhDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MpIHsKLQkJCU1ldGhvZFtdIG9sZE1ldGhvZHMgPSBnZXRGaWx0ZXJlZE1ldGhvZHMob2xkQ2xhc3MpOwotCQkJTWV0aG9kW10gbmV3TWV0aG9kcyA9IGdldEZpbHRlcmVkTWV0aG9kcyhuZXdDbGFzcyk7Ci0JCQkKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgb2xkTmFtZSA9IGdldE1ldGhvZE5hbWUob2xkTWV0aG9kc1tpXSk7Ci0JCQkJYm9vbGVhbiByZW1vdmVkID0gdHJ1ZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5ld01ldGhvZHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBnZXRNZXRob2ROYW1lKG5ld01ldGhvZHNbal0pOwotCQkJCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZW1vdmVkKSBvbGRNZXRob2RzW2NvdW50KytdID0gb2xkTWV0aG9kc1tpXTsKLQkJCX0KLQkJCWlmIChjb3VudCA9PSAwKSByZXR1cm4gbnVsbDsKLQkJCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRNZXRob2RzLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCU1ldGhvZFtdIGdldEFkZGVkTWV0aG9kcyhDbGFzcyBvbGRDbGFzcywgQ2xhc3MgbmV3Q2xhc3MpIHsKLQkJCXJldHVybiBnZXRSZW1vdmVkTWV0aG9kcyhuZXdDbGFzcywgb2xkQ2xhc3MpOwotCQl9Ci0JCQotCQlDb25zdHJ1Y3RvcltdIGdldFJlbW92ZWRDb25zdHJ1Y3RvcnMoQ2xhc3Mgb2xkQ2xhc3MsIENsYXNzIG5ld0NsYXNzKSB7Ci0JCQlDb25zdHJ1Y3RvcltdIG9sZENvbnN0cnVjdG9ycyA9IGdldEZpbHRlcmVkQ29uc3RydWN0b3JzKG9sZENsYXNzKTsKLQkJCUNvbnN0cnVjdG9yW10gbmV3Q29uc3RydWN0b3JzID0gZ2V0RmlsdGVyZWRDb25zdHJ1Y3RvcnMobmV3Q2xhc3MpOwotCQkJCi0JCQlpbnQgY291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgb2xkTmFtZSA9IGdldE1ldGhvZE5hbWUob2xkQ29uc3RydWN0b3JzW2ldKTsKLQkJCQlib29sZWFuIHJlbW92ZWQgPSB0cnVlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmV3Q29uc3RydWN0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gZ2V0TWV0aG9kTmFtZShuZXdDb25zdHJ1Y3RvcnNbal0pOwotCQkJCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZW1vdmVkKSBvbGRDb25zdHJ1Y3RvcnNbY291bnQrK10gPSBvbGRDb25zdHJ1Y3RvcnNbaV07Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCQlDb25zdHJ1Y3RvcltdIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3Rvcltjb3VudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZENvbnN0cnVjdG9ycywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlDb25zdHJ1Y3RvcltdIGdldEFkZGVkQ29uc3RydWN0b3JzKENsYXNzIG9sZENsYXNzLCBDbGFzcyBuZXdDbGFzcykgewotCQkJcmV0dXJuIGdldFJlbW92ZWRDb25zdHJ1Y3RvcnMobmV3Q2xhc3MsIG9sZENsYXNzKTsKLQkJfQotCQkKLQkJdm9pZCBvdXRwdXRDbGFzc0RpZmYoKSB7Ci0JCQlFbnVtZXJhdGlvbiBlbGVtZW50cyA9IGRpZmZzLmVsZW1lbnRzKCk7Ci0JCQlpbnQgY2hhbmdlcyA9IDA7Ci0JCQl3aGlsZSAoZWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlEaWZmQ2xhc3MgZGlmZiA9IChEaWZmQ2xhc3MpZWxlbWVudHMubmV4dEVsZW1lbnQoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiK2NoYW5nZXMrIl0gIisgZGlmZik7Ci0JCQkJY2hhbmdlcysrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwMTNhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQucGVyZm9ybWFuY2U7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LnRleHR1aS4qOwotCi0vKioKLSAqIFN1aXRlIGZvciBydW5uaW5nIFNXVCBwZXJmb3JtYW5jZSB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFBlcmZvcm1hbmNlVGVzdHMoKTsKLX0KLQotcHVibGljIFBlcmZvcm1hbmNlVGVzdHMoKSB7Ci0Jc3VwZXIoKTsKLQlhZGRUZXN0KFRlc3Rfc2l0dWF0aW9uYWwuc3VpdGUoKSk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1N3dFBlcmZvcm1hbmNlVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWIwZTVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQucGVyZm9ybWFuY2U7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuKjsKLQotCi1wdWJsaWMgY2xhc3MgU3d0UGVyZm9ybWFuY2VUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQkvLyB1c2VkIHRvIHNwZWNpZnkgdmVyYm9zZSBtb2RlLCBpZiB0cnVlIHVuaW1wbGVtZW50ZWQgd2FybmluZyBtZXNzYWdlcyB3aWxsIAotCS8vIGJlIHdyaXR0ZW4gdG8gU3lzdGVtLm91dAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gaXNHVEsgPSBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoImd0ayIpOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MgPSBTV1QuZ2V0UGxhdGZvcm0oKS5zdGFydHNXaXRoKCJ3aW4zMiIpOwotCQotCS8vIGFsbG93IHNwZWNpZmljIGltYWdlIGZvcm1hdHMgdG8gYmUgdGVzdGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBpbWFnZUZvcm1hdHMgPSBuZXcgU3RyaW5nW10geyJibXAiLCAianBnIiwgImdpZiIsICJwbmcifTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGltYWdlRmlsZW5hbWVzID0gbmV3IFN0cmluZ1tdIHsiZm9sZGVyIiwgImZvbGRlck9wZW4iLCAidGFyZ2V0In07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0cmFuc3BhcmVudEltYWdlRmlsZW5hbWVzID0gbmV3IFN0cmluZ1tdIHsidHJhbnNwYXJlbnQucG5nIn07Ci0KLQkKLXB1YmxpYyBTd3RQZXJmb3JtYW5jZVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci0KLXByb3RlY3RlZCBQZXJmb3JtYW5jZU1ldGVyIGNyZWF0ZU1ldGVyKFN0cmluZyBpZCkgewotCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlID0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCVN0cmluZyBzY2VuYXJpb0lkID0gIm9yZy5lY2xpcHNlLnN3dC50ZXN0LiIgKyBpZDsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gcGVyZm9ybWFuY2UuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihzY2VuYXJpb0lkKTsKLQlwZXJmb3JtYW5jZS50YWdBc1N1bW1hcnkobWV0ZXIsIGlkLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLQlyZXR1cm4gbWV0ZXI7Ci19Ci0KLXByb3RlY3RlZCBQZXJmb3JtYW5jZU1ldGVyIGNyZWF0ZU1ldGVyV2l0aG91dFN1bW1hcnkoU3RyaW5nIGlkKSB7Ci0JUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2UgPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JU3RyaW5nIHNjZW5hcmlvSWQgPSAib3JnLmVjbGlwc2Uuc3d0LnRlc3QuIiArIGlkOwotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBwZXJmb3JtYW5jZS5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHNjZW5hcmlvSWQpOwotCXJldHVybiBtZXRlcjsKLX0KLQotcHJvdGVjdGVkIHZvaWQgZGlzcG9zZU1ldGVyKFBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIpIHsKLQl0cnkgewotCQltZXRlci5jb21taXQoKTsKLQkJUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpLmFzc2VydFBlcmZvcm1hbmNlKG1ldGVyKTsKLQl9IGZpbmFsbHkgewotCQltZXRlci5kaXNwb3NlKCk7Ci0JfQotfQotCi1wcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGgoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JU3RyaW5nIHVybFBhdGg7Ci0JCi0JU3RyaW5nIHBsdWdpblBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIlBMVUdJTl9QQVRIIik7Ci0JaWYgKHZlcmJvc2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQTFVHSU5fUEFUSCA8IitwbHVnaW5QYXRoKyI+Iik7Ci0JfQotCWlmIChwbHVnaW5QYXRoID09IG51bGwpIHsKLQkJVVJMIHVybCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShmaWxlTmFtZSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJZmFpbCgiVVJMID09IG51bGwgZm9yIGZpbGUgIiArIGZpbGVOYW1lKTsKLQkJfQotCQl1cmxQYXRoID0gdXJsLmdldEZpbGUoKTsKLQl9IGVsc2UgewotCQl1cmxQYXRoID0gcGx1Z2luUGF0aCArICIvZGF0YS8iICsgZmlsZU5hbWU7Ci0JfQotCQotCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB1cmxQYXRoID0gdXJsUGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsJCi0JaWYgKGlzV2luZG93cyAmJiB1cmxQYXRoLmluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSA9PSAwKSB1cmxQYXRoID0gdXJsUGF0aC5zdWJzdHJpbmcoMSk7Ci0JdXJsUGF0aCA9IHVybFBhdGgucmVwbGFjZUFsbCgiJTIwIiwgIiAiKTsJCi0JCi0JaWYgKHZlcmJvc2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvbHZlZCBmaWxlIG5hbWUgZm9yICIgKyBmaWxlTmFtZSArICIgPSAiICsgdXJsUGF0aCk7Ci0JfQotCXJldHVybiB1cmxQYXRoOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc0oyTUUoKSB7Ci0JdHJ5IHsKLQkJQ29tcGF0aWJpbGl0eS5uZXdGaWxlSW5wdXRTdHJlYW0oIiIpOwotCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3BlcmZvcm1hbmNlL1Rlc3Rfc2l0dWF0aW9uYWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvVGVzdF9zaXR1YXRpb25hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGNmOGZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvcGVyZm9ybWFuY2UvVGVzdF9zaXR1YXRpb25hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5zd3QudGVzdHMuanVuaXQucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC50ZXh0dWkuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZU1ldGVyOwotCi0vKioKLSAqIEF1dG9tYXRlZCBQZXJmb3JtYW5jZSBUZXN0IFN1aXRlIGZvciBjbGFzcyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotICovCi1wdWJsaWMgY2xhc3MgVGVzdF9zaXR1YXRpb25hbCBleHRlbmRzIFN3dFBlcmZvcm1hbmNlVGVzdENhc2UgewotCi1wdWJsaWMgVGVzdF9zaXR1YXRpb25hbChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotCi1wdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0Jc3VwZXIuc2V0VXAoKTsKLQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci19Ci0KLQotLyoqCi0gKiBTaXR1YXRpb25zOgotICogCi0gKiAtIFdpZGdldCBjcmVhdGlvbgotICogLSBzeW5jRXhlYy9hc3luY0V4ZWMgcGVyZm9ybWFuY2UKLSAqIC0gSW1hZ2UgY3JlYXRpb24KLSAqIC0gRHJhd2luZyBvcGVyYXRpb25zCi0gKiAtIFN0cmluZyBtZWFzdXJpbmcKLSAqIC0gU3RyaW5nIGRyYXdpbmcKLSAqIC0gUmVnaW9uIG9wZXJhdGlvbnMKLSAqIC0gRm9udHMKLSAqIC0gSW1hZ2UgbG9hZGluZwotICogLSBMYXlvdXRzCi0gKi8KLXB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29tcG9zaXRlcygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkNyZWF0ZSBjb21wb3NpdGVzIik7Ci0JaW50IHNhbXBsZXM7Ci0KLSAgICBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCi0JLy8gV2FybSB1cC4KLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAyOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7Ci0JCQkJbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCQl9Ci0JCX0KLQkJc2hlbGwuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JfQotCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTAwOyBzYW1wbGVzKyspIHsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCA1MDsgaisrKSB7Ci0JCQkJbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7Ci0JCQl9Ci0JCX0KLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2lkZ2V0cygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkNyZWF0ZSBjb21wb3NpdGVzIGFuZCB3aWRnZXRzIik7Ci0JaW50IHNhbXBsZXM7Ci0KLSAgICBQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLSAgICBwZXJmb3JtYW5jZS50YWdBc0dsb2JhbFN1bW1hcnkobWV0ZXIsICJDcmVhdGUgY29tcG9zaXRlcyBhbmQgd2lkZ2V0cyIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQltZXRlci5zdGFydCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULk5PTkUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKSB7Ci0JCQkJbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0JCQkJbmV3IExhYmVsKGMsIFNXVC5OT05FKTsKLQkJCQluZXcgU2NhbGUoYywgU1dULk5PTkUpOwotCQkJCW5ldyBQcm9ncmVzc0JhcihjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IExpc3QoYywgU1dULk5PTkUpOwotCQkJCW5ldyBUZXh0KGMsIFNXVC5TSU5HTEUpOwotCQkJCW5ldyBUZXh0KGMsIFNXVC5NVUxUSSk7Ci0JCQkJbmV3IFNsaWRlcihjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IFRyZWUoYywgU1dULk5PTkUpOwotCQkJCW5ldyBUYWJsZShjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IFRhYkZvbGRlcihjLCBTV1QuTk9ORSk7Ci0JCQkJbmV3IEdyb3VwKGMsIFNXVC5CT1JERVIpOwkJCQkKLQkJCQluZXcgQ29tcG9zaXRlKGMsIFNXVC5OT05FKTsKLQkJCX0KLQkJfQotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCX0JCi0JZGlzcG9zZU1ldGVyKG1ldGVyKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9sYXlvdXQoKSB7Ci0JUGVyZm9ybWFuY2VNZXRlciBtZXRlciA9IGNyZWF0ZU1ldGVyKCJMYXlvdXQgQ29tcG9zaXRlcyIpOwotCWludCBzYW1wbGVzOwotCi0JaWYgKGlzV2luZG93cykgewotCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZSA9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQkJcGVyZm9ybWFuY2Uuc2V0Q29tbWVudCgKLQkJCW1ldGVyLAotCQkJUGVyZm9ybWFuY2UuRVhQTEFJTlNfREVHUkFEQVRJT05fQ09NTUVOVCwKLQkJCSJEZWdyYWRhdGlvbiBpcyBhIHJlc3VsdCBvZiBmaXhpbmcgYnVnIDE4NjA3LCB3aGljaCBlbmFibGVzIGNvcnJlY3QgWFAtdGhlbWVkIGJvcmRlciBkcmF3aW5nLiAiICsKLQkJCSJUaGUgcmVwb3J0IGZvciB0aGlzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlzIGJ1ZyAxNDQzMTQuIik7Ci0JfQotCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlTdHJpbmcgY3VyVGV4dCA9ICIiOwotCQlMYWJlbCBjaGFuZ2VkTGFiZWw7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBzaGVsbDsKLQkJR3JpZERhdGEgZGF0YTsKLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjMSA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLndpZHRoSGludCA9IGRhdGEuaGVpZ2h0SGludCA9IDI7Ci0JCQljMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0JCQlDb21wb3NpdGUgYzIgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5CT1JERVIpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS53aWR0aEhpbnQgPSBkYXRhLmhlaWdodEhpbnQgPSAyOwotCQkJYzIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQotCQkJQ29tcG9zaXRlIGMzID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuQk9SREVSKTsKLQkJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gZGF0YS5oZWlnaHRIaW50ID0gMjsKLQkJCWMzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUNvbXBvc2l0ZSBjNCA9IG5ldyBDb21wb3NpdGUoYywgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQljNC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJYzQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJcGFyZW50ID0gYzQ7Ci0JCX0KLQkJY2hhbmdlZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJY2hhbmdlZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlzaGVsbC5vcGVuKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJdHJ5IHsgVGhyZWFkLnNsZWVwKDIwMDApOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQltZXRlci5zdGFydCgpOwotCQlmb3IoaW50IG51bWxheW91dHMgPSAwOyBudW1sYXlvdXRzIDwgMjA7IG51bWxheW91dHMrKykgewotCQkJc2hlbGwubGF5b3V0KHRydWUpOwotCQkJY3VyVGV4dCA9ICIhISEiICsgY3VyVGV4dCArICIhISFcbiEiOwotCQkJY2hhbmdlZExhYmVsLnNldFRleHQoY3VyVGV4dCk7Ci0JCQkvL3doaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpOwotCQl9Ci0JCW1ldGVyLnN0b3AoKTsKLQkJc2hlbGwuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2ltYWdlRHJhd2luZygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkRyYXcgb24gYW4gaW1hZ2UiKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgd2lkdGgsIGhlaWdodCk7Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAweGZmLCAwLCAweGZmKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDB4ZmYpOwotCQlpbnQgeDEgPSAwLCB5MSA9IGhlaWdodC8yLCB4MiA9IHdpZHRoLzIsIHkyID0gMDsKLQkJbWV0ZXIuc3RhcnQoKTsKLQkJR0MgZ2MgPSBuZXcgR0MoaW1hZ2UpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQkJZ2MuZHJhd0xpbmUoeDEsIHkxLCB4MiwgeTIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2Muc2V0QmFja2dyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSh4MSwgeTEsIDIwMCwgMjAwKTsKLQkJCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSh4MiwgeTIsIDIwMCwgMjAwLCA1MCwgNTApOwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1QpOwotCQkJZ2MuZHJhd0xpbmUoeDIsIHkxLCB4MSwgeTIpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfd2luZG93RHJhd2luZygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXIoIkRyYXcgb24gYSB3aW5kb3ciKTsKLQlpbnQgc2FtcGxlczsKLQkKLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCXRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCWludCB4MSA9IDAsIHkxID0gaGVpZ2h0LzIsIHgyID0gd2lkdGgvMiwgeTIgPSAwOwotCQltZXRlci5zdGFydCgpOwotCQlHQyBnYyA9IG5ldyBHQyhjKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDYwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRMaW5lU3R5bGUoU1dULkxJTkVfU09MSUQpOwotCQkJZ2MuZHJhd0xpbmUoeDEsIHkxLCB4MiwgeTIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2Muc2V0QmFja2dyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2MuZmlsbFJlY3RhbmdsZSh4MSwgeTEsIDIwMCwgMjAwKTsKLQkJCWdjLmRyYXdSb3VuZFJlY3RhbmdsZSh4MiwgeTIsIDIwMCwgMjAwLCA1MCwgNTApOwotCQkJZ2Muc2V0TGluZVN0eWxlKFNXVC5MSU5FX0RBU0hET1QpOwotCQkJZ2MuZHJhd0xpbmUoeDIsIHkxLCB4MSwgeTIpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc3RyaW5nRHJhd2luZygpIHsKLQlQZXJmb3JtYW5jZU1ldGVyIG1ldGVyID0gY3JlYXRlTWV0ZXJXaXRob3V0U3VtbWFyeSgiRHJhdyBzdHJpbmdzIHVzaW5nIEdDLmRyYXdUZXh0Iik7Ci0JaW50IHNhbXBsZXM7Ci0JCi0JZm9yKHNhbXBsZXMgPSAwOyBzYW1wbGVzIDwgMTA7IHNhbXBsZXMrKykgewotCQlpbnQgd2lkdGggPSA2NDA7Ci0JCWludCBoZWlnaHQgPSA0ODA7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNhbnZhcyBjID0gbmV3IENhbnZhcyhzaGVsbCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJYy5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzaGVsbC5wYWNrKCk7Ci0JCXNoZWxsLm9wZW4oKTsKLQkJd2hpbGUoZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSl7LyplbXB0eSovfQotCQl0cnkgeyBUaHJlYWQuc2xlZXAoMjAwMCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCUNvbG9yIGNvbG9yMSA9IG5ldyBDb2xvcihkaXNwbGF5LCAweGZmLCAwLCAweGZmKTsKLQkJQ29sb3IgY29sb3IyID0gbmV3IENvbG9yKGRpc3BsYXksIDAsIDB4ZmYsIDB4ZmYpOwotCQlGb250IGZvbnQxID0gbmV3IEZvbnQoZGlzcGxheSwgIkhlbHZldGljYSIsIDIwLCBTV1QuTk9ORSk7Ci0JCUZvbnQgZm9udDIgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMTAsIFNXVC5CT0xEKTsKLQkJU3RyaW5nIHRlc3RTdHJpbmcgPSAiVGhlIHF1aWNrIFx0YnImb3duIFNXVCBqdW0mcGVkIGZveGlseSBvXG52ZXIgdGhlIGxhenkgZG9nLiI7Ci0JCWludCB4MSA9IDAsIHkxID0gaGVpZ2h0LzIsIHgyID0gd2lkdGgvMiwgeTIgPSAwOwotCQltZXRlci5zdGFydCgpOwotCQlHQyBnYyA9IG5ldyBHQyhjKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IDQwMDA7IGkrKykgewotCQkJeDEgPSAoeDEgKyA1KSAlIHdpZHRoOyB5MSA9ICh5MSArIDUpICUgaGVpZ2h0OyB4MiA9ICh4MiArIDUpICUgd2lkdGg7IHkyID0gKHkyICsgNSkgJSBoZWlnaHQ7Ci0JCQlnYy5zZXRGb250KChpICYgMSkgPT0gMCA/IGZvbnQxIDogZm9udDIpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoaSAmIDEpID09IDAgPyBjb2xvcjEgOiBjb2xvcjIpOwotCQkJZ2MudGV4dEV4dGVudCh0ZXN0U3RyaW5nKTsKLQkJCWdjLmRyYXdUZXh0KHRlc3RTdHJpbmcsIHgyLCB5MSk7Ci0JCQlnYy5kcmF3VGV4dCh0ZXN0U3RyaW5nLCB4MiwgeTEvMiwgU1dULkRSQVdfTU5FTU9OSUMgfCBTV1QuRFJBV19UUkFOU1BBUkVOVCk7Ci0JCQlnYy5kcmF3VGV4dCh0ZXN0U3RyaW5nLCB4MiwgeTIsIHRydWUpOwotCQl9Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJbWV0ZXIuc3RvcCgpOwotCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCWNvbG9yMS5kaXNwb3NlKCk7Ci0JCWNvbG9yMi5kaXNwb3NlKCk7Ci0JCWZvbnQxLmRpc3Bvc2UoKTsKLQkJZm9udDIuZGlzcG9zZSgpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JfQkKLQlkaXNwb3NlTWV0ZXIobWV0ZXIpOwotfQotCi1wdWJsaWMgdm9pZCB0ZXN0X2Zhc3RTdHJpbmdEcmF3aW5nKCkgewotCVBlcmZvcm1hbmNlTWV0ZXIgbWV0ZXIgPSBjcmVhdGVNZXRlcldpdGhvdXRTdW1tYXJ5KCJEcmF3IHN0cmluZ3MgdXNpbmcgR0MuZHJhd1N0cmluZygpIik7Ci0JaW50IHNhbXBsZXM7Ci0KLQlmb3Ioc2FtcGxlcyA9IDA7IHNhbXBsZXMgPCAxMDsgc2FtcGxlcysrKSB7Ci0JCWludCB3aWR0aCA9IDY0MDsKLQkJaW50IGhlaWdodCA9IDQ4MDsKLQkJU2hlbGwgc2hlbGwgPSBuZXcgU2hlbGwoZGlzcGxheSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ2FudmFzIGMgPSBuZXcgQ2FudmFzKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQljLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNoZWxsLnBhY2soKTsKLQkJc2hlbGwub3BlbigpOwotCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXsvKmVtcHR5Ki99Ci0JCXRyeSB7IFRocmVhZC5zbGVlcCgyMDAwKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQkJQ29sb3IgY29sb3IxID0gbmV3IENvbG9yKGRpc3BsYXksIDB4ZmYsIDAsIDB4ZmYpOwotCQlDb2xvciBjb2xvcjIgPSBuZXcgQ29sb3IoZGlzcGxheSwgMCwgMHhmZiwgMHhmZik7Ci0JCUZvbnQgZm9udDEgPSBuZXcgRm9udChkaXNwbGF5LCAiSGVsdmV0aWNhIiwgMjAsIFNXVC5OT05FKTsKLQkJRm9udCBmb250MiA9IG5ldyBGb250KGRpc3BsYXksICJIZWx2ZXRpY2EiLCAxMCwgU1dULkJPTEQpOwotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGUgcXVpY2sgYnJvd24gU1dUIGp1bXBlZCBmb3hpbHkgb3ZlciB0aGUgbGF6eSBkb2cuIjsKLQkJaW50IHgxID0gMCwgeTEgPSBoZWlnaHQvMiwgeDIgPSB3aWR0aC8yLCB5MiA9IDA7Ci0JCW1ldGVyLnN0YXJ0KCk7Ci0JCUdDIGdjID0gbmV3IEdDKGMpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7Ci0JCQl4MSA9ICh4MSArIDUpICUgd2lkdGg7IHkxID0gKHkxICsgNSkgJSBoZWlnaHQ7IHgyID0gKHgyICsgNSkgJSB3aWR0aDsgeTIgPSAoeTIgKyA1KSAlIGhlaWdodDsKLQkJCWdjLnNldEZvbnQoKGkgJiAxKSA9PSAwID8gZm9udDEgOiBmb250Mik7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChpICYgMSkgPT0gMCA/IGNvbG9yMSA6IGNvbG9yMik7Ci0JCQlnYy5zdHJpbmdFeHRlbnQodGVzdFN0cmluZyk7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIHgxLCB5Mik7Ci0JCQlnYy5kcmF3U3RyaW5nKHRlc3RTdHJpbmcsIHgxLCB5MSwgdHJ1ZSk7Ci0JCX0KLQkJZ2MuZGlzcG9zZSgpOwotCQltZXRlci5zdG9wKCk7Ci0JCXNoZWxsLmRpc3Bvc2UoKTsKLQkJY29sb3IxLmRpc3Bvc2UoKTsKLQkJY29sb3IyLmRpc3Bvc2UoKTsKLQkJZm9udDEuZGlzcG9zZSgpOwotCQlmb250Mi5kaXNwb3NlKCk7Ci0JCXdoaWxlKGRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpey8qZW1wdHkqL30KLQl9CQotCWRpc3Bvc2VNZXRlcihtZXRlcik7Ci19Ci0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JamF2YS51dGlsLlZlY3RvciBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzKCk7Ci0JamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBtZXRob2ROYW1lcy5lbGVtZW50cygpOwotCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3Rfc2l0dWF0aW9uYWwoKFN0cmluZyllLm5leHRFbGVtZW50KCkpKTsKLQl9Ci0JcmV0dXJuIHN1aXRlOwotfQotcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuVmVjdG9yIG1ldGhvZE5hbWVzKCkgewotCWphdmEudXRpbC5WZWN0b3IgbWV0aG9kTmFtZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3JlYXRlQ29tcG9zaXRlcyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfY3JlYXRlV2lkZ2V0cyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfaW1hZ2VEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF93aW5kb3dEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9zdHJpbmdEcmF3aW5nIik7Ci0JbWV0aG9kTmFtZXMuYWRkRWxlbWVudCgidGVzdF9mYXN0U3RyaW5nRHJhd2luZyIpOwotCW1ldGhvZE5hbWVzLmFkZEVsZW1lbnQoInRlc3RfbGF5b3V0Iik7Ci0JcmV0dXJuIG1ldGhvZE5hbWVzOwotfQotcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotCWlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X2NyZWF0ZUNvbXBvc2l0ZXMiKSkgdGVzdF9jcmVhdGVDb21wb3NpdGVzKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9jcmVhdGVXaWRnZXRzIikpIHRlc3RfY3JlYXRlV2lkZ2V0cygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfbGF5b3V0IikpIHRlc3RfbGF5b3V0KCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9pbWFnZURyYXdpbmciKSkgdGVzdF9pbWFnZURyYXdpbmcoKTsKLQllbHNlIGlmIChnZXROYW1lKCkuZXF1YWxzKCJ0ZXN0X3dpbmRvd0RyYXdpbmciKSkgdGVzdF93aW5kb3dEcmF3aW5nKCk7Ci0JZWxzZSBpZiAoZ2V0TmFtZSgpLmVxdWFscygidGVzdF9zdHJpbmdEcmF3aW5nIikpIHRlc3Rfc3RyaW5nRHJhd2luZygpOwotCWVsc2UgaWYgKGdldE5hbWUoKS5lcXVhbHMoInRlc3RfZmFzdFN0cmluZ0RyYXdpbmciKSkgdGVzdF9mYXN0U3RyaW5nRHJhd2luZygpOwotfQotCi0vKiBjdXN0b20gKi8KLURpc3BsYXkgZGlzcGxheTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3ZDUwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZThiNWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL0pVbml0IFRlc3RzL29yZy9lY2xpcHNlL3N3dC90ZXN0cy9qdW5pdC90YXJnZXQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNlYTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdGFyZ2V0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ZDdlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RhcmdldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvSlVuaXQgVGVzdHMvb3JnL2VjbGlwc2Uvc3d0L3Rlc3RzL2p1bml0L3RyYW5zcGFyZW50LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI1ZjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9KVW5pdCBUZXN0cy9vcmcvZWNsaXBzZS9zd3QvdGVzdHMvanVuaXQvdHJhbnNwYXJlbnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBlOTk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLnN3dHRlc3RzLmphcj1KVW5pdCBUZXN0cy8KLQotYmluLmluY2x1ZGVzPSouamFyLHBsdWdpbi54bWwsdGVzdC54bWwsYWJvdXQuaHRtbCxwbHVnaW4ucHJvcGVydGllcyxkYXRhLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXIzLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyMy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWNhMGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXIzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxodG1sPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPndpbmRvdy5vcGVuKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iLCAiRGlhbG9nIik8L3NjcmlwdD4KLTxib2R5PgotVGhpcyB0ZXN0IHVzZXMgamF2YXNjcmlwdCB0byBvcGVuIGEgbmV3IHdpbmRvdy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U0YmY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08aHRtbD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQl3ID0gd2luZG93Lm9wZW4oImJyb3dzZXI0YS5odG1sIiwgIkRpYWxvZyIpOwotCXNldFRpbWVvdXQoIncuY2xvc2UoKSIsIDUwMDApOwotPC9zY3JpcHQ+Ci08Ym9keT4KLTxwPlRoaXMgdGVzdCB1c2VzIGphdmFzY3JpcHQuCi08cD5JdCBvcGVucyBhIG5ldyB3aW5kb3cuIFNldHMgYSB0aW1lci4gVGhlbiBjbG9zZSB0aGUgbmV3IHdpbmRvdyB3aGVuIHRoZSB0aW1lciBleHBpcmVzLgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjRhLmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNGEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzNTg1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIgotIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgPHRpdGxlPnNpbXBsZSBwYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyMDQsIDApOyBjb2xvcjogcmdiKDAsIDAsIDApOyIKLSBsaW5rPSIjMDAwMGVlIiBhbGluaz0iIzAwMDBlZSIgdmxpbms9IiM1NTFhOGIiPgotPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PGJpZz48YmlnPjxiaWc+PGJpZz48YmlnPjxiaWc+PHNwYW4KLSBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5UaGlzIGlzIGEgc2ltcGxlIHBhZ2U8L3NwYW4+PC9iaWc+PC9iaWc+PC9iaWc+PC9iaWc+PC9iaWc+PC9iaWc+PGJyPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNS5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1YmZjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPGh0bWw+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JdmFyIHdpbjsKLQlmdW5jdGlvbiB0ZXN0T3BlbigpIHsKLQkJd2luID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdzwvaDI+IicsICIiLCAibGVmdD0xMCx0b3A9MjAwLGhlaWdodD0xMDAsd2lkdGg9MzAwIik7Ci0JfQotCWZ1bmN0aW9uIHRlc3RSZXNpemVUbygpIHsKLQkJd2luLnJlc2l6ZVRvKDYwMCw4MDApOwotCX0KLQlmdW5jdGlvbiB0ZXN0TW92ZVRvKCkgewotCQl3aW4ubW92ZVRvKDIwMCwxMDApOwotCX0KLQlmdW5jdGlvbiB0ZXN0TW92ZUJ5KCkgewotCQl3aW4ubW92ZUJ5KDIsMik7Ci0JfQotCWZ1bmN0aW9uIHRlc3RTY3JvbGxCeSgpIHsKLQkJd2luLnNjcm9sbEJ5KDEsMjApOwotCX0KLQlmdW5jdGlvbiB0ZXN0UmVzaXplQnkoKSB7Ci0JCXdpbi5yZXNpemVCeSgyLDMpOwotCX0KLQlmdW5jdGlvbiB0ZXN0Q2xvc2UoKSB7Ci0JCXdpbi5jbG9zZSgpOwotCX0KLQotCXdpbjEgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlNpbXBsZSBOZXcgV2luZG93IDE8L2gyPjxwPmJvdW5kczogbGVmdD0xMCx0b3A9MjAwLGhlaWdodD0xMDAsd2lkdGg9MzAwPHA+IicsICIiLCAibGVmdD0xMCx0b3A9MjAwLGhlaWdodD0xMDAsd2lkdGg9MzAwIik7Ci0Jd2luMiA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+U2ltcGxlIE5ldyBXaW5kb3cgMjwvaDI+PHA+Ym91bmRzOiBsZWZ0PTEwLHRvcD0yMDA8cD4iJywgIiIsICJsZWZ0PTEwLHRvcD0yMDAiKTsKLQl3aW4zID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdyAzPC9oMj48cD5ib3VuZHM6IGhlaWdodD0xMDAsd2lkdGg9MzAwPHA+IicsICIiLCAiaGVpZ2h0PTEwMCx3aWR0aD0zMDAiKTsKLQl3aW40ID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5TaW1wbGUgTmV3IFdpbmRvdyA0PC9oMj48cD5ib3VuZHM6IG5vdCBzcGVjaWZpZWQ8cD4iJywgIiIsICIiKTsKLQkKLQlzZXRUaW1lb3V0KCJ3aW4xLmNsb3NlKCk7d2luMi5jbG9zZSgpO3dpbjMuY2xvc2UoKTt3aW40LmNsb3NlKCkiLCA1MDAwKTsKLQkKLTwvc2NyaXB0PgotCi08Zm9ybT4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0id2luZG93Lm9wZW4iIG9uQ2xpY2s9InRlc3RPcGVuKCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJyZXNpemVUbyIgb25DbGljaz0idGVzdFJlc2l6ZVRvKCkiPgotCTxpbnB1dCB0eXBlPSJidXR0b24iIFZBTFVFPSJtb3ZlVG8iIG9uQ2xpY2s9InRlc3RNb3ZlVG8oKSI+Ci0JPGlucHV0IHR5cGU9ImJ1dHRvbiIgVkFMVUU9Im1vdmVCeSIgb25DbGljaz0idGVzdE1vdmVCeSgpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0ic2Nyb2xsQnkiIG9uQ2xpY2s9InRlc3RTY3JvbGxCeSgpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0icmVzaXplQnkiIG9uQ2xpY2s9InRlc3RSZXNpemVCeSgpIj4KLQk8aW5wdXQgdHlwZT0iYnV0dG9uIiBWQUxVRT0iY2xvc2UiIG9uQ2xpY2s9InRlc3RDbG9zZSgpIj4KLTwvRk9STT4KLTxib2R5PgotPHA+VGhpcyB0ZXN0IHVzZXMgamF2YXNjcmlwdC4KLTxwPkl0IG9wZW5zIGEgbmV3IHdpbmRvdy4gU2V0cyBhIHRpbWVyLiBUaGVuIGNsb3NlIHRoZSBuZXcgd2luZG93IHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNi5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvYnJvd3NlcjYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyNzUwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08aHRtbD4KLTx0aXRsZT5UaGlzIGlzIGEgdGVzdCB0aXRsZSB0aGF0IG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQgd2hlbiB0aGF0IHBhZ2UgaXMgbG9hZGVkPC90aXRsZT4KLTxib2R5PgotVGhpcyB0ZXN0IGlzIHVzZWQgdG8gYXV0b21hdGljYWxseSBjaGVjayB0aGUgY29udGVudCBvZiB0aGUgdGl0bGUgdGFnLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI3Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU3ZDUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08aHRtbD4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLXdpbjEgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlRFU1Qgd2luZG93Lm9wZW48L2gyPjxwPmxlZnQ9MCx0b3A9MCxoZWlnaHQ9MTAwLHdpZHRoPTIwMDwvcD4iJywgIiIsICJsZWZ0PTAsdG9wPTAsaGVpZ2h0PTIwMCx3aWR0aD0zMDAiKTsJCi13aW4yID0gd2luZG93Lm9wZW4oJ2phdmFzY3JpcHQ6IjxoMT5URVNUIHdpbmRvdy5vcGVuPC9oMj48cD5tZW51YmFyPW5vLHN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTMwMSx0b3A9MCxoZWlnaHQ9NjAwLHdpZHRoPTIwMDwvcD4iJywgIiIsICJtZW51YmFyPW5vLHN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTMwMSx0b3A9MCxoZWlnaHQ9NjAwLHdpZHRoPTIwMCIpOwkKLXdpbjMgPSB3aW5kb3cub3BlbignamF2YXNjcmlwdDoiPGgxPlRFU1Qgd2luZG93Lm9wZW48L2gyPjxwPnN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPXllcyxyZXNpemFibGU9eWVzLGxlZnQ9MCx0b3A9MjAxLGhlaWdodD00MDAsd2lkdGg9MzAwPC9wPiInLCAiIiwgInN0YXR1cz1ubyxsb2NhdGlvbj1ubyx0b29sYmFyPXllcyxyZXNpemFibGU9eWVzLGxlZnQ9MCx0b3A9MjAxLGhlaWdodD00MDAsd2lkdGg9MzAwIik7CQotd2luNCA9IHdpbmRvdy5vcGVuKCdqYXZhc2NyaXB0OiI8aDE+VEVTVCB3aW5kb3cub3BlbjwvaDI+PHA+bWVudWJhcj15ZXMsc3RhdHVzPXllcyxsb2NhdGlvbj1ubyx0b29sYmFyPW5vLHJlc2l6YWJsZT1ubyxsZWZ0PTAsdG9wPTYwMSxoZWlnaHQ9MjAwLHdpZHRoPTUwMDwvcD4iJywgIiIsICJtZW51YmFyPXllcyxzdGF0dXM9eWVzLGxvY2F0aW9uPW5vLHRvb2xiYXI9bm8scmVzaXphYmxlPW5vLGxlZnQ9MCx0b3A9NjAxLGhlaWdodD0yMDAsd2lkdGg9NTAwIik7CQotPC9zY3JpcHQ+Ci08Ym9keT4KLTxwPlRoaXMgdGVzdCB1c2VzIGphdmFzY3JpcHQuCi08cD5JdCBvcGVucyBhIHNlcmllcyBvZiB3aW5kb3dzIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMuCi08cD5UaGUgYnV0dG9ucyBiZWxvdyBjYW4gYmUgdXNlZCBmb3IgbWFudWFsbHkgdGVzdGluZyB2YXJpb3VzIHR5cGVzIG9mIGphdmFzY3JpcHQgd2luZG93cy4KLTxmb3JtPgotPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9ImJyaW5nIGFsZXJ0KG1lc3NhZ2UpIiBvbkNsaWNrPSJhbGVydCgnbWVzc2FnZScpIj4KLTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJ3aW5kb3cucHJpbnQiIG9uQ2xpY2s9IndpbmRvdy5wcmludCgpIj4KLTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJjb25maXJtIiBvbkNsaWNrPSJpZiAoY29uZmlybSgnUHJlc3MgT2sgb3IgQ2FuY2VsIHRvIGNvbmZpcm0nKSkge2FsZXJ0KCdZb3UgcHJlc3NlZCBPSycpO30gZWxzZSB7YWxlcnQoJ1lvdSBwcmVzc2VkIENhbmNlbCcpO30iPgotPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI5Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9icm93c2VyOS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmEwNmVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2Jyb3dzZXI5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+SGVsbG8gVGl0bGU8L3RpdGxlPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotZnVuY3Rpb24gY2hhbmdlU3RhdHVzKHR4dCkgewotCWRvY3VtZW50LmJnQ29sb3IgPSAieWVsbG93IjsKLQl3aW5kb3cuc3RhdHVzID0gdHh0OwotfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLUhlbGxvIGJvZHkKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMWQzYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRjOGUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuZ2lmCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0lGODdhEgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDE5ZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdC5qcGcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi3/2P8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9jb3JydXB0LnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg2MGFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdEJhZEJpdERlcHRoLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2NvcnJ1cHRCYWRCaXREZXB0aC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2NiOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvY29ycnVwdEJhZEJpdERlcHRoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2VtcHR5LnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2VtcHR5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9lbXB0eS50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmJtcCBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NDM1MWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5naWYgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE3Yzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuanBnIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3MDE3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLnBuZyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjJkYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTEyMTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg4NmJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmODg4Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS9mb2xkZXJPcGVuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL2ZvbGRlck9wZW4ucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzZkNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvZm9sZGVyT3Blbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuYm1wIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3ZDUwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmdpZiBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZThiNWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5qcGcgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNlYTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RhcmdldC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdGFyZ2V0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1ZDdlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvZGF0YS90YXJnZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdHJhbnNwYXJlbnQucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL2RhdGEvdHJhbnNwYXJlbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI1ZjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9kYXRhL3RyYW5zcGFyZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYThkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxZTg4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5zd3QudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIEZpbGUgd3JpdHRlbiBieSBQREUgMS4wIC0tPgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cyIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIHZlcnNpb249IjMuMS4wIj4KLQotPHJlcXVpcmVzPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UiLz4KLTwvcmVxdWlyZXM+Ci0KLTxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9InN3dHRlc3RzLmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uuc3d0LnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQyZWRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLnN3dC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIG1vcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggdGhlIC0tPgotICA8IS0tIG9yZy5lY2xpcHNlLnVpIHBsdWdpbiwgZm9yIHRlc3RpbmcuIC0tPgotCi0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7b3JnLmVjbGlwc2Uuc3d0LnRlc3RzfSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSIgdW5sZXNzPSJwZXJmb3JtYW5jZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRhdGEiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vc3d0X3NuaWZmX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2xvY2F0aW9uMX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPCEtLSBSdW4gYWxsIFNXVCB0ZXN0cyBvbiBXaW5kb3dzLCBhbmQgZWl0aGVyIENhcmJvbiB0ZXN0cyBvciBHdGsgdGVzdHMgb3RoZXJ3aXNlLiAtLT4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjbGFzcy10ZXN0cyIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5BbGxHdGtUZXN0cyI+Ci0gICAgICA8ZXF1YWxzIGFyZzE9IiR7b3N9IiBhcmcyPSJsaW51eCIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNsYXNzLXRlc3RzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LkFsbENhcmJvblRlc3RzIj4KLSAgICAgIDxlcXVhbHMgYXJnMT0iJHtvc30iIGFyZzI9Im1hY29zeCIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNsYXNzLXRlc3RzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uuc3d0LnRlc3RzLmp1bml0LkFsbFRlc3RzIj4KLSAgICAgIDxlcXVhbHMgYXJnMT0iJHtvc30iIGFyZzI9IndpbjMyIi8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2RhdGF9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9IiR7Y2xhc3MtdGVzdHN9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIHRoZSB0ZXN0cyAtLT4KLSAgPCEtLSBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPiAKLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZS1zdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InN3dC1wZXJmb3JtYW5jZS1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vc3d0X3BlcmZvcm1hbmNlX2ZvbGRlciIgLz4gCi0gICAgPGRlbGV0ZSBkaXI9IiR7c3d0LXBlcmZvcm1hbmNlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIiAvPiAKLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aW1lb3V0IiB2YWx1ZT0iMTQ0MDAwMDAiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c3d0LXBlcmZvcm1hbmNlLWZvbGRlcn0iIC8+IAotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iIC8+IAotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnN3dC50ZXN0cy5qdW5pdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RzIiAvPiAKLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZS1zdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIgLz4gCi0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+IAotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gYWZ0ZXIgYWxsIC0tPgotICA8IS0tIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLSAgCi08L3Byb2plY3Q+Cg==